✅作者简介:大家好我是@每天都要敲代码,希望一起努力,一起进步!
📃个人主页:@每天都要敲代码的个人主页🔥系列专栏:MySQL专栏
目录
语法格式:
select 字段名1,字段名2,字段名3,.... from 表名;
注意:
(1)任何一条sql语句以 “;” 结尾
(2)sql语句不区分大小写
1. 查询一个字段
例如:查询员工的姓名
select ename from emp;
Select语句后面跟的是字段名称,select是关键字,select和字段名称之间采用空格隔开,from表示将要查询的表,它和字段之间采用空格隔开。
2. 查询多个字段
例如:查询员工的编号和姓名
select empno, ename from emp;
查询多个字段,select中的字段采用逗号间隔即可,最后一个字段,也就是在from前面的字段不能使用逗号了。
3. 查询全部字段
例如:查询当前数据库中,emp表中的所有字段
select * from emp;
采用select * from emp,虽然简单,但是*号不是很明确,建议查询全部字段将相关字段写到select语句的后面;在以后java连接数据库的时候,是需要在java程序中编写SQL语句的,这个时候编写的SQL语句不建议使用select * 这种形式,建议写明字段,增强可读性!
4. 计算员工的年薪
例如:列出员工的编号,姓名和年薪
在select语句中可以使用运算符!但不会更改数据库中原始的数据!
select empno,ename,sal*12 from emp;
sal*12看着很不舒服,我们可以用as给查询结果的列重命名,as可省略
5. 将查询出来的字段显示为中文
采用as关键字重命名表字段,并且这里的as 是可以省略的!
注意:字符串必须添加单引号 或者 双引号;标准sql语句中要求字符串使用单引号括起来;虽然mysql支持双引号,尽量别用!
select empno as '员工编号',ename as '员工姓名',sal*12 as '年薪'from emp;# 写成双引号的方式,只能在MySQL中运行,不通用;建议写成单引号的方式select empno "员工编号", ename "员工姓名", sal*12 "年薪" from emp;
条件查询需要用到where语句,where必须放到from语句表的后面!
语法格式:
select 字段,字段... from 表名 where 条件;
执行顺序:先from,然后where,最后select
支持如下运算符:
1. = 操作符
(1)查询薪水为5000的员工
select empno, ename, sal from emp where sal=5000;
(2)查询job为MANAGER的员工
注意:manager字符串,要用单引号或者双引号括起来!
select empno, ename from emp where job='manager';
(3)“=”只能看作是比较大小,不能字符串拼接!
如果是数字与字符串进行比较,会存在隐式转换(把字符串转换为数字)。若此字符串是数字型的字符串,例如:’1‘,那么会把它转换为整数1;若此字符串不是数字型的字符串,例如:’a‘,并不会转换成ASCII码值来进行比较,会把它转换为整数0来看待!
select 1 = '1'; -- 1select 1 = 'a'; -- 0select 0 = 'a'; -- 1
如果比较的两侧都不是数字型的字符串,例如:’a‘,'b'等,此时会转换成ASCII值后在进行比较
select 'a' = 'b';select 'a' < 'b';
只要有NULL参与判断结果就为NULL
1 = NULL; -- NULLNULL = NULL; -- NULL
2. <> != 操作符
(1)查询薪水不等于5000的员工
注意:对于数值也可以采用单引号或者双引号引起来的,例如5000写成'5000'或者“5000”都是可以的,但是不建议这样写!
select empno, ename, sal from emp where sal <> 5000;select empno, ename, sal from emp where sal != 5000;
(2)查询工作岗位不等于MANAGER的员工
select empno, ename, sal from emp where job<>'manager';
3. between … and …操作符
①between and在使用的时候必须左小右大。
②between and除了可以使用在数字方面(左闭右闭)之外,还可以使用在字符串方面(左闭右开)!
(1)查询薪水为1600到3000的员工(左闭右闭)
第一种方法:使用between...and...
select empno, ename, sal from emp where sal between 1600 and 3000;
between … and …,它是包含最大值和最小值的;就等价于>= and <=
第二种方式:使用>= and <=
select empno, ename, sal from emp where sal >=1600 and sal<=3000;
(2)查看员工首字母是A到C开头的名字(左闭右开)
select ename from emp where ename between 'A' and 'C'; --包括A,不包括C
4. is null
①null为空,但不是空串,为null可以设置这个字段不填值,空不是一个值,不能用等号衡量。
②如果查询为null的字段,采用is null;不能采用 =null !
(1)查询津贴为空null的员工
(1)首先先使用select * from emp; 查询到所有的comm信息,发现有很多是NULL
(2)如果直接只用 =null 是无法查询出符合条件的数据
(3)应该采用 is null 作为查询条件
select * from emp where comm is null;select * from emp where comm is not null;
(2)找出那些员工没有津贴:这就包括为null的和0的
select * from emp where comm is null or comm=0;
5. and
and表示并且的含义,表示所有的条件必须满足。
例如:查询工作岗位为MANAGER,薪水大于2500的员工
select * from emp where job='manager' and sal >= 2500;
6. or
or,只要满足条件即可,相当于包含;满足条件之一即可!
例如:查询出job为manager或者job为salesman的员工
select * from emp where job='manager' or job = 'salesman';
7. and 和 or 联合使用
找出薪资大于1000的并且部门编号是20或30部门的员工。
select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30);-- and优先级比or高,要想让or先执行,必须加小括号
8. in
in表示包含的意思,完全可以采用or来表示,采用in会更简洁一些
(1)查询出job为manager或者job为salesman的员工
使用or:select * from emp where job='manager' or job = 'salesman'; 使用in:select * from emp where job in ('manager','salesman');
(2)查询出薪水包含1600和薪水包含3000的员工
select * from emp where sal in(1600,3000);
9. not
(1)查询出薪水不包含1600和薪水不包含3000的员工
第一种写法:使用不等<>
select * from emp where sal<>1600 and sal <>3000;
第二种写法: 使用等于= 和 not 联合使用
select * from emp where not(sal=1600 or sal=3000);
第三种写法:使用not in
select * from emp where sal not in(1600,3000);
(2)查询出津贴不为null的所有员工
select * from emp where comm is not null;
10. like
①Like可以实现模糊查询,like支持 % 和 下划线_ 匹配。
②Like中%和下划线的差别?
%匹配任意字符出现的个数;
_下划线只匹配一个字符;
③Like 中的表达式必须放到单引号中或者双引号中。
(1)查询姓名以M开头所有的员工
select * from emp where ename like 'M%';
(2)查询姓名以N结尾的所有的员工
select * from emp where ename like '%N';
(3)查询姓名中包含O的所有的员工
select * from emp where ename like '%O%';
(4)查询姓名中第二个字符为A的所有员工
select * from emp where ename like '_A%';
(5) 查询既含有a的又含有e的last_name
方法一:写两个模糊查询,然后使用and进行连接
select last_name from employees where last_name like '%a%' and last_name like'%e%';
方法二:放在一起写
select last_name from employees where last_name like '%a%e%';
此时发现只有16条记录,与前面的方法相比少了4条,这是因为顺序的问题;还有可能是e在前面a在后面:“%e%a%”
最终写法
select last_name from employees where last_name like '%a%e%' or last_name like '%e%a%';
(6)补充:找出名字中有下划线_的;利用转义字符\ !
select * from emp where ename like '%\_%';
常用函数补充:
①distinct:去重,去除重复的字段,只保留一个!
②ifnull(字段,0):如果当前字段是null当做0处理,因为null与其它数进行运算,最终的结果还是null!
③着重号``:如果当前字段或者表名是一个MySQL的关键字,那么就是用``来进行区分!
11. 算术运算符
算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加 (+)、减(-)、乘(*)、除(/)和取模(%)运算。
加法与减法:
①一个整数类型的值对整数进行加法和减法操作,结果还是一个整数;
②一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数;
③加法和减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的;
④在Java中,+的左右两边如果有字符串,那么表示字符串的拼接。但是在MySQL中+只表示数 值相加。如果遇到非数值类型,先尝试转成数值,如果转失败,就按0计算。
补充:①MySQL中字符串拼接要使用字符串函数CONCAT()实现
②字符串存在隐式转换,如果转换不成功,就当做0来处理!
select 1+'1'; -- 整数+整数型的字符串结果还是一个整数,会把整数型的字符串转换成数字(隐式转型)select 1+'a'; -- 无法识别,会把字符串当成0进行处理select 1+null -- 和null进行运算,最终结果也还是null;可以使用ifnull函数进行处理
乘法与除法:
①一个数乘以整数1和除以整数1后仍得原数;
②一个数乘以浮点数1和除以浮点数1后变成浮点数,数值与原数相等;
③一个数除以整数后,不管是否能除尽,结果都为一个浮点数; 一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后4位;
④乘法和除法的优先级相同,进行先乘后除操作与先除后乘操作,得出的结果相同。 在数学运算中,0不能用作除数,在MySQL中,一个数除以0为NULL。
select 10 / 2;select 10 / 3; -- 无论是否除尽,最终都是一个浮点型数据,保留小数点后四位select 10 / 0; -- 除以0不会报错,最终结果是一个null
求模(求余)运算符:
结果的符号与被模数的符号保持一致,与模数的符号无关!
select 12 % -5; -- 2select -12 % 5; -- -2select -12 % -5; -- -2
12. 安全等于<=>
安全等于运算符(<=>)与等于运算符(=)的作用是相似的, 唯一的区别 是‘’可 以用来对NULL进行判断。在两个操作数均为NULL时,其返回值为1,而不为NULL;当一个操作数为NULL时,其返回值为0,而不为NULL。
-- 使用=,只要有NULL参与运算,结果就是NULLselect 1 = NULL; #NULLselect NULL = NULL; #NULL-- 使用安全等于<=>,专门用来比较有NULL参与的运算,结果是0或者1,而不是NULLselect 1 <=> NULL; #0select NULL <=> NULL; #1
例:获取emp表中津贴comm为null的数据
首先我们知道不能使用 “等于=” ,只要有NULL参与,使用“等于=”结果就是NULL,没有任何数据
第一种方式:使用is null 前面已经讲过
select * from emp where comm is null;
第二种:使用isnull(),连在一起写,相当于一个函数
select * from emp where isnull(comm);
第三种:不能使用“等于=”,但可以使用 “安全等于<=>” 参与NULL的运算
select * from emp where comm <=> null;
13. least & greatest
①least:最小值运算符,在多个值中返回最小值!
②greatest:最大值运算符,在多个值中返回最大值!
select lest('e','c','a','f','b');select greatest('e','c','a','f','b');
14. 逻辑运算符
逻辑运算符主要用来判断表达式的真假,在MySQL中,逻辑运算符的返回结果为1、0或者NULL。 MySQL中支持4种逻辑运算符如下:
not、and、or前面已经讲过了,这里重点讲解XOR(逻辑异或)---》相同为0相异为1!
逻辑异或(XOR)运算符是当给定的值中任意一个值为NULL时,则返回NULL;如果两个非NULL的值都是0或者都不等于0时,则返回0;如果一个值为0,另一个值不为0时,则返回1
-- 相异为1,相同为0select 1 XOR 0; -- 1select 1 XOR 1; -- 0select 0 XOR 0; -- 0
15. 位运算符(了解)
位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算, 最后将计算结果从二进制变回十进制数。 MySQL支持的位运算符如下:
1. 单一字段排序
排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序,如果存在where子句那么order by必须放到where语句的后面!
(1)按照薪水由小到大排序
select * from emp order by sal;
(2)先取得job为MANAGER的员工,再按照薪水由小到大排序
select * from emp where job='manager' order by sal; -- 先执行from,然后执行where,再执行selelct,最后才执行order by按照sal进行排序输出
(3)按照多个字段排序,如:首先按照job排序,再按照sal排序;多个字段排序只有前面个字段相等时才会按照后面一个字段进行排序。
select * from emp order by job,sal;-- 先按照job字段排序,当job相等才会按照sal排序
2. 手动指定排序顺序
(1)手动指定按照薪水由小到大排序:asc;默认也是asc从小到大排序的!
select * from emp order by sal asc;
(2)手动指定按照薪水由大到小排序:desc
select * from emp order by sal desc;
3. 多个字段排序
(1)按照job和薪水倒序
select * from emp order by job desc,sal desc;
(2)按照工资的降序排列,当工资相同的时候再按照名字的升序排列
注意:越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序的时候,才会启用后面的字段
select ename,sal from emp order by sal desc, ename asc;
4. 使用字段的位置(下标)来排序
也就是通过下标进行排序,默认是从1开始,例如:sal下标是6,那么按照薪水升序;不健壮,不建议使用
select * from emp order by 6; --下标从1开始
5. 使用别名进行排序
例:先获取年薪,然后起别名进行排序
select empno,ename,(sal+ifnull(comm,0))*12 as year_sal from emp order by year_sal;
例:获取年薪大于30000的
select empno,ename,(sal+ifnull(comm,0))*12 as year_sal from emp where year_sal > 30000;
无法查询
总结:列的别名只能在order by中使用,不能在where中使用!为什么会这样?这与执行顺序有关!首先先执行from根据表名进行查找,然后执行where执行过滤条件,再执行select语句输出要确定的内容,最后才会执行order by进行排序!而重命名是在select中,select是在where之后,order by之前!所以where中不能使用重命名进行操作,order by中可以使用重命名进行操作!
总结:一定要注意执行的顺序
select
字段 3
from
表名 1
where
条件 2
order by
.... 4
order by是最后执行的!
来源地址:https://blog.csdn.net/m0_61933976/article/details/126259962