条件查询

#条件查询
/*
语法:
   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`;一样。
原文地址:https://www.cnblogs.com/tingtin/p/13274836.html