1、数据操作

SQL(结构化查询语言),可以操作关系型数据库

通过sql可以创建、修改账号并控制账号权限;  通过sql可以创建、修改数据库、表;  通过sql可以增删改查数据;

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

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

1.1数据的增删改查

插入数据INSERT 

. 插入完整数据(顺序插入)
语法一:
INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);
语法二:
INSERT INTO 表名 VALUES (值1,值2,值3…值n); . 指定字段插入数据
语法:
INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…); . 插入多条记录
语法:
INSERT INTO 表名 VALUES
(值1,值2,值3…值n),
(值1,值2,值3…值n),
(值1,值2,值3…值n); . 插入查询结果
语法:
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(‘’)
where user=’root’ and host=’localhost’; 删除数据DELETE
语法:
DELETE FROM 表名
WHERE CONITION;
示例:
DELETE FROM mysql.user
WHERE password=’’; 练习:
更新MySQL root用户密码为mysql123
删除除从本地登录的root用户以外的所有用户

1.2单表查询

把表中所有行和列都列举出来使用“*” 来表示所有的列如select * from student;

查询部分行和列需要列举不同的列名,而查询部分分行需要where子句进行条件限制,如select studentNo,studentName,address from student where address = '河南新乡';

在查询中使用列的别名,AS子句可以用来改变结果集中列的名称,也可以为组合或计算出的列指定名称,让标题列的信息更易懂。如select studentNo AS 学生编号,studentName as 学生姓名,address as 学生地址 from student where address = ‘河南新乡’;   还有一种情况是为通过计算、合并得到的新列命名 如select firstName+ ‘.’+lastName as 姓名 from employee

单表查询

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.16 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 |
+----+------------+------------+
| | 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 |
+----+------------+------------+
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 |
+-----------------------------------------+
rows in set (0.00 sec) mysql> select distinct post from employee; ##distinct是避免重复
+-----------------------------------------+
| post |
+-----------------------------------------+
| 老男孩驻沙河办事处外交大使 |
| teacher |
| sale |
| operation |
+-----------------------------------------+
rows in set (0.08 sec) mysql> select name,salary*12 from employee; ##通过四则运算查询
+------------+-------------+
| name | 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 |
+------------+-------------+
rows in set (0.09 sec) mysql> select name,salary* 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 |
+------------+---------------+
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 |
+--------------------------------+
rows in set (0.14 sec) mysql> select concat('姓名:', name, '性别:', sex) as info, concat('年薪:', salar
y*) 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 |
+--------------------------------+--------------------+
rows in set (0.00 sec)
mysql> select concat(name, ':', age) from employee;
+------------------------+
| concat(name, ':', age) |
+------------------------+
| egon: |
| alex: |
| wupeiqi: |
| yuanhao: |
| liwenzhou: |
| jingliyang: |
| jinxin: |
| 成龙: |
| 歪歪: |
| 丫丫: |
| 丁丁: |
| 星星: |
| 格格: |
| 张野: |
| 程咬金: |
| 程咬银: |
| 程咬铜: |
| 程咬铁: |
+------------------------+
rows in set (0.00 sec) mysql> select concat_ws(':', name, sex, age) from employee; ##concat_ws()第一个参数为分隔符
+--------------------------------+
| concat_ws(':', name, sex, age) |
+--------------------------------+
| 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: |
+--------------------------------+
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> |
| <名字>:成龙> |
| <名字>:歪歪> |
| <名字>:丫丫> |
| <名字>:丁丁> |
| <名字>:星星> |
| <名字>:格格> |
| <名字>:张野> |
| <名字>:程咬金> |
| <名字>:程咬银> |
| <名字>:程咬铜> |
| <名字>:程咬铁> |
+--------------------------------+
rows in set (0.00 sec) mysql> select concat('<名字>:', name, '>'), concat('<薪资:', salary, '>') from employee;
+--------------------------------+---------------------------------+
| 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> |
+--------------------------------+---------------------------------+
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 > ;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| | 成龙 | |
| | 歪歪 | |
| | 丫丫 | |
| | 丁丁 | |
| | 星星 | |
| | 格格 | |
| | 张野 | |
| | 程咬金 | |
| | 程咬银 | |
| | 程咬铜 | |
| | 程咬铁 | |
+----+-----------+-----+
rows in set (0.13 sec) mysql> select name,post,salary from employee where post='teacher' and salary >
;
+------------+---------+------------+
| name | post | salary |
+------------+---------+------------+
| alex | teacher | 1000000.31 |
| wupeiqi | teacher | 8300.00 |
| jingliyang | teacher | 9000.00 |
| jinxin | teacher | 30000.00 |
| 成龙 | teacher | 10000.00 |
+------------+---------+------------+
rows in set (0.04 sec) mysql> select name,salary from employee where salary >= and salary <=; +-----------+----------+
| name | salary |
+-----------+----------+
| jinxin | 30000.00 |
| 程咬金 | 20000.00 |
+-----------+----------+
rows in set (0.00 sec) mysql> select name,salary from employee where salary between and ;
+-----------+----------+
| name | salary |
+-----------+----------+
| jinxin | 30000.00 |
| 程咬金 | 20000.00 |
+-----------+----------+
rows in set (0.07 sec) mysql> select name,salary from employee where salary < or salary > ;
+------------+------------+
| 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 |
+------------+------------+
rows in set (0.01 sec) mysql> select name,salary from employee where salary not between and
;
+------------+------------+
| 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 |
+------------+------------+
rows in set (0.00 sec) mysql> select * from employee where age = or age = or age = ;

+----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+
| 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 |
+----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+

 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 |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+

 rows in set (0.00 sec)

mysql> select * from employee where name like "jin%";  ##模糊匹配,%代表任意字符,jin开头的不管后边是什么
+----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+
| id | name | sex | age | hire_date | post | post_comment | salary| office | depart_id |
+----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+
| | jingliyang | female | | -- | teacher | NULL | 9000.0 | | |
| | jinxin | male | | -- | teacher | NULL | 30000.0 | | |
+----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+
rows in set (0.09 sec) mysql> select * from employee where name like "jin___"; ##___三个下划线代表3个任意字符。
+----+--------+------+-----+------------+---------+--------------+----------+--------+-----------+
| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
+----+--------+------+-----+------------+---------+--------------+----------+--------+-----------+
| | jinxin | male | | -- | teacher | NULL | 30000.00 | | |
+----+--------+------+-----+------------+---------+--------------+----------+--------+-----------+
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 |
+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+

 rows in set (0.08 sec)
#由于没有设置ONLY_FULL_GROUP_BY,于是也可以有结果,默认都是组内的第一条记录(就是按照post分组,如operation组内的第一条记录。),但其实这是没有意义的
mysql> set global sql_mode="ONLY_FULL_GROUP_BY";
Query OK, rows affected (0.11 sec) ##设置成功一定要先退出,然后重新登录方可生效。然后你再select * 或者 select name就会报错了。 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
Server version: 5.6. MySQL Community Server (GPL)
Copyright (c) , , 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 (): 'db5.employee.id' isn't in GROUP BY
mysql> select post from employee group by post;
+-----------------------------------------+
| post |
+-----------------------------------------+
| operation |
| sale |
| teacher |
| 老男孩驻沙河办事处外交大使 |
+-----------------------------------------+
rows in set (0.00 sec) mysql> select post,count(id) as emp_count from employee group by post; #查询组内的id数
+-----------------------------------------+-----------+
| post | emp_count |
+-----------------------------------------+-----------+
| operation | |
| sale | |
| teacher | |
| 老男孩驻沙河办事处外交大使 | |
+-----------------------------------------+-----------+
rows in set (0.06 sec)
强调:如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义
多条记录之间的某个字段值相同,该字段通常用来作为分组的依据
#没有group by则默认整体算作一组
select max(salary) from employee; #取所有员工的最高工资 #group_concat(name) 职位包含的所有员工成员的名字
select post,group_concat(name) from employee group by post;
mysql> select max(salary) from employee;
+-------------+
| max(salary) |
+-------------+
| 1000000.31 |
+-------------+
row in set (0.07 sec) mysql> select post,group_concat(name) from employee group by post; ##也可以查询组内成员的性别group_concat(sex);
+-----------------------------------------+-------------------------------------
| post | group_concat(name)
+-----------------------------------------+-------------------------------------
| operation | 程咬铁,程咬铜,程咬银,程咬金,张野
|
| sale | 格格,星星,丁丁,丫丫,歪歪
|
| teacher | 成龙,jinxin,jingliyang,liwenzhou,yuanhao,wupeiqi,alex |
| 老男孩驻沙河办事处外交大使 | egon
|
+-----------------------------------------+-------------------------------------
rows in set (0.01 sec)

#练习:
. 查询岗位名以及岗位包含的所有员工名字  #先确定你查的是哪张表,有没有过滤条件where,有没有分组分类的;
. 先取出年龄在50以上的然后再 查询岗位名以及各岗位内包含的员工个数
. 查询公司内男员工和女员工的个数
. 查询岗位名以及各岗位的平均薪资
. 查询岗位名以及各岗位的最高薪资
. 查询岗位名以及各岗位的最低薪资
. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
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,yunhao,wupeiqi,alex |
| 老男孩驻沙河办事处外交大使 | egon
|
+-----------------------------------------+------------------------------------
rows in set (0.00 sec) mysql> select post,count(id) from employee where age > group by post;
+---------+-----------+
| post | count(id) |
+---------+-----------+
| teacher | |
+---------+-----------+
row in set (0.00 sec) mysql> select sex,count(id) from employee group by sex;
+--------+-----------+
| sex | count(id) |
+--------+-----------+
| male | |
| female | |
+--------+-----------+
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 |
+--------+---------------+
rows in set (0.00 sec)
mysql> select sex,max(age) from employee group by sex;
+--------+----------+
| sex | max(age) |
+--------+----------+
| male | 81 |
| female | 48 |
+--------+----------+
2 rows in set (0.06 sec)

#having 过滤条件 在分组之后进行;where在分组之前 (过滤的是分组组内的成员)
例如:
. 查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数 #聚合出员工个数
. 查询各岗位平均薪资大于10000的岗位名、平均工资
. 查询各岗位平均薪资大于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 |count(id) | | group_concat(name)
+-----------------------------------------+-------------------------------------
| operation | 5 | | 程咬铁,程咬铜,程咬银,程咬金,张野 | sale | 5 | | 格格,星星,丁丁,丫丫,歪歪 | teacher | 7 | | 成龙,jinxin,jingliyang,liwenzhou,yuanhao,wupeiqi,alex
| 老男孩驻沙河办事处外交大使| 1 | | egon
+-----------------------------------------+-------------------------------------
rows in set (0.00 sec) mysql> select post,group_concat(name),count(id) from employee group by post having count(id) < ;
+-----------------------------------------+--------------------+-----------+
| post | group_concat(name) | count(id) |
+-----------------------------------------+--------------------+-----------+
| 老男孩驻沙河办事处外交大使 | egon | |
+-----------------------------------------+--------------------+-----------+
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) > and avg(salary) < ;
+-----------+--------------+
| post | avg(salary) |
+-----------+--------------+
| operation | 16800.026000 |
+-----------+--------------+
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;  #在age asc 的组内进行id排序。
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| 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 >
-> group by post
-> having count(id) >
-> order by emp_count desc;
+-----------+-----------+
| post | emp_count |
+-----------+-----------+
| teacher | |
| sale | |
| operation | |
+-----------+-----------+
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 | office | 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 |
+----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+
| | jingliyang | female | | -- | teacher | NULL | 9000.0 | | |
| | jinxin | male | | -- | teacher | NULL | 30000.0 | | |
+----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+
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 |
+----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+
| | jingliyang | female | | -- | teacher | NULL | 9000.0 | | |
| | jinxin | male | | -- | teacher | NULL | 30000.0 | | |
+----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+
rows in set (0.00 sec)

 1.3 多表查询 

有关系的表连接合到一起;   department和employee表是多对一的关系。

内连接:只取两张表的共同部分
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, row affected (0.01 sec) mysql> use db6;
Database changed
mysql> create table department(
-> id int,
-> name varchar()
-> );
Query OK, rows affected (0.78 sec) mysql> create table employee(
-> id int primary key auto_increment,
-> name varchar(),
-> sex enum('male','female') not null default 'male',
-> age int,
-> dep_id int
-> );
Query OK, rows affected (1.05 sec) mysql> insert into department values
-> (,'技术'),
-> (,'人力资源'),
-> (,'销售'),
-> (,'运营');
Query OK, rows affected (0.19 sec)
Records: Duplicates: Warnings: mysql> insert into employee(name,sex,age,dep_id) values
-> ('egon','male',,),
-> ('alex','female',,),
-> ('wupeiqi','male',,),
-> ('yuanhao','female',,),
-> ('liwenzhou','male',,),
-> ('jingliyang','female',,)
-> ;
Query OK, rows affected (0.15 sec)
Records: Duplicates: Warnings:
mysql> select * from department;
+------+--------------+
| id | name |
+------+--------------+
| | 技术 |
| | 人力资源 |
| | 销售 |
| 203 | 运营 |
+------+--------------+
rows in set (0.00 sec) mysql> select * from employee;
+----+------------+--------+------+--------+
| id | name | sex | age | dep_id |
+----+------------+--------+------+--------+
| | egon | male | | |
| | alex | female | | |
| | wupeiqi | male | | |
| | yuanhao | female | | |
| | liwenzhou | male | | |
| | jingliyang | female | | |
+----+------------+--------+------+--------+
rows in set (0.00 sec) mysql> select * from employee,department;
+----+------------+--------+------+--------+------+--------------+
| id | name | sex | age | dep_id | id | name |
+----+------------+--------+------+--------+------+--------------+
| | egon | male | | | | 技术 |
| | egon | male | | | | 人力资源 |
| | egon | male | | | | 销售 |
| | egon | male | | | | 运营 |
| | alex | female | | | | 技术 |
| | alex | female | | | | 人力资源 |
| | alex | female | | | | 销售 |
| | alex | female | | | | 运营 |
| | wupeiqi | male | | | | 技术 |
| | wupeiqi | male | | | | 人力资源 |
| | wupeiqi | male | | | | 销售 |
| | wupeiqi | male | | | | 运营 |
| | yuanhao | female | | | | 技术 |
| | yuanhao | female | | | | 人力资源 |
| | yuanhao | female | | | | 销售 |
| | yuanhao | female | | | | 运营 |
| | liwenzhou | male | | | | 技术 |
| | liwenzhou | male | | | | 人力资源 |
| | liwenzhou | male | | | | 销售 |
| | liwenzhou | male | | | | 运营 |
| | jingliyang | female | | | | 技术 |
| | jingliyang | female | | | | 人力资源 |
| | jingliyang | female | | | | 销售 |
| | jingliyang | female | | | | 运营 |
+----+------------+--------+------+--------+------+--------------+
rows in set (0.07 sec) mysql> select * from employee inner join department on employee.dep_id = department.id ; #共同的部分是200/201/202
+----+-----------+--------+------+--------+------+--------------+
| id | name | sex | age | dep_id | id | name |
+----+-----------+--------+------+--------+------+--------------+
| | egon | male | | | | 技术 |
| | alex | female | | | | 人力资源 |
| | wupeiqi | male | | | | 人力资源 |
| | yuanhao | female | | | | 销售 |
| | liwenzhou | male | | | | 技术 |
+----+-----------+--------+------+--------+------+--------------+
rows in set (0.00 sec) mysql> select * from employee left join department on employee.dep_id = department.id ; #左边employee独有的204
+----+------------+--------+------+--------+------+--------------+
| id | name | sex | age | dep_id | id | name |
+----+------------+--------+------+--------+------+--------------+
| | egon | male | | | | 技术 |
| | liwenzhou | male | | | | 技术 |
| | alex | female | | | | 人力资源 |
| | wupeiqi | male | | | | 人力资源 |
| | yuanhao | female | | | | 销售 |
| | jingliyang | female | | 204 | NULL | NULL |
+----+------------+--------+------+--------+------+--------------+
rows in set (0.00 sec) mysql> select * from employee right join department on employee.dep_id = department.id ; #右边department独有的203
+------+-----------+--------+------+--------+------+--------------+
| id | name | sex | age | dep_id | id | name |
+------+-----------+--------+------+--------+------+--------------+
| | egon | male | | | | 技术 |
| | alex | female | | | | 人力资源 |
| | wupeiqi | male | | | | 人力资源 |
| | yuanhao | female | | | | 销售 |
| | liwenzhou | male | | | | 技术 |
| NULL | NULL | NULL | NULL | NULL | 203 | 运营 |
+------+-----------+--------+------+--------+------+--------------+
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 |
+------+------------+--------+------+--------+------+--------------+
| | egon | male | | | | 技术 |
| | liwenzhou | male | | | | 技术 |
| | alex | female | | | | 人力资源 |
| | wupeiqi | male | | | | 人力资源 |
| | yuanhao | female | | | | 销售 |
| | jingliyang | female | | | NULL | NULL |
| NULL | NULL | NULL | NULL | NULL | | 运营 |
+------+------------+--------+------+--------+------+--------------+
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() | NO | PRI | NULL | auto_increment |
| name | varchar() | YES | | NULL | |
| sex | enum('male','female') | NO | | male | |
| age | int() | YES | | NULL | |
| dep_id | int() | YES | | NULL | |
+--------+-----------------------+------+-----+---------+----------------+
rows in set (0.01 sec) mysql> desc department;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int() | YES | | NULL | |
| name | varchar() | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
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 (): 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 |
+----+-----------+--------+------+--------+------+--------------+
| | egon | male | | | | 技术 |
| | alex | female | | | | 人力资源 |
| | wupeiqi | male | | | | 人力资源 |
| | yuanhao | female | | | | 销售 |
| | liwenzhou | male | | | | 技术 |
+----+-----------+--------+------+--------+------+--------------+
rows in set (0.00 sec) mysql> select department.name,avg(age) from employee inner join department on employee.dep_id = department.id
-> group by department.name
-> having avg(age) > 30;
+--------------+----------+
| name | avg(age) |
+--------------+----------+
| 人力资源 | 43.0000 |
+--------------+----------+
row in set (0.00 sec)

SELECT语句关键字执行优先级

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

   子查询   

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

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

1、带IN关键字的子查询

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

方法一:

select department.name,avg(age) from employee inner join department on employee.dep_id = department.id
-> group by department.name
-> having avg(age) > 25;

方法二:

select name from department where id in
-> (select dep_id from employee
-> group by dep_id
-> having avg(age) > 25);

作为子查询-->> select dep_id from employee

  group by dep_id

  having avg(age) > 25;

mysql> select * from employee;
+----+------------+--------+------+--------+
| id | name | sex | age | dep_id |
+----+------------+--------+------+--------+
| | egon | male | | |
| | alex | female | | |
| | wupeiqi | male | | |
| | yuanhao | female | | |
| | liwenzhou | male | | |
| | jingliyang | female | | |
+----+------------+--------+------+--------+
rows in set (0.00 sec) mysql> select dep_id from employee
-> group by dep_id
-> having avg(age) > ;
+--------+
| dep_id |
+--------+
| |
| |
+--------+
rows in set (0.00 sec) mysql> select * from department;
+------+--------------+
| id | name |
+------+--------------+
| | 技术 |
| | 人力资源 |
| | 销售 |
| | 运营 |
+------+--------------+
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) > );
+--------------+
| name |
+--------------+
| 人力资源 |
| 销售 |
+--------------+
rows in set (0.11 sec)

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

方法一:(使用join,不用分组)

select employee.name from department inner join employee on department.id=employee.dep_id
where department.name = '技术' ;

方法二:

select * from employee where dep_id = (                                                     select employee.name from employee where dep_id = (

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

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

方法一:(使用left join ,注意不能使用 where dep_id not in employee ; 这样语法是错误的

select department.name from department left join employee on employee.dep_id = department.id
where dep_id is nul l ;

方法二:

select name from department where id not in (

select distinct dep_id from employee) ;

mysql> select id from department where name = "技术";
+------+
| id |
+------+
| |
+------+
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 |
+----+-----------+------+------+--------+
| | egon | male | | |
| | liwenzhou | male | | |
+----+-----------+------+------+--------+
rows in set (0.00 sec) mysql> select name from employee where dep_id = (
-> select id from department where name = "技术");
+-----------+
| name |
+-----------+
| egon |
| liwenzhou |
+-----------+
rows in set (0.00 sec) mysql>
mysql> select * from employee;
+----+------------+--------+------+--------+
| id | name | sex | age | dep_id |
+----+------------+--------+------+--------+
| | egon | male | | |
| | alex | female | | |
| | wupeiqi | male | | |
| | yuanhao | female | | |
| | liwenzhou | male | | |
| | jingliyang | female | | |
+----+------------+--------+------+--------+
rows in set (0.00 sec) mysql> select dep_id from employee;
+--------+
| dep_id |
+--------+
| |
| |
| |
| |
| |
| |
+--------+
rows in set (0.00 sec) mysql> select distinct dep_id from employee;
+--------+
| dep_id |
+--------+
| |
| |
| |
| |
+--------+
rows in set (0.00 sec) mysql> select name from department where id not in (
-> select distinct dep_id from employee);
+--------+
| name |
+--------+
| 运营 |
+--------+
row in set (0.00 sec) mysql> select * from employee;
+----+------------+--------+------+--------+
| id | name | sex | age | dep_id |
+----+------------+--------+------+--------+
| | egon | male | | |
| | alex | female | | |
| | wupeiqi | male | | |
| | yuanhao | female | | |
| | liwenzhou | male | | |
| | jingliyang | female | | |
+----+------------+--------+------+--------+
rows in set (0.00 sec) mysql> select * from department;
+------+--------------+
| id | name |
+------+--------------+
| | 技术 |
| | 人力资源 |
| | 销售 |
| | 运营 |
+------+--------------+
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 |
+----------+
row in set (0.06 sec) mysql> select name,age from employee where age > (select avg(age) from employee);
+---------+------+
| name | age |
+---------+------+
| alex | |
| wupeiqi | |
+---------+------+
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 |
+----+------------+--------+------+--------+
| | egon | male | | |
| | alex | female | | |
| | wupeiqi | male | | |
| | yuanhao | female | | |
| | liwenzhou | male | | |
| | jingliyang | female | | |
+----+------------+--------+------+--------+
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 |
+----+------------+--------+
| | egon | male |
| | alex | female |
| | wupeiqi | male |
| | yuanhao | female |
| | liwenzhou | male |
| | jingliyang | female |
+----+------------+--------+
rows in set (0.00 sec) mysql> select * from
-> (select id,name,sex from employee)as t1;
+----+------------+--------+
| id | name | sex |
+----+------------+--------+
| | egon | male |
| | alex | female |
| | wupeiqi | male |
| | yuanhao | female |
| | liwenzhou | male |
| | jingliyang | female |
+----+------------+--------+
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 |
+---------------+
rows in set (0.10 sec) mysql> select * from employee;
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| | egon | male | | -- | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | | |
| | alex | male | | -- | teacher | NULL | 1000000.31 | | |
| | wupeiqi | male | | -- | teacher | NULL | 8300.00 | | |
| | yuanhao | male | | -- | teacher | NULL | 3500.00 | | |
| | liwenzhou | male | | -- | teacher | NULL | 2100.00 | | |
| | jingliyang | female | | -- | teacher | NULL | 9000.00 | | |
| | jinxin | male | | -- | teacher | NULL | 30000.00 | | |
| | 成龙 | male | | -- | teacher | NULL | 10000.00 | | |
| | 歪歪 | female | | -- | sale | NULL | 3000.13 | | |
| | 丫丫 | female | | -- | sale | NULL | 2000.35 | | |
| | 丁丁 | female | | -- | sale | NULL | 1000.37 | | |
| | 星星 | female | | -- | sale | NULL | 3000.29 | | |
| | 格格 | female | | -- | sale | NULL | 4000.33 | | |
| | 张野 | male | | -- | operation | NULL | 10000.13 | | |
| | 程咬金 | male | | -- | operation | NULL | 20000.00 | | |
| | 程咬银 | female | | -- | operation | NULL | 19000.00 | | |
| | 程咬铜 | male | | -- | operation | NULL | 18000.00 | | |
| | 程咬铁 | female | | -- | operation | NULL | 17000.00 | | |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
rows in set (0.00 sec) mysql> select post ,max(hire_date) from employee group by post;
+-----------------------------------------+----------------+
| post | max(hire_date) |
+-----------------------------------------+----------------+
| operation | -- |
| sale | -- |
| teacher | -- |
| 老男孩驻沙河办事处外交大使 | -- |
+-----------------------------------------+----------------+
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) |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+-----------------------------------------+----------------+
| | egon | male | | -- | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | | | 老男孩驻沙河办事处外交大使 | -- |
| | alex | male | | -- | teacher | NULL | 1000000.31 | | | teacher | -- |
| | wupeiqi | male | | -- | teacher | NULL | 8300.00 | | | teacher | -- |
| | yuanhao | male | | -- | teacher | NULL | 3500.00 | | | teacher | -- |
| | liwenzhou | male | | -- | teacher | NULL | 2100.00 | | | teacher | -- |
| | jingliyang | female | | -- | teacher | NULL | 9000.00 | | | teacher | -- |
| | jinxin | male | | -- | teacher | NULL | 30000.00 | | | teacher | -- |
| | 成龙 | male | | -- | teacher | NULL | 10000.00 | | | teacher | -- |
| | 歪歪 | female | | -- | sale | NULL | 3000.13 | | | sale | -- |
| | 丫丫 | female | | -- | sale | NULL | 2000.35 | | | sale | -- |
| | 丁丁 | female | | -- | sale | NULL | 1000.37 | | | sale | -- |
| | 星星 | female | | -- | sale | NULL | 3000.29 | | | sale | -- |
| | 格格 | female | | -- | sale | NULL | 4000.33 | | | sale | -- |
| | 张野 | male | | -- | operation | NULL | 10000.13 | | | operation | -- |
| | 程咬金 | male | | -- | operation | NULL | 20000.00 | | | operation | -- |
| | 程咬银 | female | | -- | operation | NULL | 19000.00 | | | operation | -- |
| | 程咬铜 | male | | -- | operation | NULL | 18000.00 | | | operation | -- |
| | 程咬铁 | female | | -- | operation | NULL | 17000.00 | | | operation | -- |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+-----------------------------------------+----------------+
rows in set (0.00 sec) mysql> select post ,max(hire_date) from employee group by post;
+-----------------------------------------+----------------+
| post | max(hire_date) |
+-----------------------------------------+----------------+
| operation | -- |
| sale | -- |
| teacher | -- |
| 老男孩驻沙河办事处外交大使 | -- |
+-----------------------------------------+----------------+
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 |
+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+-----------------------------------------+---------------+
| | egon | male | | -- | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | | | 老男孩驻沙河办事处外交大使 | -- |
| | alex | male | | -- | teacher | NULL | 1000000.31 | | | teacher | -- |
| | 格格 | female | | -- | sale | NULL | 4000.33 | | | sale | -- |
| | 张野 | male | | -- | operation | NULL | 10000.13 | | | operation | -- |
+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+-----------------------------------------+---------------+
rows in set (0.07 sec)

2. 权限管理

root@%(表示这个root这个账号允许其他机器连接)   和 root@localhost(允许mysql安装的机器连接),是因mysql对安全性的重视。这样的区分,即使别人盗取了数据库的账号和密码,从他的机器连接到mysql的服务端,我们还是可以控制他的操作权限,也就有了更高的安全性。

权限管理
、创建账号
# 本地账号
create user 'egon1'@'localhost' identified by ''; # mysql -uegon1 -p123
# 远程帐号 #前提是31.10能拼通我服务端的ip这才有意义
create user 'egon2'@'192.168.31.10' identified by ''; # mysql -uegon2 -p123 -h 指定的是服务端ip ##运行egon2在这台机器之上登录;‘192.168.31.10’是客户端的ip地址
create user 'egon3'@'192.168.31.%' identified by ''; # mysql -uegon3 -p123 -h 服务端ip #表示egon3用户能在31这段网中任意登录
create user 'egon3'@'%' identified by ''; # 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 'kris'@'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 '';  ##创建本地账号;
Query OK, rows affected (0.39 sec) mysql> select * from mysql.user\G
*************************** . row ***************************
Host: localhost
User: root
Password:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
.....
max_connections:
max_user_connections:
plugin: mysql_native_password
authentication_string:
password_expired: N
*************************** . row ***************************
Host: 127.0.0.1
User: root
Password:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Del......
authentication_string:
password_expired: N
*************************** . row ***************************
Host: ::
User: root
Password:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
......
password_expired: N
*************************** . row ***************************
Host: localhost
User:
Password:
Select_priv: N
I.........*************************** . 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:
max_updates:
max_connections:
max_user_connections:
plugin: mysql_native_password
authentication_string:
password_expired: N
rows in set (0.05 sec) mysql> select * from mysql.db\G #查看下面的db表
*************************** . 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
*************************** . 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
rows in set (0.00 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| db2 |
| db3 |
| db4 |
| db5 |
| db6 |
| mysql |
| performance_schema |
| test |
+--------------------+
rows in set (0.68 sec) mysql> create database test_1;
Query OK, row affected (0.06 sec) mysql> create database test2;
Query OK, row affected (0.03 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| db2 |
| db3 |
| db4 |
| db5 |
| db6 |
| mysql |
| performance_schema |
| test |
| test2 |
| test_1 |
+--------------------+
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
Server version: 5.6. MySQL Community Server (GPL) Copyright (c) , , 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 |
+--------------------+
rows in set (0.00 sec) mysql> drop database test_1;
Query OK, 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
Server version: 5.6. MySQL Community Server (GPL) Copyright (c) , , 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, rows affected (0.01 sec) mysql> select * from mysql.user\G
*************************** . 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:
max_updates:
max_connections:
max_user_connections:
plugin: mysql_native_password
authentication_string:
password_expired: N
*************************** . row ***************************
Host: 127.0.0.1
User: root
Password:
Select_priv: Y
Insert_priv: Y
*************************** . row ***************************
Host: ::
User: root
Password:
Select_priv: Y
......
password_expired: N
*************************** . row ***************************
Host: localhost
User:
Password:
Select_priv: N
Insert_priv: N
Update_priv: N
.....
Create_tablespace_priv: N
ssl_type:
.....*************************** . 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:
max_updates:
max_connections:
max_user_connections:
plugin: mysql_native_password
authentication_string:
password_expired: N
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
Server version: 5.6. MySQL Community Server (GPL) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| db2 |
| db3 |
| db4 |
| db5 |
| db6 |
| mysql |
| performance_schema |
| test |
| test2 |
+--------------------+
rows in set (0.05 sec) mysql> use db1;
Database changed
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1 |
+---------------+
row in set (0.00 sec) mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| | SB |
| | SB |
+------+------+
rows in set (0.24 sec) mysql> insert into t2 values(, 'kris1',);
ERROR (): 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
Server version: 5.6. MySQL Community Server (GPL) Copyright (c) , , 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, rows affected (0.00 sec) mysql> select * from mysql.user\G
*************************** . row ***************************
......
*************************** . 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:
max_updates:
max_connections:
max_user_connections:
plugin: mysql_native_password
authentication_string:
password_expired: N
rows in set (0.00 sec)
mysql> grant select on db1.* to 'kris1'@'localhost';
Query OK, rows affected (0.00 sec) mysql> select * from mysql.db\G
*************************** . 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
*************************** . 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
*************************** . 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
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
Server version: 5.6. MySQL Community Server (GPL) Copyright (c) , , 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 |
+--------------------+
rows in set (0.00 sec) mysql> use db1;
Database changed
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1 |
+---------------+
row in set (0.00 sec) mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| | SB |
| | SB |
+------+------+
rows in set (0.00 sec) mysql> insert into t1 values(,'SB');
ERROR (): 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
Server version: 5.6. MySQL Community Server (GPL) Copyright (c) , , 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, rows affected (0.00 sec)

第八章| 2. MySQL数据库|数据操作| 权限管理的更多相关文章

  1. MySQL数据库用户和权限管理

    一.视图 视图:VIEW,虚表,保存有实表的查询结果,在视图插入的内容都会存入表中.创建方法: CREATE VIEW view_name [(column_list)] AS select_st ...

  2. 第八章| 1. MySQL数据库|库操作|表操作

    1.初识数据库 我们在编写任何程序之前,都需要事先写好基于网络操作一台主机上文件的程序(socket服务端与客户端程序),于是有人将此类程序写成一个 专门的处理软件,这就是mysql等数据库管理软件的 ...

  3. MySQL 数据库 -- 数据操作

    数据的增删改 一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过 ...

  4. Database学习 - mysql 数据库 数据操作

    mysql数据操作 查询语法 select * | field1,field1 ... from 表名 where 条件 group by 字段 having 筛选 order by 字段 limit ...

  5. mysql数据库用户和权限管理记录

    一.MySQL用户的基本说明: 1.1 用户的基本结构MySQL的用户:用户名@主机 ■用户名:16个字符以内■主机:可以是主机名.IP地址.网络地址等主机名:www.111cn.net,localh ...

  6. spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)

    一,用数据库实现权限管理要注意哪些环节? 1,需要生成spring security中user类的派生类,用来保存用户id和昵称等信息, 避免页面上显示用户昵称时需要查数据库 2,如果需要在页面上显示 ...

  7. MySQL数据库----数据操作

    注意的几点:1.如果你在cmd中书命令的时候,输入错了就用\c跳出 2.\s查看配置信息 一.操作文件夹(库) 增:create database db1 charset utf8; 删:drop d ...

  8. 数据库 MySQL 之 数据操作

    数据库 MySQL 之 数据操作 一.MySQL数据类型介绍 MySQL支持多种类型,大致可以分为四类:数值.字符串类型.日期/时间和其他类型. ①二进制类型 bit[(M)] 二进制位(101001 ...

  9. MySQL数据库数据存放位置修改

    MySQL数据库数据存放位置修改 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方 ...

随机推荐

  1. static, const

    static 静态的,类的静态成员函数,静态成员变量是和类相关的,但不和具体对象相关.即使没有具体对象,也能调用类的静态成员函数和成员变量.一般类的静态函数就是一个全局函数,只是作用域在包含它的文件中 ...

  2. [HAOI2018]奇怪的背包 (DP,数论)

    [HAOI2018]奇怪的背包 \(solution:\) 首先,这一道题目的描述很像完全背包,但它所说的背包总重量是在模P意义下的,所以肯定会用到数论.我们先分析一下,每一个物品可以放无数次,可以达 ...

  3. Node.js的基本操作(使用Vue前必学)

    安装 Windows下不需要讲,Mac下的安装步骤: https://www.cnblogs.com/bobi1234/category/1367458.html 全局安装淘宝镜像 npm insta ...

  4. I - Interesting Calculator (bfs使用优先队列求步数最小或者花费最小)

    题目链接:https://cn.vjudge.net/contest/245287#problem/I 代码: 使用普通的队列和优先队列相比,优先队列能更快地找到目的变量. #include<i ...

  5. mysql原理~undo管理

    一 简介:undo管理 二 各版本说明 1 5.5     undo位置:默认ibdata1中,不支持独立表空间   缺点:大事务可能造成ibdata1暴涨,只能dump导出导入或者从新搭建  参数: ...

  6. [转]find命令之exec

    find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释:    -exec  参数后面跟的是comm ...

  7. BackBone结合ASP.NET MVC实现页面路由操作

    1. 问题的背景 什么是页面路由操作,就是通过浏览器地址栏的标记来实现页面内部的一些操作,这些操作具有异步性和持久性.应用场景主要有页面操作过程中的添加收藏夹的操作.后退操作等过程中能完全恢复界面. ...

  8. Qt5 json 数据处理

    QT4中使用第三方库QJson解析JSON文件. QT5新增加了处理JSON的类,类均以QJson开头,包含在QtCore模块中. 用到的头文件 #include <QJsonArray> ...

  9. centos6.5生产环境编译安装nginx-1.11.3并增加第三方模块ngx_cache_purge、nginx_upstream_check、ngx_devel_kit、lua-nginx

    1.安装依赖包 yum install -y gcc gcc-c++ pcre-devel openssl-devel geoip-devel 2.下载需要的安装包 LuaJIT-2.0.4.zip ...

  10. Python-生产者消费模型 线程

    7.生产者消费者模型(*****)(思聪吃热狗代码) 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题. 该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度 为什么要使 ...