数据基本查询小总结
查询语句编写顺序:
SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 过滤条件 ORDER BY 排序列(asc|desc)LIMIT 起始⾏,总条数
select执行顺序:
1.FROM :指定数据来源表
2.WHERE : 对查询数据做第⼀次过滤
3.GROUP BY : 分组
4.HAVING : 对分组后的数据第⼆次过滤
5.SELECT : 查询各字段的值
6.ORDER BY : 排序
7.LIMIT : 限定查询结果
链接查询(子查询,合并查询,内连接,左外连接,右外连接,多表连接)
子查询做条件:
SELECT 列名 FROM 表名 WHERE 条件 (⼦查询结果)
#2.查询⼯资⼤于 Bruce 的员⼯信息
SELECT * FROM t_employees WHERE SALARY > (SELECT SALARY FROM t_employees WHERE FIRST_NAME = 'Bruce')
注意:将⼦查询 ”⼀⾏⼀列“的结果作为外部查询的条件,做第⼆次查询 ⼦查询 得到⼀⾏⼀列的结果才能作为外部查询的等值判断条件或不等值条件判
子查询做枚举条件:
SELECT 列名 FROM 表名 Where 列名 in(⼦查询结果)
#查询与名为'King'同⼀部⻔的员⼯信息
SELECT employee_id , first_name , salary , department_id FROM t_employees WHERE department_id in (SELECT department_id cfrom t_employees WHERE last_name = 'King')
将⼦查询 ”多⾏⼀列“的结果作为外部查询的枚举查询条件,做第⼆次查询
#查询⾼于 60 部⻔的⼯资的员⼯信息(any⾼于部分,all高于所有) select * from t_employees where SALARY > ANY(select SALARY from t_employees WHERE DEPARTMENT_ID=60);
当⼦查询结果集形式为多⾏单列时可以使⽤ ANY 或 ALL 关键字
子查询作为一张表:
SELECT 列名 FROM(⼦查询的结果集)WHERE 条件
#查询员⼯表中⼯资排名前 5 名的员⼯信息
select employee_id , first_name , salary from (select employee_id , first_name , salary from t_employees order by salary desc) as temp limit 0,5;
将⼦查询 ”多⾏多列“的结果作为外部查询的⼀张表,做第⼆次查询。 注意:⼦ 查询作为临时表,为其赋予⼀个临时表名
合并查询
SELECT * FROM 表名 1 UNION SELECT * FROM 表名 2
SELECT * FROM 表名 1 UNION ALL SELECT * FROM 表名 2
#合并两张表的结果(去除重复记录)
SELECT * FROM t1 UNION SELECT * FROM t2
注意:合并结果的两张表,列数必须相同,列的数据类型可以不同
#合并两张表的结果(保留重复记录)
SELECT * FROM t1 UNION ALL SELECT * FROM t2
经验:使⽤ UNION 合并结果集,会去除掉两张表中重复的数据
SELECT 列名 FROM 表 1 连接⽅式 表 2 ON 连接条件
内连接查询(INNER JOIN ON)
#1.查询所有有部⻔的员⼯信息(不包括没有部⻔的员⼯) SQL 标准
SELECT * FROM t_employees INNER JOIN t_jobs ON t_employees.JOB_ID = t_jobs.JOB_ID
#2.查询所有有部⻔的员⼯信息(不包括没有部⻔的员⼯) MYSQL
SELECT * FROM t_employees,t_jobs WHERE t_employees.JOB_ID = t_jobs.JOB_ID
经验:在 MySql 中,第⼆种⽅式也可以作为内连接查询,但是不符合 SQL 标 准 ⽽第⼀种属于 SQL 标准,与其他关系型数据库通用
三表连接查询
#查询所有员⼯⼯号、名字、部⻔名称、部⻔所在国家ID
SELECT * FROM t_employees e INNER JOIN t_departments d on e.department_id = d.department_id INNER JOIN t_locations l ON d.location_id = l.location_id
左外连接(LEFT JOIN ON)
#查询所有员⼯信息,以及所对应的部⻔名称(没有部⻔的员⼯,也在查询结果 中,部⻔名称以NULL 填充)
SELECT e.employee_id , e.first_name , e.salary , d.department_name FROM t_employees e LEFT JOIN t_departments d ON e.department_id = d.department_id;
注意:左外连接,是以左表为主表,依次向右匹配,匹配到,返回结果
右外连接,是以右表为主表,依次向左匹配,匹配到,返回结果
匹配不到,则返回 NULL 值填充
右外连接(RIGHT JOIN ON)
#查询所有部⻔信息,以及此部⻔中的所有员⼯信息(没有员⼯的部⻔,也在查 询结果中,员⼯信息以NULL 填充)
SELECT e.employee_id , e.first_name , e.salary , d.department_name FROM t_employees e RIGHT JOIN t_departments d ON e.department_id = d.department_id