标题
SQL实战(二)
课程价值
- 掌握 SQL 单表和多表查询
大纲
- 单表查询
- 多表查询
时长
90分钟
PPT
https://pdf.ceshiren.com/lg2/SQL实战2
实战内容
单表查询
条件查询语法
- 通配:WHERE <列名> LIKE <字符表达式>
- 范围限定:WHERE <列名> BETWEEN <起始表达式> AND <结束表达式>
- 子集:in
- 为空:is/is not null
条件查询练习
– 查询出生日期晚于1965-01-01的员工编号、姓名和生日
SELECT
emp_no, first_name, last_name, birth_date
FROM
employees
WHERE
birth_date > ‘1965-01-01’;
– 查询名字中包含’fai’的员工的信息
SELECT
*
FROM
employees
WHERE
first_name LIKE ‘%fai%’;
– 查询名字中’fa’开头的名字长度为3位的员工信息
SELECT
*
FROM
employees
WHERE
first_name LIKE ‘fa_’;
– 查询年薪介于70000到70003之间的员工编号和年薪
SELECT
emp_no, salary
FROM
salaries
WHERE
salary BETWEEN 70000 AND 70003;
– 查询名字在Berni和Bezalel之间的员工编号和名字
SELECT
emp_no, first_name
FROM
employees
WHERE
first_name BETWEEN ‘Berni’ AND ‘Bezalel’;
– 查询入职日期为1995-01-27和1995-03-20日的员工信息
SELECT
*
FROM
employees
WHERE
hire_date IN (‘1995-01-27’ , ‘1995-03-20’);
– 查询学生表中姓名为空的学生信息
SELECT
*
FROM
hogwarts_demo.students
WHERE
name IS NULL;
– 查询名字为Lillian并且姓氏为Haddadi的员工信息
SELECT
*
FROM
employees
WHERE
first_name = ‘Lillian’
AND last_name = ‘Haddadi’;
– 查询名字为Lillian或者姓氏为Terkki的员工信息
SELECT
*
FROM
employees
WHERE
first_name = ‘Lillian’
OR last_name = ‘Terkki’;
– 查询名字不为Lillian并且性别不是女的员工信息
SELECT
*
FROM
employees
WHERE
first_name != ‘Lillian’
AND NOT gender = ‘F’;
聚合查询
聚合函数练习
– 查询职级名称为Senior Engineer的员工数量
select count(*) from titles where title = ‘Senior Engineer’;
– 查询员工编号为10002的员工的最高年薪
select max(salary) from salaries where emp_no = ‘10002’;
– 查询员工编号为10002的员工的最低年薪
select min(salary) from salaries where emp_no = ‘10002’;
– 查询员工编号为10002的员工的薪水总和
select sum(salary) from salaries where emp_no = ‘10002’;
– 查询员工编号为10002的员工的平均年薪
select avg(salary) from salaries where emp_no = ‘10002’;
聚合查询练习
– 查询每个员工的薪资和
select emp_no, sum(salary) from salaries group by emp_no;
– 查询员工编号小于10010的,薪资和小于400000的员工的薪资和
SELECT
emp_no, SUM(salary)
FROM
salaries
WHERE
emp_no < 10010
GROUP BY emp_no
HAVING SUM(salary) < 400000;
子句小结
- WHERE子句:从数据源中去掉不符合其搜索条件的数据
- GROUP BY子句:搜集数据行到各个组中,统计函数为各个组计算统计值
- HAVING子句:去掉不符合其组搜索条件的各行数据行
基础查询语法总结
select <列名>
from <表名>
where <查询条件表达式>
group by <分组的列名>
having <分组后查询条件表达式>
order by <排序列名> [ASC或者DESC]
limte [开始的行数], <查询记录的条数>
多表查询
表连接
语法
SELECT *
FROM
表名1 别名1
INNER/LEFT/RIGHT JOIN
表名2 别名2
ON
别名1.外键列 = 别名2.主键列;
表连接练习
– 查询员工编号为10001的员工的生日,姓名,部门编号和部门名称
SELECT
birth_date, first_name, last_name, d.dept_no, dept_name
FROM
employees e
INNER JOIN
dept_emp de ON e.emp_no = de.emp_no
INNER JOIN
departments d ON d.dept_no = de.dept_no
WHERE
e.emp_no = ‘10001’;
– 取出客服部门的历任管理者
SELECT
*
FROM
employees e
INNER JOIN
(dept_manager dm, departments d) ON e.emp_no = dm.emp_no
AND dm.dept_no = d.dept_no
WHERE
dept_name = ‘Customer Service’;
– 查询员工编号为10001、10002、10003的员工的生日,姓名,部门编号,部门名称
SELECT
birth_date, first_name, last_name, d.dept_no, dept_name
FROM
employees e
LEFT JOIN
(dept_emp de, departments d) ON e.emp_no = de.emp_no
AND de.dept_no = d.dept_no
WHERE
e.emp_no IN (10001 , 10002, 10003);
子查询练习
– 查询生日为1959-12-03,入职日期为1986-08-28的员工所在的部门编号
SELECT
dept_no
FROM
dept_emp
WHERE
emp_no = (SELECT
emp_no
FROM
employees
WHERE
birth_date = ‘1959-12-03’
AND hire_date = ‘1986-08-28’);
– 查询1988年的年薪为62102的员工的姓名
SELECT
first_name, last_name
FROM
employees
WHERE
emp_no IN (SELECT
emp_no
FROM
salaries
WHERE
salary = 62102
AND from_date LIKE ‘1988%’);
查询思路总结
- 查询结果是什么,对应的是哪些表
- 查询条件是什么,查询条件中的这些字段都在哪些表里面
课后作业
- 计算各个部门的平均工资并排序,给出平均工资、部门名称
- 查询developments部的工资最高的前十位员工信息
- 查询developments部的所有员工的员工编号和入职日期(使用表连接和子查询两种方式进行演练)