#条件查询
/*
语法:
select 查询列表
from 表名
where 筛选条件;
分类:
一。按条件表达式筛选
条件运算符:> < = != <> >= <=
二。按逻辑表达式筛选
逻辑运算符:用于连接条件表达式
逻辑运算符: && || !
and or not
三。模糊查询
like
between and
in
is null
*/
#一 条件表达式
#1.查询工资>12000的员工信息
SELECT * FROM employees WHERE salary>12000;
#2. 查询部门编号不等于90号的员工名和部门编号
SELECT `first_name`,`department_id`
FROM `employees`
WHERE
`department_id`<>90# != 和 <> 一样
#二 逻辑表达式
#1 工资在10000~20000的员工名、工资和奖金
SELECT `first_name`,`salary`,`commission_pct`
FROM `employees`
WHERE `salary`>10000 AND `salary`<20000
#2 查询部门编号不是在90~110,或者工资高于15000的员工信息
SELECT * FROM `employees`
WHERE
!(`department_id`>=90 AND `department_id`<=110) || `salary`>15000
#三 模糊查询
/*
like:
特点:(1) 一般和通配符搭配使用
通配符
% 任意多个字符
_ 任意单个字符
between and
in
is null|is not null
*/
#1 like
#1.查询员工名单中包含字符a的员工信息
SELECT * FROM `employees`
WHERE
last_name LIKE '%a%';
#2 查询员工名中第三个字符为e,第五个字符为a的员工名和工资
SELECT
last_name,
salary
FROM
`employees`
WHERE last_name LIKE '__e_a%' ;
#3 查询员工名中第二个字符为_的员工名
SELECT last_name FROM `employees`
WHERE last_name LIKE '_\_%'#第二个字符前必须加'\'
SELECT last_name FROM `employees`
WHERE last_name LIKE '_*_%' ESCAPE '*'#escape指定的字符后面紧挨着的第一个字符被看作是普通字符而非通配符。功能同上,这里的‘*’也可以是其它的字符
#2 between and
/*
(1)提高语句简洁度
(2)包含临界值
(3)2个临界值不要调换
*/
#案例1: 查询员工编号在100~120间的员工信息
SELECT * FROM `employees`
WHERE `employee_id` >=100 AND `employee_id`<=120;
SELECT * FROM `employees`
WHERE `employee_id` BETWEEN 100 AND 120;
#3 in
/*
in 列表的值类型必须一致或兼容
列表内容不可用通配符
*/
#查询员工的工种编号属于IT_PROG AD_VP AD_PRES 员工名和工种编号
SELECT
last_name,`job_id`
FROM `employees`
WHERE `job_id` IN ('IT_PROG', 'AD_VP', 'AD_PRES');
#4 is null
/*
=或<>不能用于判断null值
is null或者 is not null 可以判断null值
*/
#查询没有奖金的员工名和奖金率
SELECT `last_name`,`commission_pct`
FROM `employees`
WHERE `commission_pct` IS NULL #必须用is,不能用=
SELECT `last_name`,`commission_pct`
FROM `employees`
WHERE `commission_pct` IS NOT NULL
#安全等于 <=>
#1查询没有奖金的员工名和奖金率
SELECT `last_name`,`commission_pct`
FROM `employees`
WHERE `commission_pct` <=> NULL #null
#2 查询工资为12000的员工信息
SELECT * FROM employees WHERE salary<=>12000;#常量值
/*
总结
is null :仅仅可以判断NULL,可读性高,建议使用
<=> : 既可以判断null值,又可以判断普通的数值,可读性低
*/
#查询员工号为176的员工姓名和部门号和年薪
SELECT `last_name`,`department_id`,`salary`*12*(1+IFNULL(`commission_pct`,0)) 年薪
#这里要考虑(1+IFNULL(`commission_pct`,0))
FROM `employees`
WHERE `employee_id` <=> 176
#测试题
#1查询没有奖金,且工资小于18000的salary,last_name
SELECT salary,last_name
FROM `employees`
WHERE `commission_pct` IS NULL AND `salary`<18000;
#2 查询job_id 不为`job_id`‘IT’ 或者工资为12000的员工信息
SELECT * FROM `employees`
WHERE `job_id` <>'IT' OR salary=12000;
#3 查询`departments` 表的结构
DESC `departments`;
#4 查询`departments`表涉及哪些位置编号
SELECT DISTINCT `location_id` FROM `departments`;
#5
SELECT * FROM `employees`;
SELECT * FROM `employees`
WHERE `commission_pct` LIKE '%%' AND last_name LIKE '%%';
SELECT * FROM `employees`
WHERE `commission_pct` LIKE '%%' OR last_name LIKE '%%';
#当where 语句为假时,该条数据不被选择。and:如`commission_pct` :null 此时为假,那么这条数据无法被选择。
#但是or 两者都为假where语句才为假,同时`last_name`不可能为null。因此where语句不会为假,也就是所有数据都会被选择
#因此 用or 时的功能和SELECT * FROM `employees`;一样。