mysql - 第一天

第一天 基础

1,什么是数据库? 什么是数据库管理系统? 什么是SQL? 他们之间的关系是什么?
数据库:
英文单词DataBase,简称:DB.按照一定格式存储数据的一些文件的组合.
顾名思义:是存储数据的仓库,实际上是一堆文件,这些文件存储了具有特定格式的数据.

数据库管理系统:
英文单词:DataBaseManagement,简称:DBMS.
数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行
增删改查.

常见的数据库管理系统:
MySQL /Oracle / MS SqlServer / DB2 /sybase等.....

SQL:结构化查询语言
程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成
数据库中数据的增删改查操作.

SQL是一套编程语言,可以在多个数据库中使用.

二者之间的关系是:
DBMS--执行--> SQL --操作-- DB

先安装MySQL,然后学习SQL语句,最终完成数据的管理.

2,安装MySQL:
端口号:
端口号port是任何有一个软件/应用都有的,端口是应用的唯一代表.
端口号通常和IP地址在一起,IP地址用来定位计算机,端口号port是用来定位计算机
某个服务或应用的.
在同一台计算机上,端口号不能重复,具有唯一性.

mysql数据库启动的时候,这个服务器占有的默认端口是3306
这个是大家都知道的,记住.

字符编码方式:
设置mysql数据库的字符编码方式是:UTF-8

服务名称?
默认是:MySQL
不用改.

选择配置环境变量path:
path=其他路径;C:\Program Files\MySQL\MySQL Server 8.0\bin

mysql超级管理员用户名不能改:一定是:root
需要设置mysql数据库超级管理的密码.
我们设置为root

密码设置的同时,可以激活root账户远程访问.
激活:表示root账户可以在外地登录.
不激活:表示root账户只能在本级上使用.
我这里选择激活.

3,mysql数据库的完美卸载:
第一步:双击安装包进行卸载删除.
第二步:删除目录:
C:\Program Files\MySQL
C:\Program Files (x86)\MySQL
C:\ProgramData\MySQL

这样就卸载完了.

4,看一下计算机的服务,找一下mysql在哪里
计算机-->右键-->管理-->服务和应用程序-->服务-->找mysql服务
MySQL的服务,默认是"启动"状态,只有启动了才可以用mysql.
默认情况下是:自动启动.自动启动表示下一次重启操作系统的时候自动重启该服务.

可以在服务上点击右键:
启动
重启服务
停止服务
.......

还可以改变服务的默认配置.
服务上点击右键-->属性,可以选择启动类型.
MySQL默认的端口是:3306

5,在windows操作系统上,怎么使用命令来启动和关闭mysql服务?
语法:
net stop 服务名称;
net start 服务名称;

其他服务的命令都可以使用这种方式启停.

6,mysql80安装了,服务启动了,怎么使用客户端登录mysql数据库呢?
使用bin目录下的mysql.exe命令来连接mysql数据库服务器.

本地登录(显示编写密码登录方式:):
C:\Windows\system32>mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.27 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

本地登录(隐藏编写密码登录方式:):
C:\Windows\system32>mysql -uroot -p
Enter password: *********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.27 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

7,mysql的常用命令:
1,退出:
mysql> exit 退出mysql.

2,查看mysql中有哪些数据库?
show databases;

注意:以分号结尾

+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)

mysql默认自带了4个数据库.

怎么使用那个数据库:
mysql> use mysql
Database changed
表示正在使用一个名字为:mysql的数据库.

怎么创建数据库呢?
mysql> create database zhanggangwan;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zhanggangwan       |
+--------------------+
5 rows in set (0.00 sec)

3,查看表:
show tables;

注意:以上的命令不用区分大小写.

4,查看mysql的数据库版本号:
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.27 |
+-----------+
1 row in set (0.00 sec)

5,查看当前使用的是哪个数据库?
mysql> select database();
+------------+
| database() |
+------------+
| mysql |
+------------+
1 row in set (0.00 sec)

6,mysql不见分号不执行:
mysql> show
-> databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| zhanggangwan |
+--------------------+
5 rows in set (0.00 sec)

7,\c用来终止一条sql语句的执行:
mysql> show
->
-> \c

8,数据库当中最基本的单元是表:table
    什么是表?为什么用表来存储数据呢?
        数据库当中以表格的形式代表数据.
        因为表比较直观.
    
    任何一张表都有行/列:
        行(row):被称为数据/记录
        列(column):被称为字段

            了解一下:每一个字段都有字段名,数据类型,约束等属性....

    字段名:见名知意就行.
    数据类型:字符串,日期,数字,等.
    约束:约束有很多种,其中一个叫做:唯一性约束 
    这种约束添加之后,该字段的数据不能重复.

9,关于SQL语句的分类:五种语句
    SQL的语句有很多,最好进行分门别类,这样会更好的记忆.
    分为:
        DQL:
            数据查询语言(凡是带有select关键字的都是查询语句)
            select...
        DML:
            数据操作语言(凡是对表当中的数据进行增删改的都是DML)
            insert delete update
            insert 增 insert into
            delete 删 delete from 表名 where
            update 改 update 表名 set  ** where

        DDL:
            数据定义语言(凡是带有create drop alter的都是DDL)
            DDL主要操作的是表的结构,不是表中的数据.
            create 新建
            drop 删
            alter 改
            对表结构进行操作

        TCL:
            事务控制语言
                包括:
                事务提交:commit;
                事务回滚:rollback;

        DCL:
            数据控制语言.
            例如:
                grant 授权
                revoke 撤销权限
            
10,导入以下提前准备好的数据.
    mysql> source 路径

    注意:路径中不要有中文

    注意:在管理员模式下,不能直接拖拽文件,需要在普通的模式下可以拖拽文件.

11,关于导入的这几张表
    show tables;

    dept 是部门表
    emp 是员工表
    salgrade 是工资等级表

    怎么查看表中的数据:
        select * from 表名;  //统一执行这个SQL语句.

12,不看数据,看表中的结构:
    desc 表名;
    mysql> desc servers;
    +-------------+-----------+------+-----+---------+-------+
    | Field       | Type      | Null | Key | Default | Extra |
    +-------------+-----------+------+-----+---------+-------+
    | Server_name | char(64)  | NO   | PRI |         |       |
    | Host        | char(255) | NO   |     |         |       |
    | Db          | char(64)  | NO   |     |         |       |
    | Username    | char(64)  | NO   |     |         |       |
    | Password    | char(64)  | NO   |     |         |       |
    | Port        | int       | NO   |     | 0       |       |
    | Socket      | char(64)  | NO   |     |         |       |
    | Wrapper     | char(64)  | NO   |     |         |       |
    | Owner       | char(64)  | NO   |     |         |       |
    +-------------+-----------+------+-----+---------+-------+
    9 rows in set (0.01 sec)

13,简单查询:
    1.查询一个字段:
        select 字段名 from 表名;
        其中要注意;
            select和from都是关键字.
            字段名和表名是标识符.

        强调:
            对于sql语句是通用的,
                ;是结束
                不区分大小写

    2,查询多个字段或者2个字段:
        select 字段名,字段名 from 表名;

    3,查询所有字段
        select * from 表名;

        这种方式的缺点是效率低,可读性差,开发时不建议使用.

    4,给查询的列起别名:
        使用as关键字起别名

        注意:只是将显示的查询结果列名显示为:别名,原表列名还是叫做:原来的
        select只是查询,不会修改.

        关键字可以省略吗?可以的

        假设起别名的时候,别名中有空格:
            DBMS看到这样的语句,进行编译的时候看到别名中有空格,就会报错.
            怎么解决:
                加 单引号 或者 双引号 括起来:
                        as ' '

        注意在所有的数据库当中,所有的字符串统一使用单引号括起来
        单引号是标准 双引号不标准,但是可以使用.

    5, 计算员工的年薪
         在字段之后直接用 * 12
         结论:字段可以使用数学表达式

         别名是中文,用单引号括起来
    
14,条件查询:
    1,什么是条件查询:
        不是将表中的所有数据都差出来
        将表中的某些条件找出来

    2,语法格式:
        select
            字段1,字段2,字段3
        from    
            表名
        where
            条件;

        = 等于
        查询员工工资等于800的员工

        <> 或者是 != 不等于
        查询员工工资不等于800的员工
        select empno,ename from emp where sal <> 800;

        < 小于

        > 大于

        <= 小于等于

        >= 大于等于

        between ... and ...;两个值之间, 等同于>= and <=
        select empno,ename from emp where sal >= 100 and <= 200;

        select empno,ename from emp where sal between 100 and 200;
        having
        
         is null 为null(is not null 不为空)
         查询哪些的员工津贴为null
         select empno,ename,sal from emp where comm is null;

        注意:在数据库当中null不能使用 = 来进行衡量
        因为数据库当中的null什么都没有,表示是空,所以不能使用null来进行查询.

        and 并且

        or 或者
            select
                 empno,ename,job 
            from
                emp
            where
                job = 'MANAGER' or job = 'SALESMAN';

        查询工资大于2500,并且部门编号为10或者是20的部门的员工?
            select
            * 
            from
            emp
            where
            sal >2500 and (deptno = 10 or deptno = 20);

            and 和 or同时出现,and优先级较高
            如果需要优先级高,需要加()


        in 包含,相当于多个 or (not in不在这个范围内)
            查询工作岗位是MANAGER或者是SALESMAN的员工?
                select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
                select empno,ename,job from emp where job in('MANAGER','SALESMAN'); //这个表示的是具体的工作.

                注意:in不是一个区间,in后面跟的是具体的值.

            not in表示不在这几个值


        not not 可以取非 主要用在is 或者 in中


        like  称为模糊查询,支持%或下划线匹配


        %匹配任意个字符
            %是一个特殊的符号, _也是特殊的符号

        下划线,一个下划线只能匹配一个字符

        找出名字里面含有O的?
            select ename from emp where ename like '%O%';

        找出名字中以T开始的?
            select ename from emp where ename like 'T%';
        
        找出名字中第三个字母是T的?
            select ename from emp where ename like '__T%';

15,排序
    查询所有员工的薪资,排序?
        select
            ename,sal
        from
            emp
        order by
        sal;

        默认是升序!!!!
    
    如何降序排序?
        select
            ename,sal
        from
            emp
        order by
        sal desc;

        如何升序排序?(默认是升序排列)
        select
            ename,sal
        from
            emp
        order by
        sal asc;

        可以连个字段拍讯吗?
        或者说按照多个字段排序?
        查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,在按照名字升序排列.
        select 
            ename,sal
        from
            emp
        order by
        sal asc,ename asc;  //sal在前,起主导作用,只有sal相等的时候,才会考虑ename的升序或降序.

        根据字段的位置也可以进行排序.
            select ename from emp order by 2; //2表示第二列.第二类是sal
            不过不建议这样写,因为不健壮.

    15,综合一点的案例"
        找出工资在1250到3000之间的员工信息,要求按照薪资降序排列.
        select
            ename,sal
        from
            emp
        where
            sal between 1250 and 3000
        order by
            sal  desc;

        以上语句的执行顺序必须掌握:
            第一步:from
            第二步:where
            第三部:select
            第四步:order by(排序总是在最后执行!)

    16,数据处理函数
        1,数据处理函数,又被称为为单行处理函数
        单行处理行数的特点:一个输入对应一个输出.
        和单行处理函数相对的是:多行处理函数.(多个输入对应一个输出)

        2,单行处理函数有哪些,常见的?
            lower 转换小写
                select lower(ename) from emp;

            upper 转换大写
                select upper(ename) from emp;

            substr 取子串 (substr(被截取的字符串,起始下标,截取的长度))
                select substr(ename,1,1) as ename from emp;

                注意:起始下标从1开始,没有0

            请找出员工名字第一个字母是A的员工信息?
                第一种方式:模糊查询
                    select ename from emp where ename like 'A%';

                第二种方式:substr函数
                    select
                         ename
                     from 
                        emp 
                    where 
                        substr(ename,1,1) = 'A';

            concat函数字符串拼接
                select concat(ename,ename) from emp;

            length 取长度
                select length(ename) enamelength from emp;

            trim 去空格
                select * from emp where ename = ' trim(KING');

            str_to_date 将字符串转换为日期
            date_to_str 格式化日期
            format 设置千分位

            case...when ...then..when ..then else ..end

            当什么时候怎么做,其他情况下怎么做?
                当员工的工作岗位是manager的时候,工资上调10%
                当员工的工作方位是salesman 的时候,工资上调50%

                select ename,job,sal as oldsal,
                    (case job when 'MANAGER' then sal * 1.1 when 'SALESMAN' then sal * 1.5
                    else sal end) as newsal from emp;

            round 四舍五入
                select 字段 from 表名;
                select ename from emp;

                select 'abc' from emp;  //这里的abc被当做了字面值/字面量

            结论:select后面可以跟着字段或者是字面值

                select round(1234.34,0) as result from emp;

                select round(1234.34,-1) as result from emp; //保留到十位

            rand 随机数函数
                select rand() from emp;

                select round(rand()*100,0) from emp;  //100以内的随机数

            ifnull 可以将null转换成一个具体的值
                ifnull是空处理函数,专门处理空的.
                在所有的数据库当中,如果有null,那么处理后的结果就是null.

                计算员工的年薪
                年薪= (月薪 * 月补助) * 12

                select ename,(sal+ comm) * 12 as yearsal from emp;

                注意:null只要参与运算,最终结果就一定是null,为了避免这个结果,需要使用ifnull函数.
                ifnull哈数用法:ifnull(数据,被当做是哪个值)
                    如果数据为null的时候,把这个数据结构当做哪个值.

                补助为null的时候,将补助当做0
                select 额那么,(sal + if(comm,0)) * 12 as yearsal from emp;

17,分组函数(多行处理函数)
    多行处理函数的特点是:输入多行最终输出一行.

    5个:
        count: 计数
        sum: 求和
        avg: 平均数
        max: 最大值
        min: 最小值
    
    注意:
        分组函数在使用的术后必须先进行分组,然后才能用.
        如果没有分组对数据进行分组,整张表作为一组.

    找出最高工资:
        select max(sal) from emp;

    找出最低工作:
        select min(sal) from emp;

    计算工资和:
        select sum(sal) from emp;

    计算平均工资:
        select avg(sal) from emp;

    计算工资:
        select count(sal) from emp;

    分组函数在使用的时候需要注意哪些?
        会不会自动忽略null;

    注意:
        第一点:分组函数自动忽略null,不需要提前对null进行处理.
        select count(comm) from emp;

        第二点:分组函数中conut(*) 和count(具体)字段的区别?
            count(具体字段):
                表示统计该字段下不为null的元素的总和.
            count(*):
                表示统计所有的行数.(只要有1行数据,count++)

        第三点:分组函数不能直接使用在where的子句当中.
            找出比最低工资高的工资

            select ename,sal from emp where sal > min(sal);

        第四点:所有的分组函数可以组合在一起用?

18,分组查询(非常重要 五颗星*****)
    1,什么是分组查询?
        在实际的开发中,有这样的需求,需要先对数据进行分组,然后再对每一组的数据进行操作.
        这个时候我们就需要使用到分组查询了,怎么进行分组查询?
            select
                ...
            from
                ...
            group by
                ...

    2,将之前的关键字全部组合在一起,来看一下他们的执行顺序?
        select
            ...
        from
            ...
        where
            ...
        group by
            ...
        order by
            ...

        以上的关键字执行顺序是:
            1.from
            2.where
            3.group by
            4.select
            5.order by
            
        思考:为什么分组函数不能直接使用在where后面,因为分组函数在使用的时候必须先分组之后,才可以再次使用,
            所以where后面不能使用分组函数.
            select sum(sal) from emp;
            这个可以执行的原因是select在group之后执行的.

        show databases;
        show tables;
        use mysql;
        mysql -uroot -pZzhang123
        exit
        desc servers;

        3,找出每个工作岗位的工资和?
            实现思路:按照工作岗位分组,然后对工资求和.

        select 
            job,sum(sal)
        from
            emp
        group by
            job;

        以上这个语句的执行顺序是:
            先从emp表值查询数据,
            在根据job分组进行分组.
            然后对每一组的数据进行sum(sal)

        史密斯的工资是800;
        需要对java基础以及java进阶知识进行重复学习.
        
        4,    在一条select语句当中,如果有group by语句,
            select后面只能跟:参加分组的字段,以及分组函数.
            其他的一律不能跟.

        需求:找出每个组的最大工资:
            select deptno,max(sal) from emp group by deptno;

        5,找出每个部门,不同工作岗位的最高薪资
            select ename,job,sal,deptno from emp;

            select deptno,job,max(sal) from emp group by deptno,job;

        6, 使用FF子句,对分组后的数据进行再一次的细分.
            找出每个部门的最高工资,要求显示最高工资大于3000的?
                select deptno,max(sal) from emp group by deptno having max(sal) >3000;

            思考:以上的sql语句执行效率是不是很低?
                先将大于3000的找出来,再次进行分组
                select
                    deptno,max(sal)
                from
                    emp
                where
                    sal > 3000;
                group by
                    deptno;

                having和where都可以的时候,首先使用where

        7,找出每个部门的平均工资,要求显示平均工资高于2500;
            select deptno,avg(sal) from emp group by deptno having avg(sal) > 2500;

            优化策略

大总结:
    单表的查询学完了.

    select  
        xxx
    from
        xxx
    where
        xxx
    group by
        xxx
    having 
        xxx
    order by
        xxx

    以上的关键字自只能按照这个顺序来,不能颠倒.

    执行顺序:
        1.from
        2.where
        3.group by
        4.having 
        5.select
        6.order by

    从某张表中查询数据
    先经过where筛选出有价值的数据.
    对这些有价值的数据进行分组
    分组之后可以使用having据需筛选
    select查询出来
    最后排序输出!

    综合需求:
        找出每个岗位的平均工资,要求显示平均工资大于1500的,除MANAGER之外,
        要求按照平均薪资降序排列.

        select
            deptno,avg(sal)
        from
            emp
        where
            job <> 'MANAGER'
        group by
            job
        having 
            avg(sal) > 1500
        order by
            sal asc;

posted @ 2022-11-24 11:41  zhanggw1  阅读(24)  评论(0)    收藏  举报