条件查询:
1.语法
select 查询列表
from 表名
where 筛选条件;
执行顺序:
①from子句
②where子句
③select子句
select last_name,first_name from employees where salary>20000;
2.特点:
1、按关系表达式筛选
关系运算符:> < >= <= = <> (不等于)
补充:也可以使用!=,但不建议
2、按逻辑表达式筛选
逻辑运算符:and or not
补充:也可以使用&& || ! ,但不建议
3、模糊查询
like
in
between and
is null
3.案例
一、按关系表达式筛选
#案例1:查询部门编号不是100的员工信息
SELECT *
FROM employees
WHERE department_id <> 100;
#案例2:查询工资<15000的姓名、工资
SELECT last_name,salary
FROM employees
WHERE salary<15000;
二、按逻辑表达式筛选
#案例1:查询部门编号不是 50-100之间员工姓名、部门编号、邮箱
#方式1:
SELECT last_name,department_id,email
FROM employees
WHERE department_id <50 OR department_id>100;
#方式2:
SELECT last_name,department_id,email
FROM employees
WHERE NOT(department_id>=50 AND department_id<=100);
#案例2:查询奖金率>0.03 或者 员工编号在60-110之间的员工信息
SELECT *
FROM employees
WHERE commission_pct>0.03 OR (employee_id >=60 AND employee_id<=110); %不知道优先级时加小括号
模糊查询
1、like
功能:一般和通配符搭配使用,对字符型数据进行部分匹配查询
常见的通配符:
_下划线: 任意单个字符
%百分号:任意多个字符,支持0-多个
like/not like
#案例1:查询姓名中包含字符a的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '%a%'; #a左边有任意0-多个字符,a右边有任意0-多个字符
#案例2:查询姓名中包含最后一个字符为e的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '%e';
#案例3:查询姓名中包含第一个字符为e的员工信息
SELECT *
FROM employees
WHERE last_name LIKE 'e%';
#案例4:查询姓名中包含第三个字符为x的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '_ _x%'; #第一个字符。第二个字符为任意单个字符,所以为两个下划线,不要空格,为看的清楚,此处加了空格。字符集默认的不区分大小写。
#案例5:查询姓名中包含第二个字符为_的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '_\_%'; #不是_ _% 无法区分,因此用转义字符加下换线,即\_
SELECT *
FROM employees
WHERE last_name LIKE '_$_%' ESCAPE '$'; #自己定义一个转义字符$,即$_为_
2、in
功能:查询某字段的值是否属于指定的列表之内
a in(常量值1,常量值2,常量值3,...) #在其中之一个常量里
a not in(常量值1,常量值2,常量值3,...) # 不在任意一个常量里
in/not in
#案例1:查询部门编号是30/50/90的员工名、部门编号
#方式1:
SELECT last_name,department_id
FROM employees
WHERE department_id IN(30,50,90); #数值型直接写
#方式2:
SELECT last_name,department_id
FROM employees
WHERE department_id = 30
OR department_id = 50
OR department_id = 90;
#案例2:查询工种编号不是SH_CLERK或IT_PROG的员工信息
#方式1:
SELECT *
FROM employees
WHERE job_id NOT IN('SH_CLERK','IT_PROG'); #非数值型注意加单引号
#方式2:
SELECT *
FROM employees
WHERE NOT(job_id ='SH_CLERK'
OR job_id = 'IT_PROG');
3、between and
功能:判断某个字段的值是否介于xx之间 (区间值)
between and/not between and
#案例1:查询部门编号是30-90之间的部门编号、员工姓名
#方式1:
SELECT department_id,last_name
FROM employees
WHERE department_id BETWEEN 30 AND 90;
#方式2:
SELECT department_id,last_name
FROM employees
WHERE department_id>=30 AND department_id<=90;
#案例2:查询年薪不是100000-200000之间的员工姓名、工资、年薪
方式1:
SELECT last_name,salary,salary*12*(1+IFNULL(commission_pct,0)) #年薪为12个月的工资加年终奖,即年薪乘以(1+奖金率),奖金率如果为空,调用IFNULL将其置为0,从而防止年薪显示为null。
FROM employees
WHERE salary*12*(1+IFNULL(commission_pct,0))<100000 OR salary*12*(1+IFNULL(commission_pct,0))>200000;
方式2:
SELECT last_name,salary,salary*12*(1+IFNULL(commission_pct,0))
FROM employees
WHERE salary*12*(1+IFNULL(commission_pct,0)) NOT BETWEEN 100000 AND 200000;
4、is null/is not null
#案例1:查询没有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct IS NULL;
案例2:查询有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL; #不能用=null,会报错
SELECT *
FROM employees
WHERE salary IS 10000; # is 也不能这样用,会报错
注意:
= 只能判断普通的内容
IS 只能判断NULL值
<=> 安全等于,既能判断普通内容,又能判断NULL值
#案例1:查询没有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct <=> NULL;
#案例2:查询工资为10000的员工信息
SELECT *
FROM employees
WHERE salary <=> 10000;
作业(需要注意的部分):
1. 找出下面语句中的错误 (false last_name,)
SELECT
employee_id,
last_name,
salary * 12 “ ANNUAL SALARY ” # 应为"ANNUAL SALARY "
FROM
employees ;
2.经典面试题
请问SELECT *FROM employees 和SELECT *
FROM employees
WHERE commission_pct LIKE '%%' AND last_name LIKE '%%';
结果是否一样?
不一样,因为如果判断字段如奖金率为空值,则整个结果都会显示null
排序查询
1.语法:
select 查询列表
from 表名
【where 筛选条件】
order by 排序列表
执行顺序:
①from子句
②where子句
③select子句
④order by 子句
举例:
select last_name,salary
from employees
where salary>20000
order by salary ;
2.特点:
1、排序列表可以是单个字段、多个字段、表达式、函数、列数、以及以上的组合
2、升序 ,通过 asc ,默认行为
降序 ,通过 desc
3.案例
一、按单个字段排序
#案例1:将员工编号>120的员工信息进行工资的升序/降序
SELECT *
FROM employees
WHERE employee_id>120
ORDER BY salary ESC/DESC;
#二、按表达式排序
#案例1:对有奖金的员工,按年薪降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
#三、按别名排序
#案例1:对有奖金的员工,按年薪降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY 年薪 DESC;
#四、按函数的结果排序
#案例1:按姓名的字数长度进行升序
SELECT last_name
FROM employees
ORDER BY LENGTH(last_name);
#五、按多个字段排序
#案例1:查询员工的姓名、工资、部门编号,先按工资升序,再按部门编号降序
SELECT last_name,salary,department_id
FROM employees
ORDER BY salary ASC,department_id DESC; #查询出来的结果总体上按工资升序,对于工资相同的两个人,按部门编号降序
#六、补充选学:按列数排序
#案例:按第二列first_name升序
SELECT * FROM employees
ORDER BY 2 ;
或者:
SELECT * FROM employees
ORDER BY first_name;
排列出来的顺序为按字符顺序,abcdefg等