3. where 子句
3.1 Where子句的作用
* 限制表中的行数据的返回,符合where条件的数据就返回,不符合数据被过滤掉。
- 两个极端条件
- 1 = 1 恒真
- 1 != 1 恒假
-- 和不写where子句是一样的
SQL> select salary from s_emp where 1 = 1;
-- 什么都查不到
SQL> select salary from s_emp where 1 != 1;
3.2 数字类型数据的条件判断
-
(大于) <(大于) <=(小于等于) >=(大于等于) `
=(等于)<>!=()
注意:SQL中使用
=来比较是否相等,不是==
-- 把s_emp中的 id salary 显示出来, 要求salary大于1200
SQL> SELECT id, salary FROM s_emp WHERE salary > 1200;
-- 把s_emp中的 id salary 显示出来, 要求salary等于1200
SQL> SELECT id, salary FROM s_emp WHERE salary = 1200;
3.3 字符串类型的条件判断
- SQL语句不区分大小写,字符串的值是匹分大小写的
- 字符串的值要加单引号
- 字符串使用 = 来判断
-- 找出first_name是Mark的id, first_name, salary 显示出来
SQL> SELECT id, first_name, salary FROM s_emp WHERE first_name = 'Mark';
3.4 between and 运算符
- where字段 between a and b 表达一个闭区间,它等价于 x >= a 且 x <=b,它是一个闭区间的运算符
-- 找出工资在[1200, 1400]范围内的员工 id, first_name, salary;
SQL> SELECT id, first_name, salary FROM s_emp WHERE salary >= 1200 AND salary <= 1400;
SQL> SELECT id, first_name, salary FROM s_emp WHERE salary BETWEEN 1200 AND 1400;
3.5 in 运算符
- 判断字段是否在存在于值列表中
- where 字段 in (值1, 值2, 值3, ...)
-- 查询s_emp表中部门编号是31、32或者50的id、first_nme 以及manager_id
SQL> SELECT id, first_name, dept_id, manager_id FROM s_emp WHERE dept_id IN (31, 32, 50);
3.6 模糊查询 like
- 通配符
_表示单个字符%表示多个字符
-- 找出名字中first_name包含a的员工
SQL> SELECT id, first_name FROM s_emp WHERE first_name LIKE '%a%';
-- 找出名字中first_name第二个字符为a的员工
SQL> SELECT id, first_name FROM s_emp WHERE first_name LIKE '_a%';
- 转义字符 (有区别)
-- 找出所有的s开头的表名
-- oracle 实现
SQL> SELECT table_name FROM user_tables WHERE table_name LIKE 's%';
-- mysql 实现
SQL> SELECT table_name FROM information_schema.tables WHERE table_name LIKE 's%';
-- 找出所有的s_开头的表名, 这里要原本输出 _ 这个字符
-- oracle 实现
SQL> SELECT table_name FROM user_tables WHERE table_name LIKE 's\_%' ESCAPE '\';
-- mysql实现
SQL> SELECT table_name FROM information_schema.tables WHERE table_name LIKE 's\_%';
3.7 NULL的判断
- 使用
where 字段 is null来判断 是否为空,而不是 =
-- 找出提成是10的id, first_name 和 commission_pct
SQL> SELECT id, first_name, commission_pct FROM s_emp WHERE commission_pct = 10;
-- 找出提成不是10的id, first_name 和 commission_pct (null未处理)
SQL> SELECT id, first_name, commission_pct FROM s_emp WHERE commission_pct != 10;
-- 找出提成是null的员工 (加上上面不是10的刚好)
SQL> SELECT id, first_name, commission_pct FROM s_emp WHERE commission_pct IS NULL;
3.8 逻辑运算符
- and 连接的条件都为真 则条件为真。
- or 只要有一个条件为真,则条件为真。
- not 求反
- = 的求反是 != <> ^=
- between and 对 not between and
- in 对应 not in (注意空值)
- like 对应 not like
- is null 对应 is not null (特别注意)
-- 求工资在[800, 1200]的员工列出id, salary, first_name;
SQL> SELECT id, first_name, salary FROM s_emp WHERE salary >= 800 AND salary <= 1200;
-- 求部门编号在31,32或50的的id, first_name, dept_id;
SQL> SELECT id, first_name, dept_id FROM s_emp WHERE dept_id = 31 OR dept_id = 32 OR dept_id = 50;
-- 找出提成不同NULL的员工的id, first_name, commission_pct;
SQL> SELECT id, first_name, commission_pct FROM s_emp WHERE commission_pct IS NOT NULL;