一、条件查询

  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 值。

 

posted on 2021-06-08 15:50  格物致知_Tony  阅读(293)  评论(0编辑  收藏  举报

目录导航