一、条件查询
1、语法
select 查询列表|表达式|常量值|函数
from 表名
where 筛选条件;
条件查询:根据条件过滤原始表的数据,查询到想要的数据
2、分类
(1)按条件表达式筛选
条件运算符:> >= < <= != <>
(2)按逻辑表达式筛选
作用:用于连接条件表达式
逻辑运算符: && || !
更推荐使用: and or not
and(&&):两个条件如果同时成立,结果为true,否则为false
or(||):两个条件只要有一个成立,结果为true,否则为false
not(!):如果条件成立,则not后为false,否则为true
(3)模糊查询
like
between and
in
is null
3、
二、按条件表达式筛选
1、查询工资大于 12000 的员工信息
SELECT
*
FROM
employees
WHERE salary > 12000 ;
2、查询部门编号不等于 90 号的员工名和部门编号
方式一:
SELECT
last_name,
department_id
FROM
employees
WHERE department_id != 90 ;
方式二:
SELECT
last_name,
department_id
FROM
employees
WHERE department_id <> 90 ;
3、
三、按逻辑表达式筛选
1、查询工资在 1000 到 2000 之间的员工们,工资以及奖金
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE salary >= 10000
AND salary <= 20000 ;
2、查询部门编号不是在 90 到 110之间,或者工资高于 15000 的员工信息
方式一:
SELECT
*
FROM
employees
WHERE department_id < 90
OR department_id > 110
OR salary > 15000 ;
方式二:
SELECT
*
FROM
employees
WHERE NOT (
department_id >= 90
AND department_id <= 110
)
OR salary > 15000 ;
四、模糊查询
1、like
含义:使用 like 运算选择类似的值,选择条件可以包含字符或数字;
特点:一般和通配符搭配使用;'%' 和 '_' 可以同时使用。
通配符:
% 代表任意多个字符(0个或者多个)
_ 代表单个字符(就一个)
(1)查询员工中包含字符 a 的员工信息
SELECT
*
FROM
employees
WHERE last_name LIKE '%a%' ;
(2)查询员工名中第三个字符为 n,第五个字符为 l 的员工名和工资
SELECT
last_name,
salary
FROM
employees
WHERE last_name LIKE '__n_l%' ;
(3)查询员工名中第二个字符为 _ 的员工名
SELECT
last_name
FROM
employees
WHERE last_name LIKE '_\_%' ;
(4)使用 escape 来指定转义字符,如把 $ 声明为转义符来使用
SELECT
last_name
FROM
employees
WHERE last_name LIKE '_$_%' ESCAPE '$' ;
2、between...and
含义:使用 between 运算来显示在一个区间内的值;
特点:
①使用 between and 能提高语句的简洁度;
②包含两侧临界值;
③两个临界值不能调换位置(大于等于左边的值,小于等于右边的值);
(1)查询员工编号在 100 到 120 之间的员工信息
方式一:
SELECT
*
FROM
employees
WHERE employee_id BETWEEN 100
AND 120 ;
等价于:
SELECT
*
FROM
employees
WHERE employee_id >= 100
AND employee_id <= 120 ;
3、in
含义:in 用于去判断某字段的值是否属于 in 列表中的某一项;
特点:
① 使用 in 可以提高语句简洁度;
② in 列表的值类型必须统一或兼容;
③ in 列表中不支持通配符;
(1)查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES 中的一个的员工名和工种编号
方式一:
SELECT
last_name,
job_id
FROM
employees
WHERE job_id IN ('IT_PROG', 'AD_VP', 'AD_PRES') ;
方式二:
SELECT
last_name,
job_id
FROM
employees
WHERE job_id = 'IT_PROG'
OR job_id = 'AD_VP'
OR job_id = 'AD_PRES' ;
4、is null | is not null
使用 is (not) null 判断空值;
① = 或者 <> 不能用于判断 null 值
② is null 或 is not null 可以判断 null 值;
(1)查询没有奖金的员工名和奖金率
正确写法:
SELECT
last_name,
commission_pct
FROM
employees
WHERE commission_pct IS NULL ;
错误写法:
# 这种 = 不能判断 null,错误写法
SELECT
last_name,
commission_pct
FROM
employees
WHERE commission_pct = NULL ;
(2)查询有奖金的员工名和奖金率
正确写法:
SELECT
last_name,
commission_pct
FROM
employees
WHERE commission_pct IS NOT NULL ;
注意,is 关键字不能用于非 null 的判断,如下错误写法:
SELECT
last_name,
commission_pct
FROM
employees
WHERE salary IS 12000 ;
5、安全等于 <=>
① 判断 null 值
② 判断基本数据类型,用于 等值 判断
is null VS <=>
is null 仅可以判断 null 值,可读性较高
<=> 既可以判断 null 值,又可以判断普通的数值,可读性较低
(1)查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE commission_pct <=> NULL ;
(2)查询工资为 12000 的员工信息
SELECT
last_name,
salary
FROM
employees
WHERE salary <=> 12000 ;
五、练习题
1、查询工资大于 12000 的员工姓名和工资
SELECT
last_name,
salary
FROM
employees
WHERE salary > 12000 ;
2、查询员工号为 176 的员工的姓名和部门号和年薪
SELECT
last_name,
department_id,
salary * (1 + IFNULL(commission_pct, 0)) 年薪
FROM
employees
WHERE employee_id = '176' ;
3、选择工资不在 5000 到 12000 的员工的姓名和工资
方式一:
SELECT
last_name,
salary
FROM
employees
WHERE salary NOT BETWEEN 5000
AND 12000 ;
方式二:
SELECT
last_name,
salary
FROM
employees
WHERE NOT (salary >= 5000
AND salary <= 12000) ;
4、选择在 20 或 50 号部门工作的员工姓名和部门号
SELECT
last_name,
department_id
FROM
employees
WHERE department_id IN (20, 50) ;
5、选择公司中没有管理者的员工姓名及 job_id
方式一:
SELECT
last_name,
job_id,
manager_id
FROM
employees
WHERE manager_id IS NULL;
方式二:
SELECT
last_name,
job_id,
manager_id
FROM
employees
WHERE manager_id <=> NULL;
6、选择公司中有奖金的员工姓名,工资和奖金级别(涉及连接查询)
SELECT
last_name,
salary,
g.grade_level
FROM
employees e,
job_grades g
WHERE e.`salary` BETWEEN g.`lowest_sal`
AND g.`highest_sal`
AND commission_pct IS NOT NULL ;
7、选择员工姓名的第三个字母是 a 的员工姓名
SELECT
last_name
FROM
employees
WHERE last_name LIKE '__a%' ;
8、选择姓名中有字母 a 和 e 的员工姓名
SELECT
last_name
FROM
employees
WHERE last_name LIKE '%a%'
AND last_name LIKE '%e%' ;
9、显示出表 employees 表中 first_name 以 'e'结尾的员工信息
SELECT
first_name
FROM
employees
WHERE first_name LIKE '%e' ;
10、显示出表 employees 部门编号在 80-100 之间 的姓名、职位
SELECT
*
FROM
employees
WHERE department_id BETWEEN 80
AND 100 ;
11、显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、职位
SELECT
*
FROM
employees
WHERE manager_id IN (100, 101, 110) ;
12、查询员工号为176的员工的姓名和部门号和年薪
SELECT
last_name,
department_id,
salary * 12 * (1 + IFNULL(commission_pct, 0)) 年薪
FROM
employees
WHERE employee_id = '176' ;
13、查询没有奖金,且工资小于 18000 的salary,last_name
SELECT
salary,
last_name
FROM
employees
WHERE commission_pct IS NULL
AND salary < 18000 ;
14、查询 employees表中,job_id 不为 'IT' 或者工资为 12000 的员工信息
SELECT
*
FROM
employees
WHERE job_id <> 'IT'
AND salary = 12000 ;
15、查看部门 department 表的结构
DESC departments;
16、查询部门department表中涉及到了哪些位置编号
SELECT DISTINCT location_id
FROM departments;
17、经典面试题
试问下面两条 SQL 的执行效果是否一样?
第一条:
SELECT
*
FROM
employees
第二条:
SELECT
*
FROM
employees
WHERE commission_pct LIKE '%%'
AND last_name LIKE '%%' ;
结果不一定一样!
如果 commission_pct 列或者 last_name 列允许有 null 值,则结果不一样。
因为 like 模糊查询并不会匹配 null 值。