Sql查询
数据库中百分之八十的操作都是查询操作
基本的查询语句语法
select [distinct] * | 列名
from 表名 (可以写多个表名字,以逗号隔开)
[where 条件] (可以写多个条件,以and 或者是 or 进行分隔)
[group by 列名 [having 条件]] (可以写多个条件,以and 或者是 or 进行分隔)
[order by 列名 asc | desc]; (可以写多个列名,以逗号隔开)
基本查询语句 :
查询所有
select * from <表名>
在实际开发的过程中一定不要用*,会影响 查询性能,不利于查询优化,应该写上需要查找的字段
select <字段> ,<字段> ,<字段> from <表名>
在查询指定字段的时候可以设置别名
select job as 职位 ,sal from emp
distinct可以去掉相同数值的记录,对后面所有的字段一起判断
select distinct <字段>, <字段> from <表名>
where 是在表名之后,设置查询的条件,可以通过AND或OR设置多个条件
select * from emp where job=‘clerk’ AND SAL>1000
select * from emp where job =‘clerk’ OR SAL>1000
可以通过ORDER BY进行排序(ASC升序 ,DESC降序)
select * from emp order by sal DESC
group by 分组查询
在使用分组查询的时候,查询的字段必须是group by条件的字段,或者是聚合函数,不可以写其他字段
常用聚合函数
avg:求平均
sum:求和
count:求数量
where 必须写在group的前面 这个条件在group之前就会生效
如果需要在查询之后,在使用条件进行筛选,那么则使用having
select avg(sal),job from emp where DEPTNO=20 group by job having avg(sal)<1500 order by avg(sal) desc;
排序
基本排序必须写在最后面
ASC是升序 DESC是降序
可以支持多个字段的排序,以逗号进行分割即可,默认排序是ASC,如果需要降序需要手动在字段的最后面写上DESC
select 字段,字段,字段 from 表名 order by 字段,字段 DESC;
条件查询
主要通过表名的后面的where设置条件
等值判断:主要通过=进行判断
无论数值,时间,字符串都可以使用
无论数值,时间,字符串也都可以使用字符串
select * from 表名 where 字段=要判断的条件
select * from 表名 where 字段 = 要判断的条件
逻辑判断
and:两个同时满足
or :其中一个满足
not:取反的情况,需要和别的关键词配合使用
select * from 表名 where 字段 not in(值1,值2,值3)
不等于号
<,>:判断大于还是小于
<=,>= 判断大于等于或者小于等于
!=: 不等于
<>:不等于
区间判断
通过between。。。and查询两个条件之间的结果
select * from emp where sal between 800 and 1600;
相当于以下操作
select * from emp where sal > 800 and sal< 1600;
空值判断
判断字段是否是空值
select * from 表名 where 字段 is null
可以和not配合查询非空字段
select * from emp where comm is not null;
枚举查询
主要通过in查找指定的集合的数值条件
select * from 表名 shere 字段 in (值1,值2)
也可以配合not使用
select * from emp where sal not in (900,1100,1300,1500,1700);
模糊查询
主要是通过like进行条件判断
在设置比较的值后需要通过%作为多个字符的通配符
-- 查询以s开头的名字
select * from emp where ENAME like 's%';
-- 查询包含一个s的名字
select * from emp where ENAME like '%s%';
-- 查询以s结尾的名字
select * from emp where ENAME like 's%';
_是匹配一个字符
-- 查询第三个字符是O的操作
select * from emp where ENAME like '__o%';
分支查询
主要在字段的结果通过分支来实现不同的输出定义
select ENAME,SAL,CASE
WHEN SAL > 3000 THEN 'P7'
WHEN SAL <= 3000 AND SAL> 2000 THEN 'P6'
WHEN SAL <= 2000 AND SAL> 1000 THEN 'P5'
ELSE 'P4'
END AS LEVEL
from emp;
以CASE开头,以END AS字段别名作为结尾
中间通过WHEN...THEN结果作为条件
最后使用ELSE设置其他情况
时间查询
时间类型可以直接使用符号和字符进行判断
select * from emp where HIREDATE > '1982-1-1'
时间类型的函数的使用
时间函数 | 描述 |
---|---|
SYSDATE() | 当前系统时间(日、月、年、时、分、秒) |
CURDATE() | 获取当前日期 |
CURTIME() | 获取当前时间 |
WEEK(DATE) | 获取指定日期为一年中的第几周 |
YEAR(DATE) | 获取指定日期的年份 |
HOUR(TIME) | 获取指定时间的小时值 |
MINUTE(TIME) | 获取时间的分钟值 |
DATEDIFF(DATE1,DATE2) | 获取DATE1 和 DATE2 之间相隔的天数 |
ADDDATE(DATE,N) | 计算DATE 加上 N 天后的日期 |
字符串查询
concat用于字符串的拼接 ,不能使用+号
select concat('聪明',ENAME,'后缀') from emp;
在指定的位置插入文字
SELECT INSERT('这是一个数据库',3,2,'MySql');
#指定内容转换为小写
SELECT LOWER('MYSQL');#mysql
#指定内容转换为大写
SELECT UPPER('mysql');#MYSQL
#指定内容截取
SELECT SUBSTRING('JavaMySQLOracle',5,5);#MySQL
聚合函数
单例总和
x #统计所有员工每月的工资总和SELECT sum(salary)FROM t_employees;
单例最大值
#统计所有员工每月的平均工资
SELECT AVG(salary)
FROM t_employees;
单例最大值
#统计所有员工中月薪最高的工资
SELECT MAX(salary)
FROM t_employees;
单例最小值
#统计所有员工中月薪最低的工资
SELECT MIN(salary)
FROM t_employees;
总行数
#统计员工总数
SELECT COUNT(*)
FROM t_employees;
#统计有提成的员工人数
SELECT COUNT(commission_pct)
FROM t_employees;
注意:聚合函数自动忽略null值,不进行统计
分组查找
查询每个部门的人数
select count(*),DEPTNO from emp group by DEPTNO;
查询各个部门的平均工资
select avg(sal),DEPTNO from emp group by DEPTNO;
查询20,30最大的工资的人
select MAX(sal),DEPTNO from emp group by DEPTNO having DEPTNO in(20,30);
子查询
将查询的结果,作为另一个查询条件
查询结果有多个值的时候需要使用in
select * from emp where sal in
(select MAX(sal) from emp group by DEPTNO having DEPTNO in(20,30));