01-MySQL中常见的Where条件查询和结果排序

简单查询

语法格式

select [distinct] * | {colum1 , colum2...} from table_name: SQL关键字字段或表名称之间采用空格分开

  • select指定查询哪些列的数据 , *号代表要查询所有的列(效率不高) , colum指定要查询的具体列 , 默认是面向整张表查询

  • 当查询的多个记录的每个字段的值都相同时可以使用 distinct(可选) 去掉重复的数据

  • 查询结果集中显示的字段名以select关键字后面的字段名为准, 如果起别名就以别名为准

简单查询

查询一个字段: select关键字指定查询的字段名称,from关键字指定要查询的表

# 查询员工的姓名
select ename from emp;

在这里插入图片描述

查询多个字段: 查询的多个字段之间采用逗号间隔,最后一个字段后面不能使用逗号

# 查询员工的姓名和编号
select empno, ename from emp;

在这里插入图片描述

查询所有字段: 将查询的所有的字段放到select关键字的后面可读性强效率高(推荐),采用*代表要查询所有的列但是读性差效率低(不建议)

# 每个字段都写上
select a,b,c,d,e,f... from tablename;
# 使用 * 号
select * from emp;

在这里插入图片描述

对查询的列进行运算

在select语句中的字段名与数字或者其他字段名三者可以一起混合运算,先执行的用括号括起来

  • 在SQL语句当中若有NULL值参与数学运算计算结果一定是NULL, 运算前建议使用ifnull空值处理函数预先处理
# 列出员工的编号,姓名和年薪
select empno, ename, sal*12 from emp;

在这里插入图片描述

给查询的列起别名

采用as关键字可以重新命名查询的表字段名,as也可以省略但是要求查询字段名和字段别名之间需要使用空格分开,别名如果是字符串必须添加单引号或者双引号

  • 别名只是将显示的查询结果的列名更改,不会更改数据库中原表的列名,select语句只负责查询不会进行修改操作
# 将查询出来的字段显示为中文
select empno as '员工编号', ename as '员工姓名', sal*12 as '年薪' from emp;

# as可以省略
select empno "员工编号", ename "员工姓名", sal*12 "年薪" from emp;

# dept和name之间有空格
select deptno,dname 'dept name' from dept; //加单引号
select deptno,dname "dept name" from dept; //加双引号

where条件查询

条件运算符

条件查询需要用到where关键字且必须放到from关键字的后面,默认是先面向整张表查询到所有,然后以查询到的记录中的一些字段作为判断条件进行筛选

  • 在select语句中AND的优先级默认比OR高, 如果想让OR先执行就需要加小括号 , 开发中如果不确定优先级就加小括号就行了
运算符说明
=等于
<>或!=不等于
<小于
<=小于等于
>大于
>=大于等于
between …and ….必须遵循左小右大且是闭区间即包括两端的值,等同于>= and <=
is null/is not null判断字段的值是否为空,数据库中的null代表字段不填值即没有值,使用等号表示判断字段值是否为null这个具体的值
and表示并且的含义,表示所有的条件必须满足
or或者
in/not in是否包含的意思,相当于多个 or, in(字符串或数字,......)括号里面是具体的值不是一个区间
notnot 可以取非,主要用在is或in
like模糊查询,支持"%(匹配任意个字符)" 或 "_(匹配一个字符)" , like中的表达式必须放到单引号中或者双引号中
如果要匹配%和_需要使用\进行转义为普通的%和_

=,<>,!=操作符

=: 查询薪水为5000的员工,查询职位为MANAGER的员工,job字段是字符串类型所以字段值必须使用引号

# 查询薪水为5000的员工
select empno, ename, sal from emp where sal=5000;

# 查询职位为MANAGER的员工, 使用双引号
select empno, ename from emp where job="manager";
# 查询职位为MANAGER的员工, 使用单引号
select empno, ename from emp where job='manager';
# Mysql默认情况下大小写是不敏感的
select empno, ename from emp where job='MANAGER';

<>(推荐)和!=: 查询薪水不等于5000的员工,查询职位不是MANAGER的员工

# 查询薪水不等于5000的员工
select empno, ename, sal from emp where sal <> 5000;
select empno, ename, sal from emp where sal != 5000;
# 数值也可以采用单引号引起来,mysql默认会自动进行类型转换但是不建议这么写
select empno, ename, sal from emp where sal <> '5000';
# 查询职位不是MANAGER的员工
select empno, ename from emp where job <> 'MANAGER';

between..and,>=和<=操作符

采用>=和<=: 查询薪水为1600到3000的员工

select empno, ename, sal from emp where sal >= 1600 and sal <= 3000

采用between…and…: 查询薪水为1600到3000的员工

select empno, ename, sal from emp where sal between 1600 and 3000;

and,or,in,not,is null

AND: 查询职位为MANAGER并且薪水大于2500的员工

select * from emp where job='MANAGER' and sal > 2500;

OR: 查询出职位为manager或者为salesman的员工

select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';

IN: 查询出job为manager或者为salesman的员工,查询出薪水是1600或3000的员工

select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');
select ename,sal from emp where sal = 800 or sal = 5000;
# in(800, 5000)不是表示800到5000都找出来
select ename,sal from emp where sal in(800, 5000); 

NOT: 查询出薪水不是1600或3000的员工, 查询出津贴不为null的所有员工

# 薪水不是1600或3000的员工
select * from emp where sal <> 1600 or sal <> 3000;
select * from emp where not (sal = 1600 or sal = 3000);
select * from emp where sal not in (1600, 3000);
# 津贴不为 null 的所有员工
select * from emp where comm is not null;

IS NULl: 查询津贴为空的员工

# 无法查询出符合条件的数据
select * from emp where comm=null;

# 因为null类型比较特殊,必须使用is来比较
select * from emp where comm is null;

在这里插入图片描述

like模块查询

like可以实现模糊查询,支持"%(匹配任意个字符)""_(匹配一个字符)" , like中的表达式必须放到单引号中或者双引号中

# 错误的写法
select * from emp where ename like _A% 

查询姓名以M开头所有的员工

select * from emp where ename like 'M%'; 

查询姓名以N结尾的所有的员工

select * from emp where ename like '%N'; 

查询姓名中包含O的所有的员工

select * from emp where ename like '%O%'; 

查询姓名中第二个字符为A的所有员工

select * from emp where ename like '_A%'; 

查询出名字中有_的,需要利用\转义字符

# 错误写法
select name from t_student where name like '%_%'; 

# 需要利用\转义字符,将_转化为普通的下划线
select name from t_student where name like '%\_%';

表达式的优先级

在select语句中AND的优先级默认比OR高, 如果想让OR先执行就需要加小括号 , 开发中如果不确定优先级就加小括号就行了

查询薪水大于1800并且部门代码为20或30的员工

# 实际含义是工资大于1800并且部门编号为20的员工 或者部门编号是30的所有的员工
select * from emp where sal > 1800 and deptno = 20 or deptno = 30;

# 实际含义是查询工资大于1800,并且部门编号为20或30部门的员工
select * from emp where sal > 1800 and (deptno = 20 or deptno = 30);

在这里插入图片描述

查询结果排序

order by 关键字后面可以跟上排序字段,如果有多个排序字段采用逗号间隔,原理是先根据第一个字段排序,如果重复了再根据第二个字段排序,以此类推

  • desc表示按照排序字段降序排序,asc表示按照排序字段升序排序,由于MySQL默认按照升序排序,所以排序时asc可以省略不写
  • 如果select语句中包含where关键字,order by关键字必须放到where关键字后面,如果没有则放到from关键字后面
  • 按照查询结果集中某列的序号也可以进行排序,但是使用序号排序含义不明确并且列的顺序一但发生改变就无效了(不推荐)

排序总是在最后执行: 先查询到结果集,然后按照结果集中的某个字段名或者字段的位置进行升序或降序排序

select 
	字段1,字段2
from
	表名
where	
	条件
order by
	要排序的字段名/字段在表中的索引  desc/asc; 

单一字段排序

ASC: 查询所有员工并按照薪水由小到大排序,查询职位为MANAGER的所有员工并按照薪水由小到大排序

# 查询所有员工并按照薪水由小到大排序
select * from emp order by sal; 
# 省略asc关键字
select * from emp order by sal asc; 
# 查询职位为MANAGER的所有员工并按照薪水由小到大排序
select * from emp where job='MANAGER' order by sal; 

DESC: 查询所有员工并按照薪水由大到小排序

select * from emp order by sal desc; 

按照多个字段排序

查询所有员工按照职位和薪水升序排序

# job在前起主导只有job相等的时候才会考虑启用sal排序
select * from emp order by job,sal; 

查询所有员工按照职位和薪水倒序排序

# job在前起主导,只有job相等的时候才会考虑启用sal排序
select * from emp order by job desc, sal desc; 
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值