前言:本次学习了数据库的第二节内容,总体还是比较简单的,重点在于函数的应用,分组查询的两种情况,以及连接查询的不同方式的差别以及如何灵活的使用复杂函数进行一波查询;
一:常见函数;(分为单行函数和分组函数)
1:单行函数:(包含了很多数据库查询,转换的功能要记住,并且能够灵活运用);
1:字符函数:查询字符长度;(char_length)
SELECT
emplyee_name,CHARACTER_LENGTH(emplyee_name)
FROM emplyees;
拼接字符串:可以将字符串拼接起来(concat)
SELECT CONCAT('aaa','bbb','ccc');
转换大小写(Upper,lower):
SELECT UPPER(email) FROM emplyees;
截取字符串(substr,substring作用相同,无区别):
1指的是从第几个字符开始截取,3指的是截取字符的长度
SELECT SUBSTR(phone_number,1,3) FROM emplyees;
替换函数(replace):
“-”指的是被替换的字符,“”指的是用于替换的字符
SELECT REPLACE(phone_number, '-', '') FROM emplyees;
2:数学函数(一些四舍五入,向上或者向下取整数,取余的函数)
四舍五入(round):SELECT salary,ROUND(salary) FROM emplyees;
向上取整CEIL(会大于等于原来的数据):SELECT salary,CEIL(salary) FROM emplyees;
向下取整FLOOR(会小于等于原来的数据):SELECT salary,FLOOR(salary) FROM emplyees;
截断TRUNCATE(将数据的小数截断到想要的长度):SELECT TRUNCATE(1.999999,2); -- 1.99
取余MOD或直接使用%;
日期函数:返回当前时间(包含日期和具体时间)的函数NOW()或SYSDATE();
返回系统日期不包含具体时间:curdate();
返回当前具体时间,不包括日期:curtime();
查询两个数据相差时间可以使用DATEDIFF()函数:
SELECT DATEDIFF(NOW(),'2000-01-01');
3:流程控制函数
if()函数;类似于三目表达式,如果满足条件则返回中间的表达式,否则执行最后一个表达式
SELECT IF(2 > 1, '大', '小');
case函数;类似于switch case
SELECT (在结束时得加上一个,号不然会报错)
case 要判断的字段或者表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
...
else 要显示的值n或者语句n
end
也可做区间判断:
SELECT
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
...
else 要显示的值n或者语句n
end
4:分组函数(SUM()求和,AVG平均值,MAX最大值,MIN最小值,COUNT计算个数)
二:分组查询(使用函数group by将图表根据条件先分组在查询更加简便)
SELECT 查询列表,分组函数(字段)
FROM 表
[where 筛选条件]
GROUP BY 分组
[ORDER BY 排序]
需要注意的是如果是分组后在筛选数据就要使用HAVING关键字
SELECT department_id,COUNT(*) FROM emplyees
GROUP BY department_id
HAVING COUNT(*) > 120;
多个字段进行查询时只要使用“,”分开就可以
三:连接查询(又叫多表查询,再查询的数据需要多张表时就需要用到多表查询)
SELECT 查询列表 FROM 表1
JOIN 表2
2:解决笛卡尔乘积现象的方法
-- sql99版本写法
SELECT emplyee_name,department_name
FROM emplyees
INNER JOIN departments -- INNER可以省略
ON emplyees.department_id = departments.department_id;
-- 表格也能起别名
SELECT emplyee_name,department_name
FROM emplyees t1
JOIN departments t2
ON t1.department_id = t2.department_id;
内连接(等值连接,非等值连接,自连接)
等值连接:
-- 根据员工表和部门表的关系作等值连接
SELECT emplyee_name,department_name
FROM emplyees t1
JOIN departments t2
ON t1.department_id = t2.department_id;
非等值连接:如查询员工工资及工资等级
SELECT t1.salary,t2.grade_level
FROM emplyees t1
JOIN job_grades t2
ON t1.salary BETWEEN t2.lowest_sal AND t2.higest_sal;
自连接(一张表连接两次):
SELECT t1.emplyee_name 员工,t2.emplyee_name 领导
FROM emplyees t1
JOIN emplyees t2
ON t1.manager_id = t2.emplyee_id;
外连接:
左连接和右连接;
左连接就是把前面的表当作主表会全部呈现出来,后面的表当作附表只会出来需要的数据
select 查询列表
from 表1 别名 [inner|left|right] -- inner内连接,默认值;left左连接;right右连接
join 表2 别名
on 连接条件
[where 筛选条件]
[group by 分组]
[having 筛选条件]
[order by 排序列表]