一、单表查询的语法 |
SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数
二、关键字的执行优先级(重点) |
1、from 库.表——找到表
2、where 条件——按照where指定的约束条件,去表中取出一条条记录
3、group by 分组条件——对取出的一条条记录分组,如果没有group by,整体作为一组
4、having 过滤——将分组的结果进行过滤
5、select——从虚拟表选择出需要的内容
6、distinct——去重,如果在查询中指定了DISTINCT
子句,则会创建一张内存临时表(如果内存放不下,就需要存放在硬盘了)。这张临时表的表结构和上一步产生的虚拟表VT7是一样的,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来除重复数据。
7、order by 排序字段——对虚拟表中的内容按照指定的列进行排序,然后返回一个新的虚拟表
8、limit n;——限制结果的显示条数,LIMIT
子句从上一步得到的VT8虚拟表中选出从指定位置开始的指定行数据。对于没有应用ORDER BY的LIMIT子句,得到的结果同样是无序的,所以,很多时候,我们都会看到LIMIT子句会和ORDER BY子句一起使用。
详细见:http://www.cnblogs.com/linhaifeng/articles/7372774.html
三、简单查询 |
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 #创建表 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 ); #查看表结构 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 | | +--------------+-----------------------+------+-----+---------+----------------+ #插入记录 #三个部门:教学,销售,运营 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
准备表和记录
#简单查询 SELECT id,name,sex,age,hire_date,post,post_comment,salary,office,depart_id FROM employee; SELECT * FROM employee; SELECT name,salary FROM employee; #避免重复DISTINCT SELECT DISTINCT post FROM employee; #通过四则运算查询 SELECT name, salary*12 FROM employee; SELECT name, salary*12 AS Annual_salary FROM employee; SELECT name, salary*12 Annual_salary FROM employee; #定义显示格式 CONCAT() 函数用于连接字符串 SELECT CONCAT(‘姓名: ‘,name,‘ 年薪: ‘, salary*12) AS Annual_salary FROM employee; CONCAT_WS() 第一个参数为分隔符 SELECT CONCAT_WS(‘:‘,name,salary*12) AS Annual_salary FROM employee; 结合CASE语句: SELECT ( CASE WHEN NAME = ‘egon‘ THEN NAME WHEN NAME = ‘alex‘ THEN CONCAT(name,‘_BIGSB‘) ELSE concat(NAME, ‘SB‘) END ) as new_name FROM emp;
mysql> select * from employee; +----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+ | 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 | | 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 | | 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 | | 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 | | 5 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 | | 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 | | 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 | | 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 | | 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 | | 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 | | 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 | | 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 | | 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 | | 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 | | 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 | | 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 | | 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 | | 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 | +----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+ 18 rows in set (0.00 sec) mysql> select id,name,salary from employee; +----+------------+------------+ | id | name | salary | +----+------------+------------+ | 1 | egon | 7300.33 | | 2 | alex | 1000000.31 | | 3 | wupeiqi | 8300.00 | | 4 | yuanhao | 3500.00 | | 5 | liwenzhou | 2100.00 | | 6 | jingliyang | 9000.00 | | 7 | jinxin | 30000.00 | | 8 | 成龙 | 10000.00 | | 9 | 歪歪 | 3000.13 | | 10 | 丫丫 | 2000.35 | | 11 | 丁丁 | 1000.37 | | 12 | 星星 | 3000.29 | | 13 | 格格 | 4000.33 | | 14 | 张野 | 10000.13 | | 15 | 程咬金 | 20000.00 | | 16 | 程咬银 | 19000.00 | | 17 | 程咬铜 | 18000.00 | | 18 | 程咬铁 | 17000.00 | +----+------------+------------+ 18 rows in set (0.00 sec)
简单查询
在需要去重查询时,可以利用distinct去除重复信息。
# distinct去除重复的职位信息 mysql> select distinct post from employee; +-----------------------------------------+ | post | +-----------------------------------------+ | 老男孩驻沙河办事处外交大使 | | teacher | | sale | | operation | +-----------------------------------------+ 4 rows in set (0.00 sec)
避免重复DISTINCT
利用四则运算查询(加减乘除)得到需要的查询结果。针对四则运算的字段还可以取别名,以优化显示结果。
# 查看一个人的年薪 mysql> select name, salary*12 from employee; +------------+-------------+ | name | salary*12 | +------------+-------------+ | egon | 87603.96 | | alex | 12000003.72 | | wupeiqi | 99600.00 | | yuanhao | 42000.00 | | liwenzhou | 25200.00 | | jingliyang | 108000.00 | | jinxin | 360000.00 | | 成龙 | 120000.00 | | 歪歪 | 36001.56 | | 丫丫 | 24004.20 | | 丁丁 | 12004.44 | | 星星 | 36003.48 | | 格格 | 48003.96 | | 张野 | 120001.56 | | 程咬金 | 240000.00 | | 程咬银 | 228000.00 | | 程咬铜 | 216000.00 | | 程咬铁 | 204000.00 | +------------+-------------+ 18 rows in set (0.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) # 起别名不加as的方法 mysql> select name, salary*12 Annual_salary from employee; +------------+---------------+ | name | Annual_salary | +------------+---------------+ | egon | 87603.96 | | alex | 12000003.72 | | wupeiqi | 99600.00 | | yuanhao | 42000.00 | | liwenzhou | 25200.00 | | jingliyang | 108000.00 | | jinxin | 360000.00 | | 成龙 | 120000.00 | | 歪歪 | 36001.56 | | 丫丫 | 24004.20 | | 丁丁 | 12004.44 | | 星星 | 36003.48 | | 格格 | 48003.96 | | 张野 | 120001.56 | | 程咬金 | 240000.00 | | 程咬银 | 228000.00 | | 程咬铜 | 216000.00 | | 程咬铁 | 204000.00 | +------------+---------------+ 18 rows in set (0.00 sec)
四则运算及取别名方法
利用concat和逗号自由定义显示格式
# concat()函数用于连接字符串 mysql> select concat(‘姓名:‘,name) from employee; +------------------------+ | concat(‘姓名:‘,name) | +------------------------+ | 姓名:egon | | 姓名:alex | | 姓名:wupeiqi | | 姓名:yuanhao | | 姓名:liwenzhou | | 姓名:jingliyang | | 姓名:jinxin | | 姓名:成龙 | | 姓名:歪歪 | | 姓名:丫丫 | | 姓名:丁丁 | | 姓名:星星 | | 姓名:格格 | | 姓名:张野 | | 姓名:程咬金 | | 姓名:程咬银 | | 姓名:程咬铜 | | 姓名:程咬铁 | +------------------------+ 18 rows in set (0.00 sec) mysql> select concat(‘姓名:‘,name,‘性别:‘,sex,‘年薪:‘,salary*12) as emp_info_salary from employee; # as设置查询结果标题 +------------------------------------------------+ | emp_info_salary | +------------------------------------------------+ | 姓名:egon性别:male年薪:87603.96 | | 姓名:alex性别:male年薪:12000003.72 | | 姓名:wupeiqi性别:male年薪:99600.00 | | 姓名:yuanhao性别:male年薪:42000.00 | | 姓名:liwenzhou性别:male年薪:25200.00 | | 姓名:jingliyang性别:female年薪:108000.00 | | 姓名:jinxin性别:male年薪:360000.00 | | 姓名:成龙性别:male年薪:120000.00 | | 姓名:歪歪性别:female年薪:36001.56 | | 姓名:丫丫性别:female年薪:24004.20 | | 姓名:丁丁性别:female年薪:12004.44 | | 姓名:星星性别:female年薪:36003.48 | | 姓名:格格性别:female年薪:48003.96 | | 姓名:张野性别:male年薪:120001.56 | | 姓名:程咬金性别:male年薪:240000.00 | | 姓名:程咬银性别:female年薪:228000.00 | | 姓名:程咬铜性别:male年薪:216000.00 | | 姓名:程咬铁性别:female年薪:204000.00 | +------------------------------------------------+ 18 rows in set (0.00 sec) # 想把薪资单独分出来,用concat和逗号拼接出想要的格式 mysql> select concat(‘姓名:‘,name,‘性别:‘,sex) as info, concat(‘年薪:‘, salary*12) as annual_salary from employee; +--------------------------------+--------------------+ | info | annual_salary | +--------------------------------+--------------------+ | 姓名:egon性别:male | 年薪:87603.96 | | 姓名:alex性别:male | 年薪:12000003.72 | | 姓名:wupeiqi性别:male | 年薪:99600.00 | | 姓名:yuanhao性别:male | 年薪:42000.00 | | 姓名:liwenzhou性别:male | 年薪:25200.00 | | 姓名:jingliyang性别:female | 年薪:108000.00 | | 姓名:jinxin性别:male | 年薪:360000.00 | | 姓名:成龙性别:male | 年薪:120000.00 | | 姓名:歪歪性别:female | 年薪:36001.56 | | 姓名:丫丫性别:female | 年薪:24004.20 | | 姓名:丁丁性别:female | 年薪:12004.44 | | 姓名:星星性别:female | 年薪:36003.48 | | 姓名:格格性别:female | 年薪:48003.96 | | 姓名:张野性别:male | 年薪:120001.56 | | 姓名:程咬金性别:male | 年薪:240000.00 | | 姓名:程咬银性别:female | 年薪:228000.00 | | 姓名:程咬铜性别:male | 年薪:216000.00 | | 姓名:程咬铁性别:female | 年薪:204000.00 | +--------------------------------+--------------------+ 18 rows in set (0.00 sec)
concat()函数连接字符串
# concat_ws() 第一个参数为分隔符,处理多条记录+分隔符更方便 mysql> select concat_ws(‘:‘, name, sex, salary) as emp_info from employee; +---------------------------+ | emp_info | +---------------------------+ | egon:male:7300.33 | | alex:male:1000000.31 | | wupeiqi:male:8300.00 | | yuanhao:male:3500.00 | | liwenzhou:male:2100.00 | | jingliyang:female:9000.00 | | jinxin:male:30000.00 | | 成龙:male:10000.00 | | 歪歪:female:3000.13 | | 丫丫:female:2000.35 | | 丁丁:female:1000.37 | | 星星:female:3000.29 | | 格格:female:4000.33 | | 张野:male:10000.13 | | 程咬金:male:20000.00 | | 程咬银:female:19000.00 | | 程咬铜:male:18000.00 | | 程咬铁:female:17000.00 | +---------------------------+ 18 rows in set (0.00 sec)
concat_ws()优化处理记录和分隔符
结合case语句,自定义复杂的显示格式。
# 结合CASE语句 mysql> SELECT -> ( -> CASE -> WHEN NAME = ‘egon‘ THEN -> NAME -> WHEN NAME = ‘alex‘ THEN -> CONCAT(name,‘_BIGSB‘) -> ELSE -> concat(NAME, ‘SB‘) -> END -> ) as new_name -> FROM -> employee; +--------------+ | new_name | +--------------+ | egon | | alex_BIGSB | | wupeiqiSB | | yuanhaoSB | | liwenzhouSB | | jingliyangSB | | jinxinSB | | 成龙SB | | 歪歪SB | | 丫丫SB | | 丁丁SB | | 星星SB | | 格格SB | | 张野SB | | 程咬金SB | | 程咬银SB | | 程咬铜SB | | 程咬铁SB | +--------------+ 18 rows in set (0.00 sec)
CASE语句自定义查询结果
小练习:
1、查出所有员工的名字,薪资,格式为 <名字:egon> <薪资:3000>
2、查出所有岗位(去掉重复)
3、查出所有员工名字,以及他们的年薪,年薪字段名为annual_year
mysql> select concat("<名字:",name,">") as NAME, concat("<薪资:",salary,">") as 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) mysql> select distinct post from employee; +-----------------------------------------+ | post | +-----------------------------------------+ | 老男孩驻沙河办事处外交大使 | | teacher | | sale | | operation | +-----------------------------------------+ 4 rows in set (0.00 sec) mysql> select name, salary*12 as annual_year from employee; +------------+-------------+ | name | annual_year | +------------+-------------+ | 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)
练习题答案
四、WHERE约束 |
原文地址:https://www.cnblogs.com/xiugeng/p/9028541.html