进阶2:条件查询
- 条件查询:根据条件过滤原始表的数据,查询到想要的数据
- 语法:
select 要查询的字段|表达式|常量值|函数 from 表 where 条件 ;
分类:
条件表达式
示例:salary>10000
条件运算符:< >= <= = != <>
逻辑表达式
示例:salary>10000 && salary<20000逻辑运算符:
and(&&):两个条件如果同时成立,结果为true,否则为false
or(||):两个条件只要有一个成立,结果为true,否则为false
not(!):如果条件成立,则not后为false,否则为true模糊查询
示例:last_name like ‘a%’一、语法 select 查询列表 from 表名 where 筛选条件 二、筛选条件的分类 1、简单条件运算符 > < = <> != >= <= <=>安全等于 2、逻辑运算符 && and || or ! not 3、模糊查询 like:一般搭配通配符使用,可以判断字符型或数值型 select * from employees where department_id like '1__'; 通配符:%任意多个字符,_任意单个字符 between and in is null /is not null:用于判断null值 is null PK <=> 普通类型的数值 null值 可读性 is null × √ √ <=> √ √ × #进阶2:条件查询 /* 语法: select 查询列表 from 表名 where 筛选条件; 执行顺序:先看表名,是否存在该表;然后看筛选条件,是否符合筛选条件(看是在哪一行);最后看查询列表,看是在哪一列。 分类: 一、按条件表达式筛选 简单条件运算符:> < = != <> >= <= 二、按逻辑表达式筛选 逻辑运算符: 作用:用于连接条件表达式 && || ! and or not &&和and:两个条件都为true,结果为true,反之为false ||或or: 只要有一个条件为true,结果为true,反之为false !或not: 如果连接的条件本身为false,结果为true,反之为false 三、模糊查询 like between and in is null */ #一、按条件表达式筛选 #案例1:查询工资>12000的员工信息 SELECT * FROM employees WHERE salary>12000; #案例2:查询部门编号不等于90号的员工名和部门编号 SELECT last_name, department_id FROM employees WHERE department_id<>90; #二、按逻辑表达式筛选 #案例1:查询工资z在10000到20000之间的员工名、工资以及奖金 SELECT last_name, salary, commission_pct FROM employees WHERE salary>=10000 AND salary<=20000; #案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息 SELECT * FROM employees WHERE NOT(department_id>=90 AND department_id<=110) OR salary>15000; #三、模糊查询 /* like between and in is null|is not null */ #1.like /* 特点: ①一般和通配符搭配使用,既可以判断字符型,也可以判断数值型 通配符: % 任意多个字符,包含0个字符 _ 任意单个字符 *、 #案例1:查询员工名中包含字符a的员工信息 select * from employees where last_name like '%a%';#abc #案例2:查询员工名中第三个字符为n,第五个字符为l的员工名和工资 select last_name, salary FROM employees WHERE last_name LIKE '__n_l%'; #案例: 查找部门编号为1开头的三位数。 select department_id from employees where department_id like '1__' #案例3:查询员工名中第二个字符为_的员工名,转义,要么 \_,要么 随意指定转义符号,例如 $,用 $_ 来转义 _ ,然后 ESCAPE '$',表示这是个转义字符 SELECT last_name FROM employees WHERE last_name like '_\_%'; last_name LIKE '_$_%' ESCAPE '$'; #2.between and /* ①使用between and 可以提高语句的简洁度 ②包含临界值 ③两个临界值不要调换顺序 ③定义范围,定义的是连续的范围 */ #案例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列表中的某一项 特点: ①使用in提高语句简洁度 ②in列表的值类型必须一致或兼容('123'可以转换为123) ③in列表中不支持通配符(因为IN等价于 = ,而通配符一般与LIKE 搭配使用) ③定义范围,定义的是离散的范围 */ #案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号 SELECT last_name, job_id FROM employees WHERE job_id = 'IT_PROT' OR job_id = 'AD_VP' OR JOB_ID ='AD_PRES'; #------------------ SELECT last_name, job_id FROM employees WHERE job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES'); #4、is null /* =或<>不能用于判断null值 is null或is not null 可以判断null值 */ #案例1:查询没有奖金的员工名和奖金率 SELECT last_name, commission_pct FROM employees WHERE commission_pct IS NULL; #案例1:查询有奖金的员工名和奖金率 SELECT last_name, commission_pct FROM employees WHERE commission_pct IS NOT NULL; #----------以下为错误的 SELECT last_name, commission_pct FROM employees WHERE salary IS 12000; #安全等于 <=> #案例1:查询没有奖金的员工名和奖金率 SELECT last_name, commission_pct FROM employees WHERE commission_pct <=>NULL; #案例2:查询工资为12000的员工信息 SELECT last_name, salary FROM employees WHERE salary <=> 12000; #is null pk <=> /* IS NULL:仅仅可以判断NULL值,可读性较高,建议使用 <=> :既可以判断NULL值,又可以判断普通的数值,可读性较低 */ #测试 #查询员工号为176的员工的姓名和部门号和年薪 SELECT CONCAT(last_name,first_name) AS 姓名, department_id AS 部门编号, salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees WHERE employee_id = 176; #查询没有奖金,并且工资小于18000的 salary,last_name SELECT last_name, salary FROM employees WHERE commission_pct IS NULL AND salary < 18000; #job_id不为‘IT’或者工资为12000的员工信息 SELECT * FROM employees WHERE job_id <> 'IT' OR salary = 12000; #查看departments表的结构 DESC departments; #查询departments表中涉及到了哪些位置编号(去重) SELECT DISTINCT location_id FROM departments; #经典面试题 /* 试问 select * from employees 和select * from employees where commision_pct like '%%' and last_name like '%%'; 结果是否一样?并说明原因 答:不一样,因为如果判断的字段有null值,则不符合第二种的筛选条件。 */ #查找工资不在5000-20000范围(说明多个表达式可以搭配使用) SELECT salary FROM employees WHERE NOT (salary BETWEEN 5000 AND 20000);