//MySQL核心技术// DQL语言的学习——条件查询、模糊查询、排序查询

条件查询:

1.语法
select 查询列表
from  表名
where 筛选条件;
执行顺序:
①from子句
②where子句
③select子句
select last_name,first_name from employees where salary>20000;
2.特点:
    1、按关系表达式筛选
         关系运算符:>   <    >=   <=     =       <> (不等于)    
         补充:也可以使用!=,但不建议
    2、按逻辑表达式筛选
         逻辑运算符:and    or   not
         补充:也可以使用&&  ||   !  ,但不建议
    3、模糊查询
        like
        in
        between and
        is null

3.案例
 一、按关系表达式筛选
#案例1:查询部门编号不是100的员工信息
SELECT *
FROM employees
WHERE department_id <> 100;


#案例2:查询工资<15000的姓名、工资
SELECT last_name,salary
FROM employees
WHERE salary<15000;


二、按逻辑表达式筛选

#案例1:查询部门编号不是 50-100之间员工姓名、部门编号、邮箱
#方式1:
SELECT last_name,department_id,email
FROM employees
WHERE department_id <50 OR department_id>100;

#方式2:
SELECT last_name,department_id,email
FROM employees
WHERE NOT(department_id>=50 AND department_id<=100);

#案例2:查询奖金率>0.03 或者 员工编号在60-110之间的员工信息
SELECT *
FROM employees
WHERE commission_pct>0.03 OR (employee_id >=60 AND employee_id<=110);    %不知道优先级时加小括号

模糊查询

1、like
功能:一般和通配符搭配使用,对字符型数据进行部分匹配查询
常见的通配符:
_下划线: 任意单个字符
%百分号:任意多个字符,支持0-多个
like/not like 

#案例1:查询姓名中包含字符a的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '%a%';     #a左边有任意0-多个字符,a右边有任意0-多个字符

#案例2:查询姓名中包含最后一个字符为e的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '%e';

#案例3:查询姓名中包含第一个字符为e的员工信息
SELECT *
FROM employees
WHERE last_name LIKE 'e%';

#案例4:查询姓名中包含第三个字符为x的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '_ _x%';    #第一个字符。第二个字符为任意单个字符,所以为两个下划线,不要空格,为看的清楚,此处加了空格。字符集默认的不区分大小写。

#案例5:查询姓名中包含第二个字符为_的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '_\_%';    #不是_ _% 无法区分,因此用转义字符加下换线,即\_

SELECT *
FROM employees
WHERE last_name LIKE '_$_%' ESCAPE '$';   #自己定义一个转义字符$,即$_为_

2、in
功能:查询某字段的值是否属于指定的列表之内
a  in(常量值1,常量值2,常量值3,...)   #在其中之一个常量里
a not in(常量值1,常量值2,常量值3,...)  # 不在任意一个常量里
in/not in

#案例1:查询部门编号30/50/90的员工名、部门编号
#方式1:
SELECT last_name,department_id
FROM employees
WHERE department_id IN(30,50,90);    #数值型直接写

#方式2:
SELECT last_name,department_id
FROM employees
WHERE department_id = 30
OR department_id = 50
OR department_id = 90;


#案例2:查询工种编号不是SH_CLERK或IT_PROG的员工信息
#方式1:
SELECT *
FROM employees
WHERE job_id NOT IN('SH_CLERK','IT_PROG');    #非数值型注意加单引号

#方式2:
SELECT *
FROM employees
WHERE NOT(job_id ='SH_CLERK'
OR job_id = 'IT_PROG');

3、between and
功能:判断某个字段的值是否介于xx之间  (区间值)
between and/not between and
#案例1:查询部门编号是30-90之间的部门编号、员工姓名
#方式1:
SELECT department_id,last_name
FROM employees
WHERE department_id BETWEEN 30 AND 90;

#方式2:
SELECT department_id,last_name
FROM employees
WHERE department_id>=30 AND department_id<=90;


#案例2:查询年薪不是100000-200000之间的员工姓名、工资、年薪
方式1:
SELECT last_name,salary,salary*12*(1+IFNULL(commission_pct,0))   #年薪为12个月的工资加年终奖,即年薪乘以(1+奖金率),奖金率如果为空,调用IFNULL将其置为0,从而防止年薪显示为null。
FROM employees
WHERE salary*12*(1+IFNULL(commission_pct,0))<100000 OR salary*12*(1+IFNULL(commission_pct,0))>200000;

方式2:
SELECT last_name,salary,salary*12*(1+IFNULL(commission_pct,0)) 
FROM employees
WHERE salary*12*(1+IFNULL(commission_pct,0)) NOT BETWEEN 100000 AND 200000;

4、is null/is not null

#案例1:查询没有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct IS NULL;

案例2:查询有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL;   #不能用=null,会报错


SELECT *
FROM employees
WHERE salary IS 10000;     # is 也不能这样用,会报错

注意:
=        只能判断普通的内容
IS       只能判断NULL值
<=>    安全等于,既能判断普通内容,又能判断NULL值
 

#案例1:查询没有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct <=> NULL;

#案例2:查询工资为10000的员工信息
SELECT *
FROM employees
WHERE salary <=> 10000;

作业(需要注意的部分):
1. 找出下面语句中的错误 (false last_name,)
SELECT 
  employee_id,
  last_name,
  salary * 12 ANNUAL SALARY ”   # 应为"ANNUAL SALARY "
FROM
  employees ;

2.经典面试题
   请问SELECT *FROM employees 和SELECT *
FROM employees 
WHERE commission_pct LIKE '%%' AND last_name LIKE '%%';
结果是否一样?
不一样,因为如果判断字段如奖金率为空值,则整个结果都会显示null

排序查询

1.语法:
select 查询列表
from 表名
【where 筛选条件】
order by 排序列表


执行顺序:

①from子句
②where子句
③select子句
④order by 子句

举例:
select last_name,salary
from employees
where salary>20000
order by salary ;

2.特点:
1、排序列表可以是单个字段、多个字段、表达式、函数、列数、以及以上的组合
2、升序 ,通过 asc   ,默认行为
   降序 ,通过 desc

3.案例
一、按单个字段排序
#案例1:将员工编号>120的员工信息进行工资的升序/降序
SELECT * 
FROM employees 
WHERE employee_id>120 
ORDER BY salary ESC/DESC;

#二、按表达式排序
#案例1:对有奖金的员工,按年薪降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0))  年薪
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

#三、按别名排序
#案例1:对有奖金的员工,按年薪降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0))  年薪
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY 年薪 DESC;

#四、按函数的结果排序
#案例1:按姓名的字数长度进行升序
SELECT last_name
FROM employees
ORDER BY LENGTH(last_name);

#五、按多个字段排序
#案例1:查询员工的姓名、工资、部门编号,先按工资升序,再按部门编号降序
SELECT last_name,salary,department_id
FROM employees
ORDER BY salary ASC,department_id DESC;     #查询出来的结果总体上按工资升序,对于工资相同的两个人,按部门编号降序

#六、补充选学:按列数排序
#案例:按第二列first_name升序
SELECT * FROM employees 
ORDER BY 2 ;
或者:
SELECT * FROM employees 
ORDER BY first_name;
排列出来的顺序为按字符顺序,abcdefg等

 

 

 

 

 

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值