主要内容:
一、单表查询的语法
二、关键字的执行优先级
三、简单查询
四、where约束
五、分组查询 group by
六、having过滤
七、查询排序 order by
八、限制查询的记录数 limit
九、使用正则表达式查询
扫描二维码关注公众号,回复:
945214 查看本文章
1️⃣ 单表查询的语法
SELECT 字段1,字段2... FROM 表名
WHERE 条件
GROUP BY field
HAVING 筛选
ORDER BY field
LIMIT 限制条数
2️⃣ 关键字的执行优先级
重点中的重点:关键字的执行优先级(从上至下)
from # 找到表
where # 拿着where指定的约束条件,去文件/表中取出一条条记录
group by # 将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
having # 将分组的结果进行having过滤
select # 执行select
distinct # 去重
order by # 将结果按条件排序
limit # 限制结果的显示条数
3️⃣ 简单查询
company.employee
员工id id int
姓名 emp_name varchar
性别 sex enum
年龄 age int
入职日期 hire_date date
岗位 post varchar
职位描述 post_comment varchar
薪水 salary double
办公室 office int
部门编号 depart_id int
1、创建表
create table employee(
id int not null unique auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male',
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int,
depart_id int
);
2、查看表结构
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 | |
+--------------+-----------------------+------+-----+---------+----------------+
3、插入记录
#三个部门:教学,销售,运营
insert into employee(name,sex,age,hire_date,post,salary,office,depart_id) values
('egon','male',18,'20170301','老男孩驻沙河办事处外交大使',7300.33,401,1), #以下是教学部
('alex','male',78,'20150302','teacher',1000000.31,401,1),
('wupeiqi','male',81,'20130305','teacher',8300,401,1),
('yuanhao','male',73,'20140701','teacher',3500,401,1),
('liwenzhou','male',28,'20121101','teacher',2100,401,1),
('jingliyang','female',18,'20110211','teacher',9000,401,1),
('jinxin','male',18,'19000301','teacher',30000,401,1),
('成龙','male',48,'20101111','teacher',10000,401,1),
('歪歪','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('丫丫','female',38,'20101101','sale',2000.35,402,2),
('丁丁','female',18,'20110312','sale',1000.37,402,2),
('星星','female',18,'20160513','sale',3000.29,402,2),
('格格','female',28,'20170127','sale',4000.33,402,2),
('张野','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3)
;
#ps:如果在windows系统中,插入中文字符,select的结果为空白,可以将所有字符编码统一设置成gbk
4、简单查询
SELECT id,name,sex,age,hire_date,post,post_comment,salary,office,depart_id
FROM employee; # 等同于 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)
select name,salary from employee;
结果如下:
+------------+------------+
| 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 |
+------------+------------+
18 rows in set (0.00 sec)
5、避免重复 DISTINCT
select distinct post from employee;
查询结果如下:
+-----------------------------------------+
| post |
+-----------------------------------------+
| 老男孩驻沙河办事处外交大使 |
| teacher |
| sale |
| operation |
+-----------------------------------------+
4 rows in set (0.00 sec)
6、通过四则运算查询
SELECT name, salary*12 FROM employee; # 计算年薪
SELECT name, salary*12 AS Annual_salary FROM employee; # 计算年薪并重命名为 Annual_salary
SELECT name, salary*12 Annual_salary FROM employee; # 计算年薪并重命名为 Annual_salary,省略as
查询结果如下:
+------------+---------------+
| name | Annual_salary |
+------------+---------------+
| egon | 87603.96 |
| alex | 12000003.72 |
| wupeiqi | 99600.00 |
| yuanhao | 42000.00 |
| liwenzhou | 25200.00 |
| jingliyang | 108000.00 |
| jinxin | 360000.00 |
| 成龙 | 120000.00 |
| 歪歪 | 36001.56 |
| 丫丫 | 24004.20 |
| 丁丁 | 12004.44 |
| 星星 | 36003.48 |
| 格格 | 48003.96 |
| 张野 | 120001.56 |
| 程咬金 | 240000.00 |
| 程咬银 | 228000.00 |
| 程咬铜 | 216000.00 |
| 程咬铁 | 204000.00 |
+------------+---------------+
18 rows in set (0.00 sec)
7、定义显示格式
CONCAT() 函数用于连接字符串
SELECT CONCAT('姓名: ',name,' 年薪: ', salary*12) AS Annual_salary
FROM employee;
+-----------------------------------------+
| Annual_salary |
+-----------------------------------------+
| 姓名:egon 年薪:87603.96 |
| 姓名:alex 年薪:12000003.72 |
| 姓名:wupeiqi 年薪:99600.00 |
| 姓名:yuanhao 年薪:42000.00 |
| 姓名:liwenzhou 年薪:25200.00 |
| 姓名:jingliyang 年薪:108000.00 |
| 姓名:jinxin 年薪:360000.00 |
| 姓名:成龙 年薪:120000.00 |
| 姓名:歪歪 年薪:36001.56 |
| 姓名:丫丫 年薪:24004.20 |
| 姓名:丁丁 年薪:12004.44 |
| 姓名:星星 年薪:36003.48 |
| 姓名:格格 年薪:48003.96 |
| 姓名:张野 年薪:120001.56 |
| 姓名:程咬金 年薪:240000.00 |
| 姓名:程咬银 年薪:228000.00 |
| 姓名:程咬铜 年薪:216000.00 |
| 姓名:程咬铁 年薪:204000.00 |
+-----------------------------------------+
18 rows in set (0.00 sec)
CONCAT_WS() 第一个参数为分隔符
SELECT CONCAT_WS(':',name,salary*12) AS Annual_salary
FROM employee;
+----------------------+
| Annual_salary |
+----------------------+
| egon:87603.96 |
| alex:12000003.72 |
| wupeiqi:99600.00 |
| yuanhao:42000.00 |
| liwenzhou:25200.00 |
| jingliyang:108000.00 |
| jinxin:360000.00 |
| 成龙:120000.00 |
| 歪歪:36001.56 |
| 丫丫:24004.20 |
| 丁丁:12004.44 |
| 星星:36003.48 |
| 格格:48003.96 |
| 张野:120001.56 |
| 程咬金:240000.00 |
| 程咬银:228000.00 |
| 程咬铜:216000.00 |
| 程咬铁:204000.00 |
+----------------------+
18 rows in set (0.00 sec)
练习题:
1、 查出所有员工的名字,薪资,格式为<名字:egon><薪资:3000>
2、查出所有的岗位(去掉重复)
3、查出所有员工名字,以及他们的年薪,年薪的字段名为annual_year
参考结果:
mysql> select concat('<','名字:',name,'>','<','薪资:','salary','>') from employee;
+---------------------------------------------------------------+
| concat('<','名字:',name,'>','<','薪资:','salary','>') |
+---------------------------------------------------------------+
| <名字:egon><薪资:salary> |
| <名字:alex><薪资:salary> |
| <名字:wupeiqi><薪资:salary> |
| <名字:yuanhao><薪资:salary> |
| <名字:liwenzhou><薪资:salary> |
| <名字:jingliyang><薪资:salary> |
| <名字:jinxin><薪资:salary> |
| <名字:成龙><薪资:salary> |
| <名字:歪歪><薪资:salary> |
| <名字:丫丫><薪资:salary> |
| <名字:丁丁><薪资:salary> |
| <名字:星星><薪资:salary> |
| <名字:格格><薪资:salary> |
| <名字:张野><薪资:salary> |
| <名字:程咬金><薪资:salary> |
| <名字:程咬银><薪资:salary> |
| <名字:程咬铜><薪资:salary> |
| <名字:程咬铁><薪资:salary> |
+---------------------------------------------------------------+
18 rows in set (0.00 sec)
mysql> select distinct depart_id from employee;
+-----------+
| depart_id |
+-----------+
| 1 |
| 2 |
| 3 |
+-----------+
3 rows in set (0.00 sec)
mysql> select name,salary*12 as annual_salary from employee;
+------------+---------------+
| name | annual_salary |
+------------+---------------+
| egon | 87603.96 |
| alex | 12000003.72 |
| wupeiqi | 99600.00 |
| yuanhao | 42000.00 |
| liwenzhou | 25200.00 |
| jingliyang | 108000.00 |
| jinxin | 360000.00 |
| 成龙 | 120000.00 |
| 歪歪 | 36001.56 |
| 丫丫 | 24004.20 |
| 丁丁 | 12004.44 |
| 星星 | 36003.48 |
| 格格 | 48003.96 |
| 张野 | 120001.56 |
| 程咬金 | 240000.00 |
| 程咬银 | 228000.00 |
| 程咬铜 | 216000.00 |
| 程咬铁 | 204000.00 |
+------------+---------------+
18 rows in set (0.00 sec)
4️⃣ WHERE约束
比较运算符:><>= <= <> !=
between 80 and 100 值在10到20之间
in(80,90,100) 值是10或20或30
like 'egon%'
pattern可以是%或_,
%表示任意多字符
_表示一个字符
逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not
1、单条件查询
mysql> select name from employee where post = 'sale';
+--------+
| name |
+--------+
| 歪歪 |
| 丫丫 |
| 丁丁 |
| 星星 |
| 格格 |
+--------+
5 rows in set (0.00 sec)
2、多条件查询
SELECT name,salary FROM employee
WHERE post='teacher' AND salary>10000;
+--------+------------+
| name | salary |
+--------+------------+
| alex | 1000000.31 |
| jinxin | 30000.00 |
+--------+------------+
2 rows in set (0.00 sec)
3、关键字BETWEEN AND
SELECT name,salary FROM employee
WHERE salary BETWEEN 10000 AND 20000; # 所查数据在某一范围内
+-----------+----------+
| name | salary |
+-----------+----------+
| 成龙 | 10000.00 |
| 张野 | 10000.13 |
| 程咬金 | 20000.00 |
| 程咬银 | 19000.00 |
| 程咬铜 | 18000.00 |
| 程咬铁 | 17000.00 |
+-----------+----------+
6 rows in set (0.00 sec)
SELECT name,salary FROM employee
WHERE salary NOT BETWEEN 10000 AND 20000; # 所查数据不在某一范围内
+------------+------------+
| name | salary |
+------------+------------+
| egon | 7300.33 |
| alex | 1000000.31 |
| wupeiqi | 8300.00 |
| yuanhao | 3500.00 |
| liwenzhou | 2100.00 |
| jingliyang | 9000.00 |
| jinxin | 30000.00 |
| 歪歪 | 3000.13 |
| 丫丫 | 2000.35 |
| 丁丁 | 1000.37 |
| 星星 | 3000.29 |
| 格格 | 4000.33 |
+------------+------------+
12 rows in set (0.00 sec)
4、关键字 IS NULL(判断某个字段是否为NULL不能用等号,需要用 IS)
SELECT name,post_comment FROM employee
WHERE post_comment IS NULL;
+------------+--------------+
| name | post_comment |
+------------+--------------+
| egon | NULL |
| alex | NULL |
| wupeiqi | NULL |
| yuanhao | NULL |
| liwenzhou | NULL |
| jingliyang | NULL |
| jinxin | NULL |
| 成龙 | NULL |
| 歪歪 | NULL |
| 丫丫 | NULL |
| 丁丁 | NULL |
| 星星 | NULL |
| 格格 | NULL |
| 张野 | NULL |
| 程咬金 | NULL |
| 程咬银 | NULL |
| 程咬铜 | NULL |
| 程咬铁 | NULL |
+------------+--------------+
18 rows in set (0.00 sec)
SELECT name,post_comment FROM employee
WHERE post_comment IS NOT NULL;
Empty set (0.00 sec)
SELECT name,post_comment FROM employee
WHERE post_comment=''; 注意''是空字符串,不是null
Empty set (0.00 sec)
执行
update employee set post_comment='' where id=2;
再用上条查看效果
mysql> update employee set post_comment='' where id=2;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT name,post_comment FROM employee
-> WHERE post_comment='';
+------+--------------+
| name | post_comment |
+------+--------------+
| alex | |
+------+--------------+
1 row in set (0.00 sec)
5、关键字 IN 集合查询
SELECT name,salary FROM employee
WHERE salary=3000 OR salary=3500 OR salary=4000 OR salary=9000 ;
SELECT name,salary FROM employee
WHERE salary IN (3000,3500,4000,9000) ;
上面两条语句的查询结果完全相同:
+------------+---------+
| name | salary |
+------------+---------+
| yuanhao | 3500.00 |
| jingliyang | 9000.00 |
+------------+---------+
2 rows in set (0.00 sec)
SELECT name,salary FROM employee
WHERE salary NOT IN (3000,3500,4000,9000) ; # 查询不在某一集合的范围内的数据
+-----------+------------+
| name | salary |
+-----------+------------+
| egon | 7300.33 |
| alex | 1000000.31 |
| wupeiqi | 8300.00 |
| liwenzhou | 2100.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 |
+-----------+------------+
16 rows in set (0.00 sec)
6、关键字 LIKE 模糊查询
通配符’%’ # 匹配多个字符
SELECT * FROM employee
WHERE name LIKE 'eg%';
通配符’_’ # 每个匹配一字符
SELECT * FROM employee
WHERE name LIKE 'al__';
练习题:
1. 查看岗位是teacher的员工姓名、年龄
2. 查看岗位是teacher且年龄大于30岁的员工姓名、年龄
3. 查看岗位是teacher且薪资在9000-1000范围内的员工姓名、年龄、薪资
4. 查看岗位描述不为NULL的员工信息
5. 查看岗位是teacher且薪资是10000或9000或30000的员工姓名、年龄、薪资
6. 查看岗位是teacher且薪资不是10000或9000或30000的员工姓名、年龄、薪资
7. 查看岗位是teacher且名字是jin开头的员工姓名、年薪
select name,age from employee where post = 'teacher';
select name,age from employee where post='teacher' and age > 30;
select name,age,salary from employee where post='teacher' and salary between 9000 and 10000;
select * from employee where post_comment is not null;
select name,age,salary from employee where post='teacher' and salary in (10000,9000,30000);
select name,age,salary from employee where post='teacher' and salary not in (10000,9000,30000);
select name,salary*12 from employee where post='teacher' and name like 'jin%';
未完,待续...