第八章|MySQL数据库|数据操作

数据操作

可以通过SQL语句中的DML语言来实现数据的操作,包括

  1. 使用INSERT实现数据的插入
  2. UPDATE实现数据的更新
  3. 使用DELETE实现数据的删除
  4. 使用SELECT查询数据以及。

数据的增删改查

插入数据INSERT

1. 插入完整数据(顺序插入)
    语法一:
    INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);
    语法二:
    INSERT INTO 表名 VALUES (值1,值2,值3…值n);

2. 指定字段插入数据
    语法:
    INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);

3. 插入多条记录
    语法:
    INSERT INTO 表名 VALUES
        (值1,值2,值3…值n),
        (值1,值2,值3…值n),
        (值1,值2,值3…值n);

4. 插入查询结果
    语法:
    INSERT INTO 表名(字段1,字段2,字段3…字段n)
                    SELECT (字段1,字段2,字段3…字段n) FROM 表2
                    WHERE …;
更新数据UPDATE
语法:
    UPDATE 表名 SET
        字段1=值1,
        字段2=值2,
        WHERE CONDITION;
示例:
    UPDATE mysql.user SET password=password(‘123’)
        where user=’root’ and host=’localhost’;

删除数据DELETE
语法:
    DELETE FROM 表名
        WHERE CONITION;
示例:
    DELETE FROM mysql.user
        WHERE password=’’;

练习:
    更新MySQL root用户密码为mysql123
    删除除从本地登录的root用户以外的所有用户

单表查询

单表查询

select distinct 字段1,字段2,字段3 from 库.表
    where 条件
    group by 分组条件
    having 过滤  having运行完之后不是去运行order,而是去运行distinct后边的字段,进行去重;distinct运行完之后再运行order by
    order by 排序字段
    limit n; 最后再运行limit
   

#########简单查询

mysql> use db5;
Database changed

mysql> desc employee;
+--------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-----------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sex | enum(‘male‘,‘female‘) | NO | | male | |
| age | int(3) unsigned | NO | | 28 | |
| hire_date | date | NO | | NULL | |
| post | varchar(50) | YES | | NULL | |
| post_comment | varchar(100) | YES | | NULL | |
| salary | double(15,2) | YES | | NULL | |
| office | int(11) | YES | | NULL | |
| depart_id | int(11) | YES | | NULL | |
+--------------+-----------------------+------+-----+---------+----------------+
10 rows in set (0.00 sec)

10 rows in set (0.00 sec)

mysql> select * from employee;
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 |
| 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |
| 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 |
| 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 |
| 5 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 |
| 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 |
| 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 |
| 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 |
| 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |
| 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 |
| 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 |
| 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 |
| 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 |
| 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
| 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 |
| 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 |
| 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 |
| 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
18 rows in set (0.00 sec)


mysql> select id,name,salary from employee;
+----+------------+------------+
| id | name       | salary     |
+----+------------+------------+
|  1 | egon       |    7300.33 |
|  2 | alex       | 1000000.31 |
|  3 | wupeiqi    |    8300.00 |
|  4 | yuanhao    |    3500.00 |
|  5 | liwenzhou  |    2100.00 |
|  6 | jingliyang |    9000.00 |
|  7 | jinxin     |   30000.00 |
|  8 | 成龙       |   10000.00 |
|  9 | 歪歪       |    3000.13 |
| 10 | 丫丫       |    2000.35 |
| 11 | 丁丁       |    1000.37 |
| 12 | 星星       |    3000.29 |
| 13 | 格格       |    4000.33 |
| 14 | 张野       |   10000.13 |
| 15 | 程咬金     |   20000.00 |
| 16 | 程咬银     |   19000.00 |
| 17 | 程咬铜     |   18000.00 |
| 18 | 程咬铁     |   17000.00 |
+----+------------+------------+
18 rows in set (0.00 sec)

mysql> select post from employee;
+-----------------------------------------+
| post                                    |
+-----------------------------------------+
| 老男孩驻沙河办事处外交大使              |
| teacher                                 |
| teacher                                 |
| teacher                                 |
| teacher                                 |
| teacher                                 |
| teacher                                 |
| teacher                                 |
| sale                                    |
| sale                                    |
| sale                                    |
| sale                                    |
| sale                                    |
| operation                               |
| operation                               |
| operation                               |
| operation                               |
| operation                               |
+-----------------------------------------+
18 rows in set (0.00 sec)

mysql> select distinct post from employee;  ##distinct是避免重复
+-----------------------------------------+
| post                                    |
+-----------------------------------------+
| 老男孩驻沙河办事处外交大使              |
| teacher                                 |
| sale                                    |
| operation                               |
+-----------------------------------------+
4 rows in set (0.08 sec)

mysql> select name,salary*12 from employee;  ##通过四则运算查询
+------------+-------------+
| name       | salary*12   |
+------------+-------------+
| egon       |    87603.96 |
| alex       | 12000003.72 |
| wupeiqi    |    99600.00 |
| yuanhao    |    42000.00 |
| liwenzhou  |    25200.00 |
| jingliyang |   108000.00 |
| jinxin     |   360000.00 |
| 成龙       |   120000.00 |
| 歪歪       |    36001.56 |
| 丫丫       |    24004.20 |
| 丁丁       |    12004.44 |
| 星星       |    36003.48 |
| 格格       |    48003.96 |
| 张野       |   120001.56 |
| 程咬金     |   240000.00 |
| 程咬银     |   228000.00 |
| 程咬铜     |   216000.00 |
| 程咬铁     |   204000.00 |
+------------+-------------+
18 rows in set (0.09 sec)

mysql> select name,salary*12 annual_salary from employee;
+------------+---------------+
| name       | annual_salary |
+------------+---------------+
| egon       |      87603.96 |
| alex       |   12000003.72 |
| wupeiqi    |      99600.00 |
| yuanhao    |      42000.00 |
| liwenzhou  |      25200.00 |
| jingliyang |     108000.00 |
| jinxin     |     360000.00 |
| 成龙       |     120000.00 |
| 歪歪       |      36001.56 |
| 丫丫       |      24004.20 |
| 丁丁       |      12004.44 |
| 星星       |      36003.48 |
| 格格       |      48003.96 |
| 张野       |     120001.56 |
| 程咬金     |     240000.00 |
| 程咬银     |     228000.00 |
| 程咬铜     |     216000.00 |
| 程咬铁     |     204000.00 |
+------------+---------------+
18 rows in set (0.00 sec)

mysql> select concat(‘姓名:‘, name, ‘性别:‘, sex)as info from employee;  ##concat通常用于连接字符串
+--------------------------------+
| info                           |
+--------------------------------+
| 姓名:egon性别:male             |
| 姓名:alex性别:male             |
| 姓名:wupeiqi性别:male          |
| 姓名:yuanhao性别:male          |
| 姓名:liwenzhou性别:male        |
| 姓名:jingliyang性别:female     |
| 姓名:jinxin性别:male           |
| 姓名:成龙性别:male             |
| 姓名:歪歪性别:female           |
| 姓名:丫丫性别:female           |
| 姓名:丁丁性别:female           |
| 姓名:星星性别:female           |
| 姓名:格格性别:female           |
| 姓名:张野性别:male             |
| 姓名:程咬金性别:male           |
| 姓名:程咬银性别:female         |
| 姓名:程咬铜性别:male           |
| 姓名:程咬铁性别:female         |
+--------------------------------+
18 rows in set (0.14 sec)

mysql> select concat(‘姓名:‘, name, ‘性别:‘, sex) as info, concat(‘年薪:‘, salar
y*12) as annual_salary from employee;
+--------------------------------+--------------------+
| info                           | annual_salary      |
+--------------------------------+--------------------+
| 姓名:egon性别:male             | 年薪:87603.96      |
| 姓名:alex性别:male             | 年薪:12000003.72   |
| 姓名:wupeiqi性别:male          | 年薪:99600.00      |
| 姓名:yuanhao性别:male          | 年薪:42000.00      |
| 姓名:liwenzhou性别:male        | 年薪:25200.00      |
| 姓名:jingliyang性别:female     | 年薪:108000.00     |
| 姓名:jinxin性别:male           | 年薪:360000.00     |
| 姓名:成龙性别:male             | 年薪:120000.00     |
| 姓名:歪歪性别:female           | 年薪:36001.56      |
| 姓名:丫丫性别:female           | 年薪:24004.20      |
| 姓名:丁丁性别:female           | 年薪:12004.44      |
| 姓名:星星性别:female           | 年薪:36003.48      |
| 姓名:格格性别:female           | 年薪:48003.96      |
| 姓名:张野性别:male             | 年薪:120001.56     |
| 姓名:程咬金性别:male           | 年薪:240000.00     |
| 姓名:程咬银性别:female         | 年薪:228000.00     |
| 姓名:程咬铜性别:male           | 年薪:216000.00     |
| 姓名:程咬铁性别:female         | 年薪:204000.00     |
+--------------------------------+--------------------+
18 rows in set (0.00 sec)

mysql> select * from employee;

+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 |
| 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |
| 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 |
| 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 |
| 5 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 |
| 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 |
| 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 |
| 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 |
| 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |
| 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 |
| 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 |
| 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 |
| 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 |
| 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
| 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 |
| 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 |
| 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 |
| 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+

18 rows in set (0.00 sec)

mysql> select concat(name, ‘:‘, age)from employee;
+------------------------+
| concat(name, ‘:‘, age) |
+------------------------+
| egon:18                |
| alex:78                |
| wupeiqi:81             |
| yuanhao:73             |
| liwenzhou:28           |
| jingliyang:18          |
| jinxin:18              |
| 成龙:48                |
| 歪歪:48                |
| 丫丫:38                |
| 丁丁:18                |
| 星星:18                |
| 格格:28                |
| 张野:28                |
| 程咬金:18              |
| 程咬银:18              |
| 程咬铜:18              |
| 程咬铁:18              |
+------------------------+
18 rows in set (0.00 sec)

mysql> select concat_ws(‘:‘, name, sex, age) from employee;  ##concat_ws()第一个参数为分隔符
+--------------------------------+
| concat_ws(‘:‘, name, sex, age) |
+--------------------------------+
| egon:male:18                   |
| alex:male:78                   |
| wupeiqi:male:81                |
| yuanhao:male:73                |
| liwenzhou:male:28              |
| jingliyang:female:18           |
| jinxin:male:18                 |
| 成龙:male:48                   |
| 歪歪:female:48                 |
| 丫丫:female:38                 |
| 丁丁:female:18                 |
| 星星:female:18                 |
| 格格:female:28                 |
| 张野:male:28                   |
| 程咬金:male:18                 |
| 程咬银:female:18               |
| 程咬铜:male:18                 |
| 程咬铁:female:18               |
+--------------------------------+
18 rows in set (0.00 sec)
练习:1 查出所有员工的名字,薪资,格式为
    <名字:egon>    <薪资:3000>
2 查出所有的岗位(去掉重复)
3 查出所有员工名字,以及他们的年薪,年薪的字段名为annual_year
mysql> select concat(‘<名字>:‘, name, ‘>‘)from employee;
+--------------------------------+
| concat(‘<名字>:‘, name, ‘>‘)   |
+--------------------------------+
| <名字>:egon>                   |
| <名字>:alex>                   |
| <名字>:wupeiqi>                |
| <名字>:yuanhao>                |
| <名字>:liwenzhou>              |
| <名字>:jingliyang>             |
| <名字>:jinxin>                 |
| <名字>:成龙>                   |
| <名字>:歪歪>                   |
| <名字>:丫丫>                   |
| <名字>:丁丁>                   |
| <名字>:星星>                   |
| <名字>:格格>                   |
| <名字>:张野>                   |
| <名字>:程咬金>                 |
| <名字>:程咬银>                 |
| <名字>:程咬铜>                 |
| <名字>:程咬铁>                 |
+--------------------------------+
18 rows in set (0.00 sec)

mysql> select concat(‘<名字>:‘, name, ‘>‘), concat(‘<薪资:‘, salary, ‘>‘) f
mployee;
+--------------------------------+---------------------------------+
| concat(‘<名字>:‘, name, ‘>‘)   | concat(‘<薪资:‘, salary, ‘>‘)   |
+--------------------------------+---------------------------------+
| <名字>:egon>                   | <薪资:7300.33>                  |
| <名字>:alex>                   | <薪资:1000000.31>               |
| <名字>:wupeiqi>                | <薪资:8300.00>                  |
| <名字>:yuanhao>                | <薪资:3500.00>                  |
| <名字>:liwenzhou>              | <薪资:2100.00>                  |
| <名字>:jingliyang>             | <薪资:9000.00>                  |
| <名字>:jinxin>                 | <薪资:30000.00>                 |
| <名字>:成龙>                   | <薪资:10000.00>                 |
| <名字>:歪歪>                   | <薪资:3000.13>                  |
| <名字>:丫丫>                   | <薪资:2000.35>                  |
| <名字>:丁丁>                   | <薪资:1000.37>                  |
| <名字>:星星>                   | <薪资:3000.29>                  |
| <名字>:格格>                   | <薪资:4000.33>                  |
| <名字>:张野>                   | <薪资:10000.13>                 |
| <名字>:程咬金>                 | <薪资:20000.00>                 |
| <名字>:程咬银>                 | <薪资:19000.00>                 |
| <名字>:程咬铜>                 | <薪资:18000.00>                 |
| <名字>:程咬铁>                 | <薪资:17000.00>                 |
+--------------------------------+---------------------------------+
18 rows in set (0.00 sec)

#where约束
select id,name,age from employee where id > 7; #单条件

select name,post,salary from employee where post=‘teacher‘ and salary > 8000;

select name,salary from employee where salary >= 20000 and salary <= 30000;
select name,salary from employee where salary between 20000 and 30000;

select name,salary from employee where salary < 20000 or salary > 30000;
select name,salary from employee where salary not between 20000 and 30000;

select * from employee where age = 73 or age = 81 or age = 28;
select * from employee where age in (73,81,28);

select * from employee where post_comment is Null; #判断是否为空
select * from employee where post_comment is not Null;

select * from employee where name like "jin%"; #模糊匹配 %代表任意多个字符,jin开头的不管后边是什么
select * from employee where name like "jin___";  ##___三个下划线代表3个任意字符
mysql> select id,name,age from employee where id > 7;
+----+-----------+-----+
| id | name      | age |
+----+-----------+-----+
|  8 | 成龙      |  48 |
|  9 | 歪歪      |  48 |
| 10 | 丫丫      |  38 |
| 11 | 丁丁      |  18 |
| 12 | 星星      |  18 |
| 13 | 格格      |  28 |
| 14 | 张野      |  28 |
| 15 | 程咬金    |  18 |
| 16 | 程咬银    |  18 |
| 17 | 程咬铜    |  18 |
| 18 | 程咬铁    |  18 |
+----+-----------+-----+
11 rows in set (0.13 sec)

mysql> select name,post,salary from employee where post=‘teacher‘ and salary > 8
000;
+------------+---------+------------+
| name       | post    | salary     |
+------------+---------+------------+
| alex       | teacher | 1000000.31 |
| wupeiqi    | teacher |    8300.00 |
| jingliyang | teacher |    9000.00 |
| jinxin     | teacher |   30000.00 |
| 成龙       | teacher |   10000.00 |
+------------+---------+------------+
5 rows in set (0.04 sec)

mysql> select name,salary from employee where salary >=20000 and salary <=30000;

+-----------+----------+
| name      | salary   |
+-----------+----------+
| jinxin    | 30000.00 |
| 程咬金    | 20000.00 |
+-----------+----------+
2 rows in set (0.00 sec)

mysql> select name,salary from employee where salary between 20000 and 30000;
+-----------+----------+
| name      | salary   |
+-----------+----------+
| jinxin    | 30000.00 |
| 程咬金    | 20000.00 |
+-----------+----------+
2 rows in set (0.07 sec)

mysql> select name,salary from employee where salary < 20000 or salary > 30000;
+------------+------------+
| name       | salary     |
+------------+------------+
| egon       |    7300.33 |
| alex       | 1000000.31 |
| wupeiqi    |    8300.00 |
| yuanhao    |    3500.00 |
| liwenzhou  |    2100.00 |
| jingliyang |    9000.00 |
| 成龙       |   10000.00 |
| 歪歪       |    3000.13 |
| 丫丫       |    2000.35 |
| 丁丁       |    1000.37 |
| 星星       |    3000.29 |
| 格格       |    4000.33 |
| 张野       |   10000.13 |
| 程咬银     |   19000.00 |
| 程咬铜     |   18000.00 |
| 程咬铁     |   17000.00 |
+------------+------------+
16 rows in set (0.01 sec)

mysql> select name,salary from employee where salary not between 20000 and 30000
;
+------------+------------+
| name       | salary     |
+------------+------------+
| egon       |    7300.33 |
| alex       | 1000000.31 |
| wupeiqi    |    8300.00 |
| yuanhao    |    3500.00 |
| liwenzhou  |    2100.00 |
| jingliyang |    9000.00 |
| 成龙       |   10000.00 |
| 歪歪       |    3000.13 |
| 丫丫       |    2000.35 |
| 丁丁       |    1000.37 |
| 星星       |    3000.29 |
| 格格       |    4000.33 |
| 张野       |   10000.13 |
| 程咬银     |   19000.00 |
| 程咬铜     |   18000.00 |
| 程咬铁     |   17000.00 |
+------------+------------+
16 rows in set (0.00 sec)

mysql> select * from employee where age =73 or age = 81 or age = 28;

+----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+
| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
+----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+
| 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 |
| 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 |
| 5 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 |
| 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 |
| 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
+----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+

5 rows in set (0.00 sec)

mysql> select * from employee where post_comment is Null;

+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 |
| 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |
| 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 |
| 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 |
| 5 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 |
| 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 |
| 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 |
| 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 |
| 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |
| 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 |
| 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 |
| 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 |
| 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 |
| 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
| 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 |
| 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 |
| 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 |
| 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+

18 rows in set (0.00 sec)

mysql> select * from employee where name like "jin%";
+----+------------+--------+-----+------------+---------+--------------+--------
--+--------+-----------+
| id | name       | sex    | age | hire_date  | post    | post_comment | salary
  | office | depart_id |
+----+------------+--------+-----+------------+---------+--------------+--------
--+--------+-----------+
|  6 | jingliyang | female |  18 | 2011-02-11 | teacher | NULL         |  9000.0
0 |    401 |         1 |
|  7 | jinxin     | male   |  18 | 1900-03-01 | teacher | NULL         | 30000.0
0 |    401 |         1 |
+----+------------+--------+-----+------------+---------+--------------+--------
--+--------+-----------+
2 rows in set (0.09 sec)

mysql> select * from employee where name like "jin___";
+----+--------+------+-----+------------+---------+--------------+----------+---
-----+-----------+
| id | name   | sex  | age | hire_date  | post    | post_comment | salary   | of
fice | depart_id |
+----+--------+------+-----+------------+---------+--------------+----------+---
-----+-----------+
|  7 | jinxin | male |  18 | 1900-03-01 | teacher | NULL         | 30000.00 |
 401 |         1 |
+----+--------+------+-----+------------+---------+--------------+----------+---
-----+-----------+
1 row in set (0.00 sec)
group by 分组查询

#group by分组 在where之后运行分组就是按照相应字段进行归类,每后边那个字就是要分的字段
mysql> set global sql_mode="ONLY_FULL_GROUP_BY";
分组之后,只能取分组的字段,以及每个组 聚合的结果

select post from employee group by post;
单独使用GROUP BY关键字分组
    SELECT post FROM employee GROUP BY post;
    注意:我们按照post字段分组,那么select查询的字段只能是post,想要获取组内的其他相关信息,需要借助函数

GROUP BY关键字和GROUP_CONCAT()函数一起使用
    SELECT post,GROUP_CONCAT(name) FROM employee GROUP BY post;#按照岗位分组,并查看组内成员名
    SELECT post,GROUP_CONCAT(name) as emp_members FROM employee GROUP BY post;

GROUP BY与聚合函数一起使用
    select post,count(id) as count from employee group by post;#按照岗位分组,并查看每个组有多少人
 

#聚合函数 #以组为单位进行统计,不再考虑个人
  max
  min
  avg
  sum
  count

select post,count(id) as emp_count from employee group by post;##每个部门/职位有多少个员工;先确定你的表
select post,max(salary) as emp_max from employee group by post;
select post,min(salary) as emp_min from employee group by post;
select post,avg(salary) as emp_avg from employee group by post;
select post,sum(age) as emp_sum from employee group by post;
mysql> select * from employee group by post;

+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
| 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |
| 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |
| 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 |
+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+

4 rows in set (0.08 sec)
#由于没有设置ONLY_FULL_GROUP_BY,于是也可以有结果,默认都是组内的第一条记录,但其实这是没有意义的
mysql> set global sql_mode="ONLY_FULL_GROUP_BY";
Query OK, 0 rows affected (0.11 sec)

mysql> exit
Bye

C:\Users\Administrator>mysql -uroot -p;
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: Y
ES)

C:\Users\Administrator>mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

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.

mysql> use db5;
Database changed
mysql> select * from employee group by post;
ERROR 1055 (42000): ‘db5.employee.id‘ isn‘t in GROUP BY
mysql> select post from employee group by post;
+-----------------------------------------+
| post                                    |
+-----------------------------------------+
| operation                               |
| sale                                    |
| teacher                                 |
| 老男孩驻沙河办事处外交大使              |
+-----------------------------------------+
4 rows in set (0.00 sec)

mysql> select post,count(id) as emp_count from employee group by post;
+-----------------------------------------+-----------+
| post                                    | emp_count |
+-----------------------------------------+-----------+
| operation                               |         5 |
| sale                                    |         5 |
| teacher                                 |         7 |
| 老男孩驻沙河办事处外交大使              |         1 |
+-----------------------------------------+-----------+
4 rows in set (0.06 sec)
强调:如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义
多条记录之间的某个字段值相同,该字段通常用来作为分组的依据
#没有group by则默认整体算作一组
select max(salary) from employee; #取所有员工的最高工资

#group_concat  职位包含的所有员工成员的名字
select post,group_concat(name) from employee group by post;
mysql> select max(salary) from employee;
+-------------+
| max(salary) |
+-------------+
|  1000000.31 |
+-------------+
1 row in set (0.07 sec)

mysql> select post,group_concat(name) from employee group by post;
+-----------------------------------------+-------------------------------------
--------------------+
| post                                    | group_concat(name)
                    |
+-----------------------------------------+-------------------------------------
--------------------+
| operation                               | 程咬铁,程咬铜,程咬银,程咬金,张野
                    |
| sale                                    | 格格,星星,丁丁,丫丫,歪歪
                    |
| teacher                                 | 成龙,jinxin,jingliyang,liwenzhou,yua
nhao,wupeiqi,alex   |
| 老男孩驻沙河办事处外交大使              | egon
                    |
+-----------------------------------------+-------------------------------------
--------------------+
4 rows in set (0.01 sec)

#练习:
1. 查询岗位名以及岗位包含的所有员工名字  #先确定你查的是哪张表,有没有过滤条件where,有没有分组分类的;
2. 先取出年龄在50以上的然后再 查询岗位名以及各岗位内包含的员工个数
3. 查询公司内男员工和女员工的个数
4. 查询岗位名以及各岗位的平均薪资
5. 查询岗位名以及各岗位的最高薪资
6. 查询岗位名以及各岗位的最低薪资
7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
select post,group_concat(name) from employee group by post;

select post,count(id) from employee where age > 50 group by post;

select sex,count(id) from employee group by sex;

select sex,avg(salary) from employee group by sex;
mysql> select post,group_concat(name) from  employee group by post;
+-----------------------------------------+------------------------------------
--------------------+
| post                                    | group_concat(name)
                    |
+-----------------------------------------+------------------------------------
--------------------+
| operation                               | 程咬铁,程咬铜,程咬银,程咬金,张野
                    |
| sale                                    | 格格,星星,丁丁,丫丫,歪歪
                    |
| teacher                                 | 成龙,jinxin,jingliyang,liwenzhou,yu
nhao,wupeiqi,alex   |
| 老男孩驻沙河办事处外交大使              | egon
                    |
+-----------------------------------------+------------------------------------
--------------------+
4 rows in set (0.00 sec)

mysql> select post,count(id) from employee where age >50 group by post;
+---------+-----------+
| post    | count(id) |
+---------+-----------+
| teacher |         3 |
+---------+-----------+
1 row in set (0.00 sec)

mysql> select sex,count(id) from employee group by sex;
+--------+-----------+
| sex    | count(id) |
+--------+-----------+
| male   |        10 |
| female |         8 |
+--------+-----------+
2 rows in set (0.00 sec)

mysql> select sex,avg(salary) from employee group by sex;
+--------+---------------+
| sex    | avg(salary)   |
+--------+---------------+
| male   | 110920.077000 |
| female |   7250.183750 |
+--------+---------------+
2 rows in set (0.00 sec)


#having 过滤条件 在分组之后进行;where在分组之前
例如:
1. 查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数  #聚合出员工个数
3. 查询各岗位平均薪资大于10000的岗位名、平均工资
4. 查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资  and avg(salary) < 20000;
select post,group_concat(name),count(id) from employee group by post;

select post,group_concat(name),count(id) from employee group by post having count(id) < 2;

select post,avg(salary) from employee group by post having avg(salary) > 10000;
mysql> select post,group_concat(name), count(id) from employee group by post;
+-----------------------------------------+-------------------------------------
--------------------+-----------+
| post                                    | group_concat(name)
                    | count(id) |
+-----------------------------------------+-------------------------------------
--------------------+-----------+
| operation                               | 程咬铁,程咬铜,程咬银,程咬金,张野
                    |         5 |
| sale                                    | 格格,星星,丁丁,丫丫,歪歪
                    |         5 |
| teacher                                 | 成龙,jinxin,jingliyang,liwenzhou,yua
nhao,wupeiqi,alex   |         7 |
| 老男孩驻沙河办事处外交大使              | egon
                    |         1 |
+-----------------------------------------+-------------------------------------
--------------------+-----------+
4 rows in set (0.00 sec)

mysql> select post,group_concat(name),count(id) from employee group by post havi
ng count(id) < 2;
+-----------------------------------------+--------------------+-----------+
| post                                    | group_concat(name) | count(id) |
+-----------------------------------------+--------------------+-----------+
| 老男孩驻沙河办事处外交大使              | egon               |         1 |
+-----------------------------------------+--------------------+-----------+
1 row in set (0.01 sec)

mysql> select post,avg(salary) from employee group by post having avg(salary) >
    -> \c
mysql> select post, avg(salary) from employee group by post having avg(salary) >
 10000 and avg(salary) < 20000;
+-----------+--------------+
| post      | avg(salary)  |
+-----------+--------------+
| operation | 16800.026000 |
+-----------+--------------+
1 row in set (0.00 sec)

#order by  默认就是升序
select * from employee order by age asc; #升序,不加asc也可以
select * from employee order by age desc; #降序

select * from employee order by age asc,id desc; #先按照age升序排,如果age相同则按照id降序排;

聚合函数不能用在where内;分完组之后才能用聚合函数,having可以用;select max(salary) from employee 这里边运行max的时候就已经分组了; 先找表,再where再分组,...最后才打印select你想打印的内容
select distinct post,count(id) as emp_count from employee
    where salary > 1000
    group by post
    having count(id) > 1 #在这个位置不能用emp_count>1,因为运行having之前还没运行distinct这个字段呢
    order by emp_count desc  #可以用count(id),它是在分组之后干的;emp_count也可以用,因为order by 是在distinct后边运行;
    ;
mysql> select * from employee order by age asc, id desc;
+----+------------+--------+-----+------------+---------------------------------
--------+--------------+------------+--------+-----------+
| id | name       | sex    | age | hire_date  | post
        | post_comment | salary     | office | depart_id |
+----+------------+--------+-----+------------+---------------------------------
--------+--------------+------------+--------+-----------+
| 18 | 程咬铁     | female |  18 | 2014-05-12 | operation
        | NULL         |   17000.00 |    403 |         3 |
| 17 | 程咬铜     | male   |  18 | 2015-04-11 | operation
        | NULL         |   18000.00 |    403 |         3 |
| 16 | 程咬银     | female |  18 | 2013-03-11 | operation
        | NULL         |   19000.00 |    403 |         3 |
| 15 | 程咬金     | male   |  18 | 1997-03-12 | operation
        | NULL         |   20000.00 |    403 |         3 |
| 12 | 星星       | female |  18 | 2016-05-13 | sale
        | NULL         |    3000.29 |    402 |         2 |
| 11 | 丁丁       | female |  18 | 2011-03-12 | sale
        | NULL         |    1000.37 |    402 |         2 |
|  7 | jinxin     | male   |  18 | 1900-03-01 | teacher
        | NULL         |   30000.00 |    401 |         1 |
|  6 | jingliyang | female |  18 | 2011-02-11 | teacher
        | NULL         |    9000.00 |    401 |         1 |
|  1 | egon       | male   |  18 | 2017-03-01 | 老男孩驻沙河办事处外交大使
        | NULL         |    7300.33 |    401 |         1 |
| 14 | 张野       | male   |  28 | 2016-03-11 | operation
        | NULL         |   10000.13 |    403 |         3 |
| 13 | 格格       | female |  28 | 2017-01-27 | sale
        | NULL         |    4000.33 |    402 |         2 |
|  5 | liwenzhou  | male   |  28 | 2012-11-01 | teacher
        | NULL         |    2100.00 |    401 |         1 |
| 10 | 丫丫       | female |  38 | 2010-11-01 | sale
        | NULL         |    2000.35 |    402 |         2 |
|  9 | 歪歪       | female |  48 | 2015-03-11 | sale
        | NULL         |    3000.13 |    402 |         2 |
|  8 | 成龙       | male   |  48 | 2010-11-11 | teacher
        | NULL         |   10000.00 |    401 |         1 |
|  4 | yuanhao    | male   |  73 | 2014-07-01 | teacher
        | NULL         |    3500.00 |    401 |         1 |
|  2 | alex       | male   |  78 | 2015-03-02 | teacher
        | NULL         | 1000000.31 |    401 |         1 |
|  3 | wupeiqi    | male   |  81 | 2013-03-05 | teacher
        | NULL         |    8300.00 |    401 |         1 |
+----+------------+--------+-----+------------+---------------------------------
--------+--------------+------------+--------+-----------+
18 rows in set (0.00 sec)

mysql> select distinct post, count(id) as emp_count from employee
    -> where salary > 1000
    -> group by post
    -> having count(id) > 1
    -> order by emp_count desc;
+-----------+-----------+
| post      | emp_count |
+-----------+-----------+
| teacher   |         7 |
| sale      |         5 |
| operation |         5 |
+-----------+-----------+
3 rows in set (0.00 sec)

#limit限制打印条数
select * from employee limit 3;
select * from employee order by salary desc limit 1; #找工资最高的那个人的详细信息

select * from employee limit 0,5; #从0开始往后再取5个;基本的分页功能
select * from employee limit 5,5;
select * from employee limit 10,5;
select * from employee limit 15,5;
mysql> select * from employee limit 3;
+----+---------+------+-----+------------+--------------------------------------
---+--------------+------------+--------+-----------+
| id | name    | sex  | age | hire_date  | post
   | post_comment | salary     | office | depart_id |
+----+---------+------+-----+------------+--------------------------------------
---+--------------+------------+--------+-----------+
|  1 | egon    | male |  18 | 2017-03-01 | 老男孩驻沙河办事处外交大使
   | NULL         |    7300.33 |    401 |         1 |
|  2 | alex    | male |  78 | 2015-03-02 | teacher
   | NULL         | 1000000.31 |    401 |         1 |
|  3 | wupeiqi | male |  81 | 2013-03-05 | teacher
   | NULL         |    8300.00 |    401 |         1 |
+----+---------+------+-----+------------+--------------------------------------
---+--------------+------------+--------+-----------+
3 rows in set (0.00 sec)

mysql> select * from employee order by salary desc limit 1;
+----+------+------+-----+------------+---------+--------------+------------+---
-----+-----------+
| id | name | sex  | age | hire_date  | post    | post_comment | salary     | of
fice | depart_id |
+----+------+------+-----+------------+---------+--------------+------------+---
-----+-----------+
|  2 | alex | male |  78 | 2015-03-02 | teacher | NULL         | 1000000.31 |
 401 |         1 |
+----+------+------+-----+------------+---------+--------------+------------+---
-----+-----------+
1 row in set (0.00 sec)

mysql> select * from employee limit 0,5;
+----+-----------+------+-----+------------+------------------------------------
-----+--------------+------------+--------+-----------+
| id | name      | sex  | age | hire_date  | post
     | post_comment | salary     | office | depart_id |
+----+-----------+------+-----+------------+------------------------------------
-----+--------------+------------+--------+-----------+
|  1 | egon      | male |  18 | 2017-03-01 | 老男孩驻沙河办事处外交大使
     | NULL         |    7300.33 |    401 |         1 |
|  2 | alex      | male |  78 | 2015-03-02 | teacher
     | NULL         | 1000000.31 |    401 |         1 |
|  3 | wupeiqi   | male |  81 | 2013-03-05 | teacher
     | NULL         |    8300.00 |    401 |         1 |
|  4 | yuanhao   | male |  73 | 2014-07-01 | teacher
     | NULL         |    3500.00 |    401 |         1 |
|  5 | liwenzhou | male |  28 | 2012-11-01 | teacher
     | NULL         |    2100.00 |    401 |         1 |
+----+-----------+------+-----+------------+------------------------------------
-----+--------------+------------+--------+-----------+
5 rows in set (0.00 sec)


#总结:
    语法顺序:
        select distinct 字段1,字段2,字段3 from 库.表
            where 条件
            group by 分组条件
            having 过滤
            order by 排序字段
            limit n;

    执行顺序:

def from(db,table):
        f=open(r‘%s\%s‘ %(db,table)) #打开文件
        return f #返回文件对象

def where(condition,f):
    for line in f:
        if condition:
            yield line #满足条件再返回,不停地返回

def group(lines): #分组
    pass

def having(group_res): #分组,拿到分组的结果
    pass

def distinct(having_res): #拿到having_res的结果
    pass

def order(distinct_res): #拿到distinct_res的结果
    pass

def limit(order_res) #
    pass

def select():
    f=from(‘db1‘,‘t1‘)  #找表
    lines=where(‘id>3‘,f)
    group_res=group(lines)
    having_res=having(group_res)
    distinct_res=distinct(having_res)
    order_res=order(distinct_res)
    res=limit(order_res)
    print(res)
    return res #返回值

#正则表达式 查询
select * from employee where name like ‘jin%‘;
select * from employee where name regexp ‘^jin‘;  #以什么开头^
select * from employee where name regexp ‘^jin.*(g|n)$‘; # .*()以什么结尾 ,以g或者n结尾
mysql> select * from employee where name regexp ‘^jin‘;
+----+------------+--------+-----+------------+---------+--------------+--------
--+--------+-----------+
| id | name       | sex    | age | hire_date  | post    | post_comment | salary
  | office | depart_id |
+----+------------+--------+-----+------------+---------+--------------+--------
--+--------+-----------+
|  6 | jingliyang | female |  18 | 2011-02-11 | teacher | NULL         |  9000.0
0 |    401 |         1 |
|  7 | jinxin     | male   |  18 | 1900-03-01 | teacher | NULL         | 30000.0
0 |    401 |         1 |
+----+------------+--------+-----+------------+---------+--------------+--------
--+--------+-----------+
2 rows in set (0.07 sec)

mysql> select * from employee where name regexp ‘^jin.*(g|n)$‘;
+----+------------+--------+-----+------------+---------+--------------+--------
--+--------+-----------+
| id | name       | sex    | age | hire_date  | post    | post_comment | salary
  | office | depart_id |
+----+------------+--------+-----+------------+---------+--------------+--------
--+--------+-----------+
|  6 | jingliyang | female |  18 | 2011-02-11 | teacher | NULL         |  9000.0
0 |    401 |         1 |
|  7 | jinxin     | male   |  18 | 1900-03-01 | teacher | NULL         | 30000.0
0 |    401 |         1 |
+----+------------+--------+-----+------------+---------+--------------+--------
--+--------+-----------+
2 rows in set (0.00 sec)

多表查询

把有关系的表连接合到一起

内连接:只取两张表的共同部分
select * from employee inner join department on employee.dep_id = department.id ;

左连接:在内连接的基础上保留左表的记录
select * from employee left join department on employee.dep_id = department.id ;

右连接:在内连接的基础上保留右表的记录
select * from employee right join department on employee.dep_id = department.id ;

全外连接:在内连接的基础上保留左右两表没有对应关系的记录
select * from employee full join department on employee.dep_id = department.id ; #mysql不支持full join

select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id ;

笛卡尔积;在笛卡尔积的基础之中对表进行筛选,where,这就是连接;不要用where干,它是过滤的,有专门的方法

mysql> create database db6;
Query OK, 1 row affected (0.01 sec)

mysql> use db6;
Database changed
mysql> create table department(
    -> id int,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.78 sec)

mysql> create table employee(
    -> id int primary key auto_increment,
    -> name varchar(20),
    -> sex enum(‘male‘,‘female‘) not null default ‘male‘,
    -> age int,
    -> dep_id int
    -> );
Query OK, 0 rows affected (1.05 sec)

mysql> insert into department values
    -> (200,‘技术‘),
    -> (201,‘人力资源‘),
    -> (202,‘销售‘),
    -> (203,‘运营‘);
Query OK, 4 rows affected (0.19 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> insert into employee(name,sex,age,dep_id) values
    -> (‘egon‘,‘male‘,18,200),
    -> (‘alex‘,‘female‘,48,201),
    -> (‘wupeiqi‘,‘male‘,38,201),
    -> (‘yuanhao‘,‘female‘,28,202),
    -> (‘liwenzhou‘,‘male‘,18,200),
    -> (‘jingliyang‘,‘female‘,18,204)
    -> ;
Query OK, 6 rows affected (0.15 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from employ;
ERROR 1146 (42S02): Table ‘db6.employ‘ doesn‘t exist
mysql> select * from department;
+------+--------------+
| id   | name         |
+------+--------------+
|  200 | 技术         |
|  201 | 人力资源     |
|  202 | 销售         |
|  203 | 运营         |
+------+--------------+
4 rows in set (0.00 sec)

mysql> select * from employee;
+----+------------+--------+------+--------+
| id | name       | sex    | age  | dep_id |
+----+------------+--------+------+--------+
|  1 | egon       | male   |   18 |    200 |
|  2 | alex       | female |   48 |    201 |
|  3 | wupeiqi    | male   |   38 |    201 |
|  4 | yuanhao    | female |   28 |    202 |
|  5 | liwenzhou  | male   |   18 |    200 |
|  6 | jingliyang | female |   18 |    204 |
+----+------------+--------+------+--------+
6 rows in set (0.00 sec)

mysql> select * from employee,department;
+----+------------+--------+------+--------+------+--------------+
| id | name       | sex    | age  | dep_id | id   | name         |
+----+------------+--------+------+--------+------+--------------+
|  1 | egon       | male   |   18 |    200 |  200 | 技术         |
|  1 | egon       | male   |   18 |    200 |  201 | 人力资源     |
|  1 | egon       | male   |   18 |    200 |  202 | 销售         |
|  1 | egon       | male   |   18 |    200 |  203 | 运营         |
|  2 | alex       | female |   48 |    201 |  200 | 技术         |
|  2 | alex       | female |   48 |    201 |  201 | 人力资源     |
|  2 | alex       | female |   48 |    201 |  202 | 销售         |
|  2 | alex       | female |   48 |    201 |  203 | 运营         |
|  3 | wupeiqi    | male   |   38 |    201 |  200 | 技术         |
|  3 | wupeiqi    | male   |   38 |    201 |  201 | 人力资源     |
|  3 | wupeiqi    | male   |   38 |    201 |  202 | 销售         |
|  3 | wupeiqi    | male   |   38 |    201 |  203 | 运营         |
|  4 | yuanhao    | female |   28 |    202 |  200 | 技术         |
|  4 | yuanhao    | female |   28 |    202 |  201 | 人力资源     |
|  4 | yuanhao    | female |   28 |    202 |  202 | 销售         |
|  4 | yuanhao    | female |   28 |    202 |  203 | 运营         |
|  5 | liwenzhou  | male   |   18 |    200 |  200 | 技术         |
|  5 | liwenzhou  | male   |   18 |    200 |  201 | 人力资源     |
|  5 | liwenzhou  | male   |   18 |    200 |  202 | 销售         |
|  5 | liwenzhou  | male   |   18 |    200 |  203 | 运营         |
|  6 | jingliyang | female |   18 |    204 |  200 | 技术         |
|  6 | jingliyang | female |   18 |    204 |  201 | 人力资源     |
|  6 | jingliyang | female |   18 |    204 |  202 | 销售         |
|  6 | jingliyang | female |   18 |    204 |  203 | 运营         |
+----+------------+--------+------+--------+------+--------------+
24 rows in set (0.07 sec)

mysql> select * from employee inner join department on employee.dep_id = department.id ;
+----+-----------+--------+------+--------+------+--------------+
| id | name      | sex    | age  | dep_id | id   | name         |
+----+-----------+--------+------+--------+------+--------------+
|  1 | egon      | male   |   18 |    200 |  200 | 技术         |
|  2 | alex      | female |   48 |    201 |  201 | 人力资源     |
|  3 | wupeiqi   | male   |   38 |    201 |  201 | 人力资源     |
|  4 | yuanhao   | female |   28 |    202 |  202 | 销售         |
|  5 | liwenzhou | male   |   18 |    200 |  200 | 技术         |
+----+-----------+--------+------+--------+------+--------------+
5 rows in set (0.00 sec)

mysql> select * from employee left join department on employee.dep_id = department.id ;
+----+------------+--------+------+--------+------+--------------+
| id | name       | sex    | age  | dep_id | id   | name         |
+----+------------+--------+------+--------+------+--------------+
|  1 | egon       | male   |   18 |    200 |  200 | 技术         |
|  5 | liwenzhou  | male   |   18 |    200 |  200 | 技术         |
|  2 | alex       | female |   48 |    201 |  201 | 人力资源     |
|  3 | wupeiqi    | male   |   38 |    201 |  201 | 人力资源     |
|  4 | yuanhao    | female |   28 |    202 |  202 | 销售         |
|  6 | jingliyang | female |   18 |    204 | NULL | NULL         |
+----+------------+--------+------+--------+------+--------------+
6 rows in set (0.00 sec)

mysql> select * from employee right join department on employee.dep_id = department.id ;
+------+-----------+--------+------+--------+------+--------------+
| id   | name      | sex    | age  | dep_id | id   | name         |
+------+-----------+--------+------+--------+------+--------------+
|    1 | egon      | male   |   18 |    200 |  200 | 技术         |
|    2 | alex      | female |   48 |    201 |  201 | 人力资源     |
|    3 | wupeiqi   | male   |   38 |    201 |  201 | 人力资源     |
|    4 | yuanhao   | female |   28 |    202 |  202 | 销售         |
|    5 | liwenzhou | male   |   18 |    200 |  200 | 技术         |
| NULL | NULL      | NULL   | NULL |   NULL |  203 | 运营         |
+------+-----------+--------+------+--------+------+--------------+
6 rows in set (0.00 sec)

mysql> select * from employee left join department on employee.dep_id = department.id
    -> union
    -> select * from employee right join department on employee.dep_id = department.id;
+------+------------+--------+------+--------+------+--------------+
| id   | name       | sex    | age  | dep_id | id   | name         |
+------+------------+--------+------+--------+------+--------------+
|    1 | egon       | male   |   18 |    200 |  200 | 技术         |
|    5 | liwenzhou  | male   |   18 |    200 |  200 | 技术         |
|    2 | alex       | female |   48 |    201 |  201 | 人力资源     |
|    3 | wupeiqi    | male   |   38 |    201 |  201 | 人力资源     |
|    4 | yuanhao    | female |   28 |    202 |  202 | 销售         |
|    6 | jingliyang | female |   18 |    204 | NULL | NULL         |
| NULL | NULL       | NULL   | NULL |   NULL |  203 | 运营         |
+------+------------+--------+------+--------+------+--------------+
7 rows in set (0.11 sec)

 

#查询平均年龄大于30岁的部门名

select * from employee inner join department on employee.dep_id = department.id;

select department.name,avg(age) from employee inner join department on employee.dep_id = department.id

  group by department.name

  having avg(age) > 30;

mysql> desc employee;
+--------+-----------------------+------+-----+---------+----------------+
| Field  | Type                  | Null | Key | Default | Extra          |
+--------+-----------------------+------+-----+---------+----------------+
| id     | int(11)               | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20)           | YES  |     | NULL    |                |
| sex    | enum(‘male‘,‘female‘) | NO   |     | male    |                |
| age    | int(11)               | YES  |     | NULL    |                |
| dep_id | int(11)               | YES  |     | NULL    |                |
+--------+-----------------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql> desc department;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> select department.name,avg(age) from employee inner join department on employee.dep_id = depa
rtment.id;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illeg
al if there is no GROUP BY clause
mysql> select * from employee inner join department on employee.dep_id = department.id;
+----+-----------+--------+------+--------+------+--------------+
| id | name      | sex    | age  | dep_id | id   | name         |
+----+-----------+--------+------+--------+------+--------------+
|  1 | egon      | male   |   18 |    200 |  200 | 技术         |
|  2 | alex      | female |   48 |    201 |  201 | 人力资源     |
|  3 | wupeiqi   | male   |   38 |    201 |  201 | 人力资源     |
|  4 | yuanhao   | female |   28 |    202 |  202 | 销售         |
|  5 | liwenzhou | male   |   18 |    200 |  200 | 技术         |
+----+-----------+--------+------+--------+------+--------------+
5 rows in set (0.00 sec)

mysql> select department.name,avg(age) from employee inner join department on employee.dep_id = depa
rtment.id
    -> group by department.name
    -> having avg(age) > 30;
+--------------+----------+
| name         | avg(age) |
+--------------+----------+
| 人力资源     |  43.0000 |
+--------------+----------+
1 row in set (0.00 sec)

SELECT语句关键字执行优先级

http://www.cnblogs.com/linhaifeng/articles/7372774.html

子查询

http://www.cnblogs.com/linhaifeng/articles/7267596.html

#1:子查询是将一个查询语句嵌套在另一个查询语句中。
#2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
#3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
#4:还可以包含比较运算符:= 、 !=、> 、<等

1、带IN关键字的子查询

查询平均年龄在25岁以上的部门名

select dep_id from employee

  group by dep_id

  having avg(age) > 25;

mysql> select * from employee;
+----+------------+--------+------+--------+
| id | name       | sex    | age  | dep_id |
+----+------------+--------+------+--------+
|  1 | egon       | male   |   18 |    200 |
|  2 | alex       | female |   48 |    201 |
|  3 | wupeiqi    | male   |   38 |    201 |
|  4 | yuanhao    | female |   28 |    202 |
|  5 | liwenzhou  | male   |   18 |    200 |
|  6 | jingliyang | female |   18 |    204 |
+----+------------+--------+------+--------+
6 rows in set (0.00 sec)

mysql> select dep_id from employee
    -> group by dep_id
    -> having avg(age) > 25;
+--------+
| dep_id |
+--------+
|    201 |
|    202 |
+--------+
2 rows in set (0.00 sec)

mysql> select * from department;
+------+--------------+
| id   | name         |
+------+--------------+
|  200 | 技术         |
|  201 | 人力资源     |
|  202 | 销售         |
|  203 | 运营         |
+------+--------------+
4 rows in set (0.00 sec)

mysql> select name from department where id in
    -> (select dep_id from employee
    -> group by dep_id
    -> having avg(age) > 25);
+--------------+
| name         |
+--------------+
| 人力资源     |
| 销售         |
+--------------+
2 rows in set (0.11 sec)

查看技术部员工姓名 #两种表

select * from employee where dep_id = (

select id from department where name = "技术");

查看不足1人(not >=1)的部门名

select name from department where id not in (

select distinct dep_id from employee);

mysql> select id from department where name = "技术";
+------+
| id   |
+------+
|  200 |
+------+
1 row in set (0.00 sec)

mysql> select * from employee where dep_id = (
    ->
    -> select id from department where name = "技术");
+----+-----------+------+------+--------+
| id | name      | sex  | age  | dep_id |
+----+-----------+------+------+--------+
|  1 | egon      | male |   18 |    200 |
|  5 | liwenzhou | male |   18 |    200 |
+----+-----------+------+------+--------+
2 rows in set (0.00 sec)

mysql> select name from employee where dep_id = (
    -> select id from department where name = "技术");
+-----------+
| name      |
+-----------+
| egon      |
| liwenzhou |
+-----------+
2 rows in set (0.00 sec)

mysql>
mysql>
mysql> select * from employee;
+----+------------+--------+------+--------+
| id | name       | sex    | age  | dep_id |
+----+------------+--------+------+--------+
|  1 | egon       | male   |   18 |    200 |
|  2 | alex       | female |   48 |    201 |
|  3 | wupeiqi    | male   |   38 |    201 |
|  4 | yuanhao    | female |   28 |    202 |
|  5 | liwenzhou  | male   |   18 |    200 |
|  6 | jingliyang | female |   18 |    204 |
+----+------------+--------+------+--------+
6 rows in set (0.00 sec)

mysql> select dep_id from employee;
+--------+
| dep_id |
+--------+
|    200 |
|    201 |
|    201 |
|    202 |
|    200 |
|    204 |
+--------+
6 rows in set (0.00 sec)

mysql> select distinct dep_id from employee;
+--------+
| dep_id |
+--------+
|    200 |
|    201 |
|    202 |
|    204 |
+--------+
4 rows in set (0.00 sec)

mysql> select name from department where id not in (
    -> select distinct dep_id from employee);
+--------+
| name   |
+--------+
| 运营   |
+--------+
1 row in set (0.00 sec)

mysql> select * from employee;
+----+------------+--------+------+--------+
| id | name       | sex    | age  | dep_id |
+----+------------+--------+------+--------+
|  1 | egon       | male   |   18 |    200 |
|  2 | alex       | female |   48 |    201 |
|  3 | wupeiqi    | male   |   38 |    201 |
|  4 | yuanhao    | female |   28 |    202 |
|  5 | liwenzhou  | male   |   18 |    200 |
|  6 | jingliyang | female |   18 |    204 |
+----+------------+--------+------+--------+
6 rows in set (0.00 sec)

mysql> select * from department;
+------+--------------+
| id   | name         |
+------+--------------+
|  200 | 技术         |
|  201 | 人力资源     |
|  202 | 销售         |
|  203 | 运营         |
+------+--------------+
4 rows in set (0.00 sec)

2、带比较运算符的子查询

查询大于所有人平均年龄的员工名与年龄 #先拿到所有人的平均年龄,然后把它作为条件

select name,age from employee where age > (select avg(age) from employee);

mysql> select avg(age) from employee;
+----------+
| avg(age) |
+----------+
|  28.0000 |
+----------+
1 row in set (0.06 sec)

mysql> select name,age from employee where age > (select avg(age) from employee);
+---------+------+
| name    | age  |
+---------+------+
| alex    |   48 |
| wupeiqi |   38 |
+---------+------+
2 rows in set (0.00 sec)

3、带EXISTS关键字的子查询 #针对某一个子查询问一问它有没有结果,有就为真了;

条件成立就拿到了

select * from employee

where EXISTS

(select id from department where name = "技术");

mysql> select * from employee
    -> where EXISTS
    -> (select id from department where name = "技术");
+----+------------+--------+------+--------+
| id | name       | sex    | age  | dep_id |
+----+------------+--------+------+--------+
|  1 | egon       | male   |   18 |    200 |
|  2 | alex       | female |   48 |    201 |
|  3 | wupeiqi    | male   |   38 |    201 |
|  4 | yuanhao    | female |   28 |    202 |
|  5 | liwenzhou  | male   |   18 |    200 |
|  6 | jingliyang | female |   18 |    204 |
+----+------------+--------+------+--------+
6 rows in set (0.00 sec)

    ->
    -> \c

mysql> select * from employee
    -> where EXISTS
    -> (select id from department where name = "IT");
Empty set (0.00 sec)

把在内存中虚拟表留下来以便你查询用,把查询表起个名字当做一个表来用;

mysql> select id,name,sex from employee;
+----+------------+--------+
| id | name       | sex    |
+----+------------+--------+
|  1 | egon       | male   |
|  2 | alex       | female |
|  3 | wupeiqi    | male   |
|  4 | yuanhao    | female |
|  5 | liwenzhou  | male   |
|  6 | jingliyang | female |
+----+------------+--------+
6 rows in set (0.00 sec)

mysql> select * from
    -> (select id,name,sex from employee)as t1;
+----+------------+--------+
| id | name       | sex    |
+----+------------+--------+
|  1 | egon       | male   |
|  2 | alex       | female |
|  3 | wupeiqi    | male   |
|  4 | yuanhao    | female |
|  5 | liwenzhou  | male   |
|  6 | jingliyang | female |
+----+------------+--------+
6 rows in set (0.09 sec)

#统计每个(分组,得到聚合的结果)部门最新(时间最大的一个)入职的员工

select post ,max(hire_date) from employee group by post;

得到的新表和原表连接到一起了

mysql> use db5;
Database changed
mysql> show tables;
+---------------+
| Tables_in_db5 |
+---------------+
| customer      |
| employee      |
| student       |
+---------------+
3 rows in set (0.10 sec)

mysql> select * from employee;
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| id | name       | sex    | age | hire_date  | post                                    | post_comment | salary     | office | depart_id |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
|  1 | egon       | male   |  18 | 2017-03-01 | 老男孩驻沙河办事处外交大使              | NULL         |    7300.33 |    401 |         1 |
|  2 | alex       | male   |  78 | 2015-03-02 | teacher                                 | NULL         | 1000000.31 |    401 |         1 |
|  3 | wupeiqi    | male   |  81 | 2013-03-05 | teacher                                 | NULL         |    8300.00 |    401 |         1 |
|  4 | yuanhao    | male   |  73 | 2014-07-01 | teacher                                 | NULL         |    3500.00 |    401 |         1 |
|  5 | liwenzhou  | male   |  28 | 2012-11-01 | teacher                                 | NULL         |    2100.00 |    401 |         1 |
|  6 | jingliyang | female |  18 | 2011-02-11 | teacher                                 | NULL         |    9000.00 |    401 |         1 |
|  7 | jinxin     | male   |  18 | 1900-03-01 | teacher                                 | NULL         |   30000.00 |    401 |         1 |
|  8 | 成龙       | male   |  48 | 2010-11-11 | teacher                                 | NULL         |   10000.00 |    401 |         1 |
|  9 | 歪歪       | female |  48 | 2015-03-11 | sale                                    | NULL         |    3000.13 |    402 |         2 |
| 10 | 丫丫       | female |  38 | 2010-11-01 | sale                                    | NULL         |    2000.35 |    402 |         2 |
| 11 | 丁丁       | female |  18 | 2011-03-12 | sale                                    | NULL         |    1000.37 |    402 |         2 |
| 12 | 星星       | female |  18 | 2016-05-13 | sale                                    | NULL         |    3000.29 |    402 |         2 |
| 13 | 格格       | female |  28 | 2017-01-27 | sale                                    | NULL         |    4000.33 |    402 |         2 |
| 14 | 张野       | male   |  28 | 2016-03-11 | operation                               | NULL         |   10000.13 |    403 |         3 |
| 15 | 程咬金     | male   |  18 | 1997-03-12 | operation                               | NULL         |   20000.00 |    403 |         3 |
| 16 | 程咬银     | female |  18 | 2013-03-11 | operation                               | NULL         |   19000.00 |    403 |         3 |
| 17 | 程咬铜     | male   |  18 | 2015-04-11 | operation                               | NULL         |   18000.00 |    403 |         3 |
| 18 | 程咬铁     | female |  18 | 2014-05-12 | operation                               | NULL         |   17000.00 |    403 |         3 |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
18 rows in set (0.00 sec)

mysql> select post ,max(hire_date) from employee group by post;
+-----------------------------------------+----------------+
| post                                    | max(hire_date) |
+-----------------------------------------+----------------+
| operation                               | 2016-03-11     |
| sale                                    | 2017-01-27     |
| teacher                                 | 2015-03-02     |
| 老男孩驻沙河办事处外交大使              | 2017-03-01     |
+-----------------------------------------+----------------+
4 rows in set (0.06 sec)

mysql> select * from employee as t1
    -> inner join
    -> (select post ,max(hire_date) from employee group by post) as t2
    -> on t1.post = t2.post;
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+-----------------------------------------+----------------+
| id | name       | sex    | age | hire_date  | post                                    | post_comment | salary     | office | depart_id | post                                    | max(hire_date) |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+-----------------------------------------+----------------+
|  1 | egon       | male   |  18 | 2017-03-01 | 老男孩驻沙河办事处外交大使              | NULL         |    7300.33 |    401 |         1 | 老男孩驻沙河办事处外交大使              | 2017-03-01     |
|  2 | alex       | male   |  78 | 2015-03-02 | teacher                                 | NULL         | 1000000.31 |    401 |         1 | teacher                                 | 2015-03-02     |
|  3 | wupeiqi    | male   |  81 | 2013-03-05 | teacher                                 | NULL         |    8300.00 |    401 |         1 | teacher                                 | 2015-03-02     |
|  4 | yuanhao    | male   |  73 | 2014-07-01 | teacher                                 | NULL         |    3500.00 |    401 |         1 | teacher                                 | 2015-03-02     |
|  5 | liwenzhou  | male   |  28 | 2012-11-01 | teacher                                 | NULL         |    2100.00 |    401 |         1 | teacher                                 | 2015-03-02     |
|  6 | jingliyang | female |  18 | 2011-02-11 | teacher                                 | NULL         |    9000.00 |    401 |         1 | teacher                                 | 2015-03-02     |
|  7 | jinxin     | male   |  18 | 1900-03-01 | teacher                                 | NULL         |   30000.00 |    401 |         1 | teacher                                 | 2015-03-02     |
|  8 | 成龙       | male   |  48 | 2010-11-11 | teacher                                 | NULL         |   10000.00 |    401 |         1 | teacher                                 | 2015-03-02     |
|  9 | 歪歪       | female |  48 | 2015-03-11 | sale                                    | NULL         |    3000.13 |    402 |         2 | sale                                    | 2017-01-27     |
| 10 | 丫丫       | female |  38 | 2010-11-01 | sale                                    | NULL         |    2000.35 |    402 |         2 | sale                                    | 2017-01-27     |
| 11 | 丁丁       | female |  18 | 2011-03-12 | sale                                    | NULL         |    1000.37 |    402 |         2 | sale                                    | 2017-01-27     |
| 12 | 星星       | female |  18 | 2016-05-13 | sale                                    | NULL         |    3000.29 |    402 |         2 | sale                                    | 2017-01-27     |
| 13 | 格格       | female |  28 | 2017-01-27 | sale                                    | NULL         |    4000.33 |    402 |         2 | sale                                    | 2017-01-27     |
| 14 | 张野       | male   |  28 | 2016-03-11 | operation                               | NULL         |   10000.13 |    403 |         3 | operation                               | 2016-03-11     |
| 15 | 程咬金     | male   |  18 | 1997-03-12 | operation                               | NULL         |   20000.00 |    403 |         3 | operation                               | 2016-03-11     |
| 16 | 程咬银     | female |  18 | 2013-03-11 | operation                               | NULL         |   19000.00 |    403 |         3 | operation                               | 2016-03-11     |
| 17 | 程咬铜     | male   |  18 | 2015-04-11 | operation                               | NULL         |   18000.00 |    403 |         3 | operation                               | 2016-03-11     |
| 18 | 程咬铁     | female |  18 | 2014-05-12 | operation                               | NULL         |   17000.00 |    403 |         3 | operation                               | 2016-03-11     |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+-----------------------------------------+----------------+
18 rows in set (0.00 sec)

mysql> select post ,max(hire_date) from employee group by post;
+-----------------------------------------+----------------+
| post                                    | max(hire_date) |
+-----------------------------------------+----------------+
| operation                               | 2016-03-11     |
| sale                                    | 2017-01-27     |
| teacher                                 | 2015-03-02     |
| 老男孩驻沙河办事处外交大使              | 2017-03-01     |
+-----------------------------------------+----------------+
4 rows in set (0.04 sec)

mysql> select * from employee as t1
    -> inner join
    ->  (select post ,max(hire_date) as max_hire_date from employee group by post) as t2
    -> on t1.post = t2.post
    -> where t1.hire_date = t2.max_hire_date;
+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+-----------------------------------------+---------------+
| id | name   | sex    | age | hire_date  | post                                    | post_comment | salary     | office | depart_id | post                                    | max_hire_date |
+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+-----------------------------------------+---------------+
|  1 | egon   | male   |  18 | 2017-03-01 | 老男孩驻沙河办事处外交大使              | NULL         |    7300.33 |    401 |         1 | 老男孩驻沙河办事处外交大使              | 2017-03-01    |
|  2 | alex   | male   |  78 | 2015-03-02 | teacher                                 | NULL         | 1000000.31 |    401 |         1 | teacher                                 | 2015-03-02    |
| 13 | 格格   | female |  28 | 2017-01-27 | sale                                    | NULL         |    4000.33 |    402 |         2 | sale                                    | 2017-01-27    |
| 14 | 张野   | male   |  28 | 2016-03-11 | operation                               | NULL         |   10000.13 |    403 |         3 | operation                               | 2016-03-11    |
+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+-----------------------------------------+---------------+
4 rows in set (0.07 sec)

权限管理

权限管理
    1、创建账号
        # 本地账号
        create user ‘egon1‘@‘localhost‘ identified by ‘123‘; # mysql -uegon1 -p123
        # 远程帐号  #前提是31.10能拼通我服务端的ip这才有意义
        create user ‘egon2‘@‘192.168.31.10‘ identified by ‘123‘; # mysql -uegon2 -p123 -h 指定的是服务端ip  ##运行egon2在这台机器之上登录;‘192.168.31.10’是客户端的ip地址
        create user ‘egon3‘@‘192.168.31.%‘ identified by ‘123‘; # mysql -uegon3 -p123 -h 服务端ip  #表示egon3用户能在31这段网中任意登录
        create user ‘egon3‘@‘%‘ identified by ‘123‘; # mysql -uegon3 -p123 -h 服务端ip   #所有的客户端ip都能登录,只要你能拼通服务端。

    2、授权  这几张表对权限的控制是依次降低的
        user:*.*  # *.* 所有库下边所有的表  只要user一放权,下面所有的都可以用了
        db:db1.*  #具体写哪个库,只对某个库有查询权限,库下边所有的表
        tables_priv:db1.t1 #表级别的权限
        columns_priv:id,name #针对某个字段

        grant all on *.* to ‘egon1‘@‘localhost‘; #授权多有的权限,*.*是user下所有级别的;
        grant select on *.* to ‘egon1‘@‘localhost‘;
        revoke select on *.* from ‘egon1‘@‘localhost‘; #回收权限

        grant select on db1.* to ‘egon1‘@‘localhost‘;
        revoke select on db1.* from ‘egon1‘@‘localhost‘;

        grant select on db1.t1 to ‘kris1‘@‘localhost‘;# -uroot 只放行了对t1的权限      #先查看下 select * from mysql.user\G 看select权限有没有看;再看select * from mysql.db\G 查看下select权限有没开      #select * from mysql.tables_priv\G ,看到有权限了;验证下:exit  mysql -ukris1 -p123  -->> show databeses; -->use db1; -->show tables;->select * from t1;
        revoke select on db1.t2 from ‘egon1‘@‘localhost‘;

        grant select(id,name),update(age) on db1.t2 to ‘egon1‘@‘localhost‘; #精确到字段级别      #select * from mysql.columns_priv;
mysql> create user ‘kris1‘@‘localhost‘ identified by ‘123‘;
Query OK, 0 rows affected (0.39 sec)

mysql> select * from mysql.user\G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password:
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           .....
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string:
      password_expired: N
*************************** 2. row ***************************
                  Host: 127.0.0.1
                  User: root
              Password:
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Del......
 authentication_string:
      password_expired: N
*************************** 3. row ***************************
                  Host: ::1
                  User: root
              Password:
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           ......
      password_expired: N
*************************** 4. row ***************************
                  Host: localhost
                  User:
              Password:
           Select_priv: N
           I.........*************************** 5. row ***************************
                  Host: localhost
                  User: kris1
              Password: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
           Select_priv: N  #下面的都有N,造出来的权限默认是在user表里边,user没有放行任何权限,但不一定这个用户一定就没有权限;
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string:
      password_expired: N
5 rows in set (0.05 sec)

mysql> select * from mysql.db\G  #查看下面的db表
*************************** 1. row ***************************
                 Host: %   ##有关于库相关的权限,但没有具体到用户,用户都是空的,意味着对任何用户都是有效的,包括刚刚的kris1;%代表任意的,包含localhost
                   Db: test
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
           Event_priv: Y
         Trigger_priv: Y
*************************** 2. row ***************************
                 Host: %
                   Db: test\_%  #对db下的以 __开头的任意都有权限
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
           Event_priv: Y
         Trigger_priv: Y
2 rows in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db3                |
| db4                |
| db5                |
| db6                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
10 rows in set (0.68 sec)

mysql> create database test_1;
Query OK, 1 row affected (0.06 sec)

mysql> create database test2;
Query OK, 1 row affected (0.03 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db3                |
| db4                |
| db5                |
| db6                |
| mysql              |
| performance_schema |
| test               |
| test2              |
| test_1             |
+--------------------+
12 rows in set (0.00 sec)

mysql> exit
Bye

C:\Users\Administrator>mysql -ukris1 -p123
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: 5.6.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

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.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
| test_1             |
+--------------------+
3 rows in set (0.00 sec)

mysql> drop database test_1;
Query OK, 0 rows affected (0.64 sec)

mysql> use test;
Database changed
mysql> show tables;
Empty set (0.06 sec)
C:\Users\Administrator>mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

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.

mysql> grant select on *.* to ‘kris1‘@‘localhost‘;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from mysql.user\G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password:
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string:
      password_expired: N
*************************** 2. row ***************************
                  Host: 127.0.0.1
                  User: root
              Password:
           Select_priv: Y
           Insert_priv: Y
           *************************** 3. row ***************************
                  Host: ::1
                  User: root
              Password:
           Select_priv: Y
           ......
      password_expired: N
*************************** 4. row ***************************
                  Host: localhost
                  User:
              Password:
           Select_priv: N
           Insert_priv: N
           Update_priv: N
        .....
Create_tablespace_priv: N
              ssl_type:
         .....*************************** 5. row ***************************
                  Host: localhost
                  User: kris1
              Password: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
           Select_priv: Y
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string:
      password_expired: N
5 rows in set (0.05 sec)

mysql> exit
Bye

C:\Users\Administrator>mysql -ukris1 -p123
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 10
Server version: 5.6.39 MySQL Community Server (GPL)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db3                |
| db4                |
| db5                |
| db6                |
| mysql              |
| performance_schema |
| test               |
| test2              |
+--------------------+
11 rows in set (0.05 sec)

mysql> use db1;
Database changed
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1            |
+---------------+
1 row in set (0.00 sec)

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | SB   |
|    3 | SB   |
+------+------+
2 rows in set (0.24 sec)

mysql> insert into t2 values(4, ‘kris1‘,45);
ERROR 1142 (42000): INSERT command denied to user ‘kris1‘@‘localhost‘ for table ‘t2‘
mysql>
C:\Users\Administrator>mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.6.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights r

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

mysql> revoke select on *.* from ‘kris1‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from mysql.user\G
*************************** 1. row ***************************
                  ......
*************************** 5. row ***************************
                  Host: localhost
                  User: kris1
              Password: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
           Select_priv: N #又没有权限了
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string:
      password_expired: N
5 rows in set (0.00 sec)
mysql> grant select on db1.* to ‘kris1‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from mysql.db\G
*************************** 1. row ***************************
                 Host: %
                   Db: test
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
           Event_priv: Y
         Trigger_priv: Y
*************************** 2. row ***************************
                 Host: %
                   Db: test\_%
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
           Event_priv: Y
         Trigger_priv: Y
*************************** 3. row ***************************
                 Host: localhost
                   Db: db1
                 User: kris1
          Select_priv: Y
          Insert_priv: N
          Update_priv: N
          Delete_priv: N
          Create_priv: N
            Drop_priv: N
           Grant_priv: N
      References_priv: N
           Index_priv: N
           Alter_priv: N
Create_tmp_table_priv: N
     Lock_tables_priv: N
     Create_view_priv: N
       Show_view_priv: N
  Create_routine_priv: N
   Alter_routine_priv: N
         Execute_priv: N
           Event_priv: N
         Trigger_priv: N
3 rows in set (0.00 sec)

mysql> exit
Bye

C:\Users\Administrator>mysql -ukris1 -p123
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 12
Server version: 5.6.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

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.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| test               |
+--------------------+
3 rows in set (0.00 sec)

mysql> use db1;
Database changed
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1            |
+---------------+
1 row in set (0.00 sec)

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | SB   |
|    3 | SB   |
+------+------+
2 rows in set (0.00 sec)

mysql> insert into t1 values(2,‘SB‘);
ERROR 1142 (42000): INSERT command denied to user ‘kris1‘@‘localhost‘ for table ‘t
mysql> exit
Bye

C:\Users\Administrator>mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.6.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

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.

mysql> revoke select on db1.* from ‘kris1‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)

原文地址:https://www.cnblogs.com/shengyang17/p/8961848.html

时间: 2024-11-07 12:04:44

第八章|MySQL数据库|数据操作的相关文章

第八章| 2. MySQL数据库|数据操作| 权限管理

1.数据操作 SQL(结构化查询语言),可以操作关系型数据库 通过sql可以创建.修改账号并控制账号权限:  通过sql可以创建.修改数据库.表:  通过sql可以增删改查数据: 可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 使用SELECT查询数据以及. 1.1数据的增删改查 插入数据INSERT 1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3-

第八章|MySQL数据库|库操作|表操作

1.初识数据库 我们在编写任何程序之前,都需要事先写好基于网络操作一台主机上文件的程序(socket服务端与客户端程序),于是有人将此类程序写成一个 专门的处理软件,这就是mysql等数据库管理软件的由来,但mysql解决的不仅仅是数据共享的问题,还有查询效率,安全性等一系列问题, 总之,把程序员从数据管理中解脱出来,专注于自己的程序逻辑的编写. 数据(Data):描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数

solr 4.8+mysql数据库数据导入 + mmseg4j中文全文索引 配置笔记

1.如何将solr部署,请参考之前的文章 2.按上述配置好后,在solr_home文件夹中,将包含collection1文件夹,这就是solr的一个实例.下面我们来看看collection1中的文件内容. collection1中包含conf和data两个子文件夹.data中包含tlog和index(如果没有也没关系,稍后再solr建立索引时,将会被创建).tlog是记录日志的文件夹,index是存放索引的文件夹.conf中包含lang文件夹和若干文件.lang文件夹中包含的是词库文件,但是so

Python对MySQL数据库的操作

Python中,可以使用MySQLdb模块连接到MySQL数据库,对MySQL数据库进行操作 [第一步] MySQL安装 参考文档: http://blog.csdn.net/Jerry_1126/article/details/20837397 [第二步]连接到MySQL 创建数据库 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.5

mysql 数据库数据订正

mysql 数据库数据订正 http://blog.itpub.net/22664653/viewspace-717175/ 工作过程中时常遇到数据订正的需求,该操作本身不难.操作时要求能够保持回滚~对于能够满足回滚的要求,我通常执行备份表,然后执行变更!如果发送订正错误或者用户要求回滚的时候,就完全恢复整个表,这样做会有多余的操作,因为我们只要 实际上可以选择备份要进行更正的数据!比如如下需求: 将表resource中usage_type='unused' 并且 user_id=166 的记录

mysql 数据库的操作

--01 mysql 数据库的操作 -- 链接数据库 mysql -uroot -pmysql -- 不显示密码 mysql -uroot -p mysql -- 退出数据库 quit/exit/ctrl + d -- sql语句最后需要有分号;结尾 -- 显示数据库版本 version select version(); -- 显示时间 select now(); -- 查看当前使用的数据库 select database(); -- 查看所有数据库 show databases; -- 创建

django 中连接mysql数据库的操作步骤

django中连接mysql数据库的操作步骤: 1 settings配置文件中 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'orm02', # 库的名字 'USER':'root', # 数据库的用户名 'PASSWORD':'666', # 数据库的密码 'HOST':'127.0.0.1', 'PORT':3306, } } 2 项目文件夹下的init文件中写上下面内容,用pymysql替

mysql数据库的操作复习

mysql数据库的操作可以分为四种:DDL,DML,DCL,TCL; DDL(data definition language):数据定义语言: CREATE:在数据库中创建新的数据对象 ALTER:修改数据库中对象的数据结构 DROP:删除数据库中的对象 DISABLE/ENABLE TRIGGER:修改触发器的状态 UPDATE STATISTIC:更新表/视图统计信息 TRUNCATE TABLE:清空表中数据 COMMENT:给数据对象添加注释 RENAME :更改数据对象名称 DML(

Mysql数据库常用操作

1.备份数据库 [[email protected] ~]# mysqldump -h 192.168.0.8 -uroot  -p'123456'  user >user.sql 2.查看mysql数据库字符集设置 mysql> show variables like 'character_set_%';+--------------------------+----------------------------+| Variable_name            | Value