准备工作
准备表company.employee5
mysql> create database company; Query OK, 1 row affected (0.00 sec) mysql> use company; Database changed mysql> create table company.employee5( -> id int primary key auto_increment not null, -> name varchar(30) not null, -> sex enum('male','female') default 'male' not null, -> hire_date date not null, -> post varchar(50) not null, -> job_description varchar(100), -> salary double(15,2) not null, -> office int, -> dep_id int -> ); Query OK, 0 rows affected (0.24 sec)
插入数据
mysql> insert into company.employee5(name,sex,hire_date,post,job_description,salary,office,dep_id) value -> ('jack','male','20180202','instructor','teach',5000,501,100), -> ('tom','male','20180203','instructor','teach',5000,501,100), -> ('robin','male','20180202','instructor','teach',8000,501,100), -> ('alice','female','20180202','instructor','teach',7200,501,100), -> ('tianyun','male','20180202','instructor','teach',600,502,100), -> ('harry','male','20180202','hr',NULL,6000,502,101), -> ('emma','female','20180206','sale','salecc',20000,503,102), -> ('christine','female','20180205','sale',NULL,2200,503,102), -> ('zhuzhu','male','20180205','sale',NULL,2200,503,102), -> ('gougou','male','20180205','sale','',2200,503,102); Query OK, 10 rows affected (0.01 sec) Records: 10 Duplicates: 0 Warnings: 0
简单查询
查询表全部内容
mysql> select * from employee5; +----+-----------+--------+------------+------------+-----------------+----------+--------+--------+ | id | name | sex | hire_date | post | job_description | salary | office | dep_id | +----+-----------+--------+------------+------------+-----------------+----------+--------+--------+ | 2 | jack | male | 2018-02-02 | instructor | teach | 5000.00 | 501 | 100 | | 3 | tom | male | 2018-02-03 | instructor | teach | 5000.00 | 501 | 100 | | 4 | robin | male | 2018-02-02 | instructor | teach | 8000.00 | 501 | 100 | | 5 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 | | 6 | tianyun | male | 2018-02-02 | instructor | teach | 600.00 | 502 | 100 | | 7 | harry | male | 2018-02-02 | hr | NULL | 6000.00 | 502 | 101 | | 8 | emma | female | 2018-02-06 | sale | salecc | 20000.00 | 503 | 102 | | 9 | christine | female | 2018-02-05 | sale | NULL | 2200.00 | 503 | 102 | | 10 | zhuzhu | male | 2018-02-05 | sale | NULL | 2200.00 | 503 | 102 | | 11 | gougou | male | 2018-02-05 | sale | | 2200.00 | 503 | 102 | +----+-----------+--------+------------+------------+-----------------+----------+--------+--------+ 10 rows in set (0.00 sec)
查询表的某几个字段
mysql> select name,post,salary from employee5; +-----------+------------+----------+ | name | post | salary | +-----------+------------+----------+ | jack | instructor | 5000.00 | | tom | instructor | 5000.00 | | robin | instructor | 8000.00 | | alice | instructor | 7200.00 | | tianyun | instructor | 600.00 | | harry | hr | 6000.00 | | emma | sale | 20000.00 | | christine | sale | 2200.00 | | zhuzhu | sale | 2200.00 | | gougou | sale | 2200.00 | +-----------+------------+----------+ 10 rows in set (0.00 sec)
去重,仅用于单一字段
mysql> select distinct post from employee5; +------------+ | post | +------------+ | instructor | | hr | | sale | +------------+ 3 rows in set (0.00 sec)
计算出每个员工的年薪(14薪)
mysql> select name,salary,salary*14 from employee5; +-----------+----------+-----------+ | name | salary | salary*14 | +-----------+----------+-----------+ | jack | 5000.00 | 70000.00 | | tom | 5000.00 | 70000.00 | | robin | 8000.00 | 112000.00 | | alice | 7200.00 | 100800.00 | | tianyun | 600.00 | 8400.00 | | harry | 6000.00 | 84000.00 | | emma | 20000.00 | 280000.00 | | christine | 2200.00 | 30800.00 | | zhuzhu | 2200.00 | 30800.00 | | gougou | 2200.00 | 30800.00 | +-----------+----------+-----------+ 10 rows in set (0.00 sec)
显示别名,将salary*14显示为annual_salary
mysql> select name,salary,salary*14 as annual_salary from employee5; +-----------+----------+---------------+ | name | salary | annual_salary | +-----------+----------+---------------+ | jack | 5000.00 | 70000.00 | | tom | 5000.00 | 70000.00 | | robin | 8000.00 | 112000.00 | | alice | 7200.00 | 100800.00 | | tianyun | 600.00 | 8400.00 | | harry | 6000.00 | 84000.00 | | emma | 20000.00 | 280000.00 | | christine | 2200.00 | 30800.00 | | zhuzhu | 2200.00 | 30800.00 | | gougou | 2200.00 | 30800.00 | +-----------+----------+---------------+ 10 rows in set (0.00 sec)
定义显示格式
CONCAT()函数用来连接字符串
mysql> select concat(name,' annual salary: ',salary*14) as Annual_salary from employee5; +------------------------------------+ | Annual_salary | +------------------------------------+ | jack annual salary: 70000.00 | | tom annual salary: 70000.00 | | robin annual salary: 112000.00 | | alice annual salary: 100800.00 | | tianyun annual salary: 8400.00 | | harry annual salary: 84000.00 | | emma annual salary: 280000.00 | | christine annual salary: 30800.00 | | zhuzhu annual salary: 30800.00 | | gougou annual salary: 30800.00 | +------------------------------------+ 10 rows in set (0.00 sec)
2条件查询
单条件查询
查询职位是hr的员工
mysql> select name,post from employee5 where post='hr'; +-------+------+ | name | post | +-------+------+ | harry | hr | +-------+------+ 1 row in set (0.00 sec)
多条件查询
查看职位是"sale销售"的员工,但是薪水少于等于5000
mysql> select name,post,salary from employee5 where post='sale' and salary<=5000; +-----------+------+---------+ | name | post | salary | +-----------+------+---------+ | christine | sale | 2200.00 | | zhuzhu | sale | 2200.00 | | gougou | sale | 2200.00 | +-----------+------+---------+ 3 rows in set (0.00 sec)
关键字between and 和 not between and
查看工资5000~10000范围内的员工
mysql> select name,salary from employee5 where salary between 5000 and 10000; +-------+---------+ | name | salary | +-------+---------+ | jack | 5000.00 | | tom | 5000.00 | | robin | 8000.00 | | alice | 7200.00 | | harry | 6000.00 | +-------+---------+ 5 rows in set (0.00 sec)
查看不是这个范围的员工
mysql> select name,salary from employee5 where salary not between 5000 and 10000; +-----------+----------+ | name | salary | +-----------+----------+ | tianyun | 600.00 | | emma | 20000.00 | | christine | 2200.00 | | zhuzhu | 2200.00 | | gougou | 2200.00 | +-----------+----------+ 5 rows in set (0.00 sec)
关键字is null和is not null
空 和 非空
查看job_description职位描述字段为空的员工
mysql> select name,job_description from employee5 where job_description is null; +-----------+-----------------+ | name | job_description | +-----------+-----------------+ | harry | NULL | | christine | NULL | | zhuzhu | NULL | +-----------+-----------------+ 3 rows in set (0.00 sec)
查看job_description职位描述字段不为空的员工
mysql> select name,job_description from employee5 where job_description is not null; +---------+-----------------+ | name | job_description | +---------+-----------------+ | jack | teach | | tom | teach | | robin | teach | | alice | teach | | tianyun | teach | | emma | salecc | | gougou | | +---------+-----------------+ 7 rows in set (0.00 sec)
集合查询 in和not in
mysql> select name,salary from employee5 where salary=2000 or salary=5000 or salary=6000 or salary=20000; +-------+----------+ | name | salary | +-------+----------+ | jack | 5000.00 | | tom | 5000.00 | | harry | 6000.00 | | emma | 20000.00 | +-------+----------+ 4 rows in set (0.00 sec)
mysql> select name,salary from employee5 where salary in (2000,5000,6000,20000); +-------+----------+ | name | salary | +-------+----------+ | jack | 5000.00 | | tom | 5000.00 | | harry | 6000.00 | | emma | 20000.00 | +-------+----------+ 4 rows in set (0.00 sec) mysql> select name,salary from employee5 where salary not in (2000,5000,6000,20000); +-----------+---------+ | name | salary | +-----------+---------+ | robin | 8000.00 | | alice | 7200.00 | | tianyun | 600.00 | | christine | 2200.00 | | zhuzhu | 2200.00 | | gougou | 2200.00 | +-----------+---------+ 6 rows in set (0.00 sec)
模糊查询
- % ---- 任意多个字符
- _ ---- 任意单个字符
mysql> select name from employee5 where name like 'al%'; +-------+ | name | +-------+ | alice | +-------+ 1 row in set (0.00 sec) mysql> select name from employee5 where name like 'al_'; Empty set (0.00 sec) mysql> select name from employee5 where name like 'al___'; +-------+ | name | +-------+ | alice | +-------+ 1 row in set (0.00 sec)
3排序
单列排序
默认使用asc ,升序从小到大
mysql> select name,salary from employee5 order by salary; +-----------+----------+ | name | salary | +-----------+----------+ | tianyun | 600.00 | | christine | 2200.00 | | zhuzhu | 2200.00 | | gougou | 2200.00 | | jack | 5000.00 | | tom | 5000.00 | | harry | 6000.00 | | alice | 7200.00 | | robin | 8000.00 | | emma | 20000.00 | +-----------+----------+ 10 rows in set (0.00 sec)
降序从大到小,需要指定为desc
mysql> select name,salary from employee5 order by salary desc; +-----------+----------+ | name | salary | +-----------+----------+ | emma | 20000.00 | | robin | 8000.00 | | alice | 7200.00 | | harry | 6000.00 | | jack | 5000.00 | | tom | 5000.00 | | christine | 2200.00 | | zhuzhu | 2200.00 | | gougou | 2200.00 | | tianyun | 600.00 | +-----------+----------+ 10 rows in set (0.00 sec)
多列排序
先按入职时间降序,再按薪资升序
mysql> mysql> select name,hire_date,salary from employee5 order by hire_date desc, salary; +-----------+------------+----------+ | name | hire_date | salary | +-----------+------------+----------+ | emma | 2018-02-06 | 20000.00 | | christine | 2018-02-05 | 2200.00 | | zhuzhu | 2018-02-05 | 2200.00 | | gougou | 2018-02-05 | 2200.00 | | tom | 2018-02-03 | 5000.00 | | tianyun | 2018-02-02 | 600.00 | | jack | 2018-02-02 | 5000.00 | | harry | 2018-02-02 | 6000.00 | | alice | 2018-02-02 | 7200.00 | | robin | 2018-02-02 | 8000.00 | +-----------+------------+----------+ 10 rows in set (0.00 sec)
4限制查询的记录数
只显示排序后公司薪资最高的前5位员工
从0开始查询,共查询5条
mysql> mysql> select name,salary from employee5 order by salary desc limit 0,5; +-------+----------+ | name | salary | +-------+----------+ | emma | 20000.00 | | robin | 8000.00 | | alice | 7200.00 | | harry | 6000.00 | | jack | 5000.00 | +-------+----------+ 5 rows in set (0.00 sec)
5使用集合函数查询
函数 | 描述 |
---|---|
count() | 统计数量 |
max() | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 总和值 |
mysql> select count(*) from employee5; +----------+ | count(*) | +----------+ | 10 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from employee5 where post='hr' ; +----------+ | count(*) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec)
mysql> select max(salary) from employee5; +-------------+ | max(salary) | +-------------+ | 20000.00 | +-------------+ 1 row in set (0.00 sec) mysql> select max(salary) from employee5 where job_description='teach'; +-------------+ | max(salary) | +-------------+ | 8000.00 | +-------------+ 1 row in set (0.00 sec)
mysql> select min(salary) from employee5 where job_description='teach'; +-------------+ | min(salary) | +-------------+ | 600.00 | +-------------+ 1 row in set (0.00 sec)
mysql> select avg(salary) from employee5; +-------------+ | avg(salary) | +-------------+ | 5840.000000 | +-------------+ 1 row in set (0.00 sec) mysql> select avg(salary) from employee5 where job_description='teach'; +-------------+ | avg(salary) | +-------------+ | 5160.000000 | +-------------+ 1 row in set (0.00 sec)
mysql> select sum(salary) from employee5; +-------------+ | sum(salary) | +-------------+ | 58400.00 | +-------------+ 1 row in set (0.00 sec)
6分组查询
group_concat()函数和group by()函数通常一块使用
按照部门来分组
mysql> mysql> select post,group_concat(name) from employee5 group by post; +------------+------------------------------+ | post | group_concat(name) | +------------+------------------------------+ | hr | harry | | instructor | jack,tom,robin,alice,tianyun | | sale | emma,christine,zhuzhu,gougou | +------------+------------------------------+ 3 rows in set (0.00 sec) mysql> select post,group_concat(salary) from employee5 group by post; +------------+----------------------------------------+ | post | group_concat(salary) | +------------+----------------------------------------+ | hr | 6000.00 | | instructor | 5000.00,5000.00,8000.00,7200.00,600.00 | | sale | 20000.00,2200.00,2200.00,2200.00 | +------------+----------------------------------------+ 3 rows in set (0.00 sec)
group by()函数和集合函数一起使用
mysql> select post,sum(salary),avg(salary),count(*) from employee5 group by post; +------------+-------------+-------------+----------+ | post | sum(salary) | avg(salary) | count(*) | +------------+-------------+-------------+----------+ | hr | 6000.00 | 6000.000000 | 1 | | instructor | 25800.00 | 5160.000000 | 5 | | sale | 26600.00 | 6650.000000 | 4 | +------------+-------------+-------------+----------+ 3 rows in set (0.00 sec)
7正则表达式查询
- '^ali'-----以ali开头
- 'yun$'----以yun结尾
- 'm{2}'----m出现的次数
mysql> select name,salary from employee5 where name regexp 'm{2}'; +------+----------+ | name | salary | +------+----------+ | emma | 20000.00 | +------+----------+ 1 row in set (0.00 sec)
小结
对字符串匹配的方式
where name = 'tom'; where name like 'to%'; where name regexp 'yun$';
补充:嵌套查询
mysql> mysql> select * from employee5 where salary = (select max(salary) from employee5); +----+------+--------+------------+------+-----------------+----------+--------+--------+ | id | name | sex | hire_date | post | job_description | salary | office | dep_id | +----+------+--------+------------+------+-----------------+----------+--------+--------+ | 8 | emma | female | 2018-02-06 | sale | salecc | 20000.00 | 503 | 102 | +----+------+--------+------------+------+-----------------+----------+--------+--------+ 1 row in set (0.00 sec)