SQL
DDL
- 数据库定义语言(定义数组库的一些组件:表, 索引…)
DML
- 数据库操作语言(增、删、改、查)CRUD
DCL
- 数据库控制语言(权限 用户管理…)
DQL
-
数据库查询语言
-
格式 :
-
select 列名*N from 表名 where 查询条件1 and/or 查询条件2 group by 列 Having 分组条件 Order by 排序;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ojTNHOTQ-1621047010831)(C:\Users\李嘉睿\Desktop\image-20210513221212318.png)]
-
规则
-
sql在书写的时候除了查询条件之外,大小写都可以
-
保持大小写风格。
-
select * from user where uname = ‘ 25 ’ ;
-
SELECT * FROM USER WHERE UNAME = ‘ 25 ’ ;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xerjLMPw-1621047010838)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210513221703222.png)]
-
-
**–**属于SQL语言的注释[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qCQrWBZ1-1621047010844)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210513222030624.png)]
-
所有查询条件为字符串时,需要用**’’**修饰,否则就会当作列名去处理。
-
-
DQL之查询列和别名
-
同时查询两个列,可之间用逗号将列名连接。 (*t通配符, 默认查询所有的列)
eg:select 列名1 , 列名2 from 表名 ;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r3Q2eruT-1621047010847)(C:\Users\李嘉睿\Desktop\image-20210514142106021.png)]
- 取别名只需要在原列名后面加上想要取的别名。(可以直接加,也可以用单引号或双引号阔上)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EVriO27X-1621047010850)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210514142429991.png)]
-
在列名上加减乘除后, 表里就会自动运算。
eg:select ename, (sal + conm) * 12 年薪 from emp
-
CONCAT(… , … , …)把列可以连接起来( … 也能是字符串)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xS0A8BSY-1621047010851)(C:\Users\李嘉睿\Desktop\image-20210514145304757.png)]
-
按条件查询指定的列。
-
普通条件查询:
用 = ,而不是 == ,(同理= 也可换为 > < >= <= !=(可用<>表示) between a and b(查询的x范围是 a<= x <= b))
eg:查empno 为 7844的。
select * from emp where empno = 7844;
select * from emp where job = ‘ SALESMAN ’;
当查询条件为字符串一定要加单引号, 不然会认为是列名
-
in在某个范围内查找 :
select * from 列名 where 条件列名 in/ not in(… , … , … ) 表示在这/不在范围里的
eg:select * from emp where empno not in (7499, 7566, 8888);
-
null值查询:
-- 查询不发津贴的员工信息 select * from emp where comm is null; -- 查询发放津贴的员工信息 select * from emp where comm is not null;
-
模糊查询 % _
- %可以代替任意字符里的任意字数(也可以代表0个字数)。
--名字里最后一个字为N的员工信息 select * from emp where ename like '%N' --名字里第一个字为M的员工信息 select * from emp where ename like 'M%' --名字中含有M的员工信息 select * from emp where ename like '%M%'
2. **_ 代表任意字符的一次** 。
--名字中第二个字为M的员工信息 select * from emp where ename like '_M%' --
3. 查询信息含有%或者_ 的情况下, 需要加转义字符 ’ \ ‘
eg:
--查询名字中含有%的员工信息 select * from emp where ename like '%\%%'
4. 如果查询第188个字符是A,这需要一些特殊手段 -》函数。
-
多条件联合查询 and or
-
or 或者 and 必须
--名字为smith 并且 工资7900的员工信息 select * from emp where ename = 'smith' and empno = 7900; --名字为smith 或者 工资7900的员工信息 select * from emp where ename = 'smith' or empno = 7900;
-
-
select 查询结果排序 order by
-
使用 asc 是升序排列(默认), 使用 desc 可以降序排列
-
单列
-
--按照薪资排序(默认升序) select * from emp order by sal; --按照薪资排序(降序) select * from emp order by sal desc; --按照薪资排序(升序) select * from emp order by sal asc; --null排在最前面
-
-
多列
--多个排序的列 select * from emp order by deptno, sal; --多个排序的列(有升序, 有降序) select * from emp order by deptno, sal desc;
-
分页 limit N (每次查询前N行)
-- 查询前4行 select * from emp limit 4 --查询第N页, 每页显示M个 select * from emp limit (n-1)*M, M; --查询薪资大于1000且逆序排列的前五条员工信息 select * from emp where sal > 1000 order by sal desc limit 0, 5;
单行函数
-
单行函数
-
指的是一行数据返回一行数据,操作10行数据返回世行数据。
-
字符串函数
-
长度 : length(列名)
-- ename 和 ename 的长度 select ename, length(ename) from emp;
-
截取: SUBSTR(列名, … , …)
-
-- 员工的名字 和 员工名字第一个到第三个字符 select ename , SUBSTR(ename, 1, 3) from emp; -- 名字中第五个字符为s的员工信息 select * from emp where subst(ename, 5, 1 ) = 's';
-
-
大小写 : upper(列名) 、 lower(列名)
-
select ename, upper(ename), lower(ename) from emp;
-
-
拼接: concat(列名, ’ …‘ , 列名 )
-
select concat(empno, '=', ename) from emp;
-
-
替换: replace (列名, ’ 字符a‘, ’字符b‘) 把字符a换成字符b
-
select ename, replace(ename, 'T', '--') from emp
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tfzD37fb-1621047010853)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210514221256942.png)]
|| 可以连接函数和字符串,字符串和字符串, …。
-
-
-
数值类型函数
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B8Ulpp3V-1621047010854)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210514222008435.png)]
-
日期函数
-
获取当前系统时间 : sysdate(), current_date() , current_time()
-
--获取hiredate列和 当前系统时间。 select hiredate, sysdate(), from emp; --获取hiredate列和 当前会话时区的 日期、时间、日期和时间。 select hiredate,current_date(), current_time(), current_timestamp() from emp;
-
-
日期转换 : date_format(sysdate(), …)
--以%Y-%m-%d %H:%i:%s的形式表示当前时间 select date_format(sysdate(), '%Y-%m-%d %H:%i:%s');
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZKdGL3u-1621047010856)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210514223307608.png)]
-
分别获取 年月日 时分秒 星期 extract(… from sysdate());
-
--获取当前时间中的分钟 select extract(minute from sysdate()); -- minute 可换成 second minute hour day week month year
-
-
日期的加减操作: adddate(… , …)
-
--获取hiredata, 在hiredate上再加九天 select hiredate, adddate(hiredate, 9) from emp; --获取hiredata, 在hiredate上再减九天 select hiredate, adddate(hiredate, -9) from emp; select date('2012-11-11');
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WIxQh070-1621047010857)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210514222057254.png)]
-
-
其他函数
-
空值的处理 ifnull(列名, 想要被当作的数字)
-
ifnull(exp1, exp2) exp1 != null ? exp1 : exp2; --comm中有0的话,当作888去运算。 select ifnull(comm, 888) from emp;
-
-
加密算法 md5("…") 不可逆加密
可逆加密:
AES_ENCRYPT(‘加密字符串’,KEY);
AES_DECRYPT(‘解密字符串’,KEY);
-
--将字符串123456加密 select MD5('123456'); --将123456加密,密码为shsxt,将加密后码再次加密。 select aes_encrypt('123456', 'shsxt'), aes_encrypt(aes_encrypt('123456', 'shsxt'), 'shsxt');
-
-
-
转换函数
-
日期 —> 字符串 : date_format(日期, '‘字符串’‘);
date_format(date, expr); --当前日期转换成字符串 select date_format(sysdate(); '%Y-%c-%d %H:%i:%s');
-
字符串 ----> 日期 : str_to_date(‘字符串’, 日期);
- 要注意字符串和格式的匹配。
select str_to_date('2020-4-16 17:15:24', '%Y-%c-%d %H-%i-%s');
-
数字 ----> 字符串
- 直接拼接一个字符串即可,可以自动转换
-
字符串 -----> 数字
- 依靠函数提供的参数
- 依靠函数提供的参数
-
-
多行函数
-
常见的五个多行函数
-
max 最大值
- 如果处理的值是字符串,将会把值按照字典序排序。
-
min 最小值
- 如果处理的是字符串,将会把值按照字典序排序。
-
avg 平均值
- 只能用于数值型数据,求平均值
-
sum 求和
- 如果求和的过程中有null,不会计算在内。
-
count 求总数
- 如果数据中有null,不会计算在内。
-
--标准的答案 select max(sal), min(sal), sum(sal), avg(sal), count(sal) from emp; --经典错误 --查询公司最低薪资的员工是谁? select min(sal), ename from emp; --呈现的是最低薪资和第一个人的名字。 -- mysql语法不报错,oracle报错。
-
工作时不要将普通列和组函数写在一起
- 虽然mysql语法不会报错,但是给的结果是错误的。
-
数据分组 : group by
-
按照某一个条件进行分组,每一组返回对应的结果。
-
group by可以对指定的列进行分组。
-
--工资最高的工作 select job, max(sal) from emp group by job; select deptno, min(sal) from emp group by deptno; select deptno, avg(sal) from emp where sal < 3000 group by deptno order by deptno; --查询那个部门每个月的津贴总数超过1000 select deptno,, sum(comm) from emp where is not null group by deptno having sum(comm) > 1000; --查询每个部门中名字含有A的平均薪资 select deptno, avg(sal) from emp where ename like '%A%' group by deptno; --查询10,20部门中,并且在二月份入入职员工中,每个部门中平均薪资高于1500的 工作是什么,并按照部门,工作平均薪资进行排序。 select deptno, job, avg(sal) from emp where deptno in(10, 20) and extract(month from hiredate) = 2 group by deptno, job having avg(sal) > 1500 order by deptno, avg(sal);
-
having : 对分组后的数据进行过来,所以能出现在having中的比较项一定是被分组的列或者是组函数。
eg: having avg(sal) >1800;
-
底层
- where : 行级过滤 , 处理的是表中每一行数据的过滤。 eg:where sal < 3000;
- having:组级过滤, 处理的是分组后的每一组数据。
- 能使用where的,尽量不要使用having。
-
List item