第八章| 2. MySQL数据库|数据操作| 权限管理
Posted 李卓航
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第八章| 2. MySQL数据库|数据操作| 权限管理相关的知识,希望对你有一定的参考价值。
1、数据操作
SQL(结构化查询语言),可以操作关系型数据库
通过sql可以创建、修改账号并控制账号权限; 通过sql可以创建、修改数据库、表; 通过sql可以增删改查数据;
可以通过SQL语句中的DML语言来实现数据的操作,包括
- 使用INSERT实现数据的插入
- UPDATE实现数据的更新
- 使用DELETE实现数据的删除
- 使用SELECT查询数据以及。
1.1数据的增删改查
插入数据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用户以外的所有用户
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 | | +--------------+-----------------------+------+-----+---------+----------------+ 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 | +----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+ 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 | +----+------------+------------+ 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*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 | +------------+-------------+ 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 | +------------+---------------+ 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*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 | +--------------------------------+--------------------+ 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 | +------------------------+ 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 | +--------------------------------+ 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 > 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 | +----+-----------+-----+ 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 | +------------+---------+------------+ 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 | +-----------+----------+ 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 | +-----------+----------+ 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 | +------------+------------+ 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 | +------------+------------+ 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 | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ 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 | +----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+ | 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 | +----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+ 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 | +----+--------+------+-----+------------+---------+--------------+----------+--------+-----------+ | 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 |401 | 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 | +----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+ rows in set (0.08 sec) #由于没有设置ONLY_FULL_GROUP_BY,于是也可以有结果,默认都是组内的第一条记录(就是按照post分组,如operation组内的第一条记录。),但其实这是没有意义的 mysql> set global sql_mode="ONLY_FULL_GROUP_BY"; Query OK, 0 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 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 | | 老男孩驻沙河办事处外交大使 | +-----------------------------------------+ rows in set (0.00 sec) mysql> select post,count(id) as emp_count from employee group by post; #查询组内的id数 +-----------------------------------------+-----------+ | post | emp_count | +-----------------------------------------+-----------+ | operation | 5 | | sale | 5 | | teacher | 7 | | 老男孩驻沙河办事处外交大使 | 1 | +-----------------------------------------+-----------+ 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)
#练习:
1. 查询岗位名以及岗位包含的所有员工名字 #先确定你查的是哪张表,有没有过滤条件where,有没有分组分类的; 2. 先取出年龄在50以上的然后再 查询岗位名以及各岗位内包含的员工个数 3. 查询公司内男员工和女员工的个数 4. 查询岗位名以及各岗位的平均薪资 5. 查询岗位名以及各岗位的最高薪资 6. 查询岗位名以及各岗位的最低薪资 7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
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 >50 group by post; +---------+-----------+ | post | count(id) | +---------+-----------+ | teacher | 3 | +---------+-----------+ row in set (0.00 sec) mysql> select sex,count(id) from employee group by sex; +--------+-----------+ | sex | count(id) | +--------+-----------+ | male | 10 | | female | 8 | +--------+-----------+ 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 | +--------+----------+ rows in set (0.06 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 |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) < 2; +-----------------------------------------+--------------------+-----------+ | post | group_concat(name) | count(id) | +-----------------------------------------+--------------------+-----------+ | 老男孩驻沙河办事处外交大使 | egon | 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 | +-----------+--------------+ 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 | ma以上是关于第八章| 2. MySQL数据库|数据操作| 权限管理的主要内容,如果未能解决你的问题,请参考以下文章