一、常见函数:
字符函数:length concat substr instr trim upper lower lpad rpad replace
数学函数: round ceil floor truncate mod
日期函数:now curdate curtime year month monthname day hour minute second str_to_date date_format
1、 字符函数
#length 获取参数值的字节个数
SELECT LENGTH('john');#4
SELECT LENGTH(' 张三丰hahaha');#15,utf8一个汉字占3个字节
#concat 拼接字符串(用下划线拼接)
SELECT CONCAT(last_name,'_',first_name) FROM manba;
#upper,lower SELECT UPPER('john');# 变大写SELECT LOWER('JOHN');#变小写
# 示例:将姓变大写,名变小写,拼接
SELECT CONCAT(UPPER(last_name),LOWER(first_name)) AS 姓名 FROM manba;
#substr ,substring
# 注意索引从1开始,下语句输出:和李四
# 截取从指定索引处后面所有字符
SELECT SUBSTR(' 张三和李四',3) out_put;
# 截取从指定索引处指定字符长度的字符
# 下面语句输出:张三
SELECT SUBSTR(' 张三和李四',1,2) out_put;
# 案例:姓名中首字符大写,其他字符小写,用_拼接,显示出来
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) output FROM manba;
#instr
# 返回子串的起始索引,找不到返回0
SELECT INSTR(' 杨不悔爱上了殷六侠','殷六侠') AS out_put
#trim 去掉首尾的
# 输出张翠山
SELECT LENGTH(TRIM(' 张翠山')) AS out_put;
# 输出张aaaa翠山
SELECT TRIM('a' FROM 'aaaa 张aaaa翠山aaaaaaaa') AS out_put;
#lpad 用指定的字符实现左填充指定长度
# 输出*******殷素素
SELECT LPAD(' 殷素素',10,'*') AS out_put;
# 输出:殷素
SELECT LPAD(' 殷素素',2,'*') AS out_put;
#rpad 用指定的字符实现右填充指定长度
# 输出:殷素素ababababa
SELECT RPAD(' 殷素素',12,'ab') AS out_put;
#replace 替换
SELECT REPLACE(' 张无忌爱上了周芷若','周芷若','赵敏') AS out_put;
2、 数字函数 #round 四舍五入 SELECT ROUND(1.65);#2 SELECT ROUND(-1.45);#-1 SELECT ROUND(1.567,2);#1.57, 小数点后保留2位 #ceil 向上取整(返回>=该参数的最小整数) SELECT CEIL(-1.02);#-1 SELECT CEIL(1.00);#1 #floor 向下取整,返回<=该参数的最大整数 SELECT FLOOR(-9.99);#-10 #truncate 截断 SELECT TRUNCATE(1.65,1);#1.6; #mod 取余 mod(a,b) : a-a/b*b mod(-10,-3) : -10-(-10)/(-3)*(-3)=-1;
SELECT MOD(10,-3);#1
3、 日期函数
#now: 返回当前系统日期加时间
SELECT NOW();
#curdate 返回当前系统日期,不包含时间
SELECT CURDATE();
#curtime() 返回当前时间,不包含日期
SELECT CURTIME();
# 可以获取指定的部分,年,月,日,小时,分,秒
SELECT YEAR(NOW()) AS 年;
SELECT YEAR('1998-1-1') 年;
SELECT YEAR(hiredate) 年 FROM employees;
SELECT MONTH(NOW()) 月;
SELECT MONTHNAME(NOW()) 月;#显示英文月份
#str_to_date 将日期格式的字符转换成指定格式的日期
%Y 四位的年份
%y 2 位的年份
%m 月份 (01,02,...12)
%c 月份(1,2,..., 12)
%d 日
%H 小时(24)%h(12)
%i 分钟 %s秒
SELECT STR_TO_DATE('9-13-1999','%m-%d-%Y') 日期;#1999-09-13
SELECT STR_TO_DATE ('2020-4-17','%Y-%c-%d') AS output;#2020-4-17
# 查询入职日期为1992-4-3的员工信息
SELECT * FROM employees WHERE hiredate='1992-4-3';
SELECT * FROM employees WHERE hiredate=STR_TO_DATE('4-3 1992','%c-%d %Y');
#date_format 将日期转换成字符
SELECT DATE_FORMAT(NOW(),'%y 年%m月%d日') AS output;#20年4月17日
# 查询有奖金的员工名和入职日期(xx月/xx日 xx年)
SELECT last_name,DATE_FORMAT(hiredate,'%m 月/%d日 %Y年') 入职日期
FROM employees
WHERE commission_pct IS NOT NULL;
4、 聚合函数
# 简单的使用
SELECT SUM(salary) FROM manba;
SELECT SUM(salary) 和,ROUND(AVG(salary),2) 平均 FROM manba;
SELECT MAX(salary) 最高,MIN(salary) 最低 FROM manba;
SELECT MIN(salary) FROM manba;
SELECT COUNT(salary) FROM manba;
# 参数支持哪些类型
SELECT SUM(last_name),AVG(last_name) FROM manba;
SELECT SUM(hiredate),AVG(hiredate) FROM manba;
# 无意义,不这样用
SELECT MAX(last_name),MIN(last_name) FROM manba;
SELECT MAX(hiredate),MIN(hiredate) FROM manba;
# 支持
SELECT COUNT(last_name) FROM manba;# 计算非空的值 107 SELECT COUNT(commission_pct) FROM manba;#35
# 是否忽略null
SELECT SUM(commission_pct),AVG(commission_pct) FROM manba;
# 和distinct搭配
SELECT SUM(DISTINCT salary), SUM(salary) FROM manba;
SELECT COUNT(DISTINCT salary), COUNT(salary) FROM manba;
#count 函数的详细介绍
SELECT COUNT(salary) FROM manba;
SELECT COUNT(*) FROM manba;# 统计每一列的数目,即所有行数
SELECT COUNT(1) FROM manba;# 和上一语句效果一样
#6 、和分组函数一同查询的字段有限制
SELECT AVG(salary),manba _id FROM manba;# 这个员工id查出来没有意义
二、分组查询
语法select分组函数(max,min等),列(要求出现在group by后面)fro表
【where 筛选条件】group by 分组的列表【order by】子句
注意:查询列表必须特殊,要求是分组函数和group by后出现的字段
# 简单的分组查询
# 案例1:查询每个工种的最高工资
SELECT MAX(salary),job_id
FROM manba
GROUP BY job_id;
# 案例2:查询每个位置上的部门个数
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;
# 添加分组前筛选条件
# 案例1:查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary),department_id
FROM manba
WHERE email LIKE '%a%'
GROUP BY department_id;
# 案例2:查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id
FROM manba
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
# 添加分组后的筛选条件
# 案例1:查询哪个部门的员工个数大于2
# ①查询每个部门的员工个数
SELECT COUNT(*),department_id
FROM manba
GROUP BY department_id;
# ②根据1的结果进行筛选
SELECT COUNT(*),department_id
FROM manba
GROUP BY department_id
HAVING COUNT(*)>2;
# 案例2:查询每个工种有奖金的员工的最高工资>12000的 工种编号和其最高工资
# ①查询每个工种有奖金的员工的最高工资
SELECT MAX(salary),job_id
FROM manba
WHERE commission_pct IS NOT NULL
GROUP BY job_id;
# ②根据1的结果继续筛选,最高工资>12000
SELECT MAX(salary),job_id
FROM manba
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
# 案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号
# ①查询领导编号>102的每个领导手下的最低工资
SELECT MIN(salary),manager_id
FROM manba
WHERE manager_id>102
GROUP BY manager_id;
# ②在1的基础上,最低工资>5000
SELECT MIN(salary),manager_id
FROM manba
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000
# 按表达式或函数分组
# 案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的
SELECT COUNT(*),LENGTH(last_name) len_name
FROM manba
GROUP BY len_name
HAVING COUNT(*)>5;
# 按多个字段分组
# 案例:查询每个部门每个工种的员工的平均工资
SELECT AVG(salary),department_id,job_id
FROM manba
GROUP BY department_id,job_id;
# 添加排序
## 案例:查询每个部门每个工种的员工的平均工资,并将>10000的按高低排序
SELECT AVG(salary) a,department_id,job_id
FROM manba
GROUP BY department_id,job_id
HAVING a>10000
ORDER BY AVG(salary) DESC;
三、链接查询( 又称多表查询,当查询的字段来自多个表,就会用到连接查询 )
语法:select 查询列表
from 表1 别名 【连接类型】
join 表2 别名 on 【连接条件】
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
分类:内连接:inner
外连接:左外 left 【outer】
右外 right 【outer】
全外 full 【outer】
交叉连接:cross
1、 内连接(等值连接、非等值连接、自连接)
# 等值连接
# 案例 1 :查询哪个部门的部门员工个数 > 3 的部门名,和员工个数,并按个数进行降序
SELECT COUNT ( * ), department_name
FROM manba e
INNER JOIN departments d
ON e . `department_id` = d . `department_id`
GROUP BY department_name
HAVING COUNT ( * ) > 3
ORDER BY COUNT ( * ) DESC ;
# 案例 2 :查询员工名、部门名、工种名,并按部门名降序(三表连接)
SELECT last_name , department_name , job_title
FROM manba e
INNER JOIN departments d
ON e . `department_id` = d . `department_id`
INNER JOIN jobs j
ON e . `job_id` = j . `job_id`
ORDER BY department_name DESC ;
# 非等值
# 查询工资的个数 > 20 的级别个数,并且按工资级别降序
SELECT COUNT ( * ), grade_level
FROM manbae
INNER JOIN job_grades g
ON e . `salary` BETWEEN g . `lowest_sal` AND g . `highest_sal`
GROUP BY grade_level
HAVING COUNT ( * ) > 20
ORDER BY grade_level DESC ;
# 自连接
# 查询员工的名字,上级的名字
SELECT e . last_name , m . last_name
FROM manba e
JOIN manba m
ON e . `manager_id` = m . `manba_id` ;
# 加筛选:姓名中包含字符 k 的员工名字、上级名字
SELECT e . last_name , m . last_name
FROM manba e
JOIN manba m
ON e . `manager_id` = m . `manba _id`
WHERE e . `last_name` LIKE '%k%' ;
2 、外连接
# 查询男朋友不在男生表的女生名
# 左外连接
SELECT be . name , bo . *
FROM beauty be
LEFT OUTER JOIN boys bo
ON be . boyfriend_id = bo . id
WHERE bo . `id` IS NULL ;
# 右外连接
SELECT be . name , bo . *
FROM boys bo
RIGHT OUTER JOIN beauty be
ON be . boyfriend_id = bo . id
WHERE bo . `id` IS NULL ;
四、子查询( 出现在其他语句内部的 select 语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询 )
1. 查询和Zlotkey相同部门的员工姓名和工资
SELECT last_name,salary
FROM manba
WHERE department_id=(
SELECT department_id
FROM manba
WHERE last_name='Zlotkey');
#2 、查询工资比公司平均工资高的员工的员工号,姓名,工资
SELECT last_name,employee_id,salary
FROM manba
WHERE salary>(SELECT AVG(salary)FROM manba);
#3 、查询各部门中工资比本部门平均工资高的员工号,姓名,工资
SELECT employee_id,last_name,salary,e.`department_id`
FROM manba e INNER JOIN(SELECT AVG(salary) ag,department_id
FROM manba
GROUP BY department_id)avg_dep
ON e.`department_id`=avg_dep.department_id
WHERE salary>avg_dep.ag;
#4 、查询,和姓名中包含字母u的员工在相同部门的员工,的员工号和姓名
SELECT last_name,manba_id
FROM manba
WHERE department_id IN(
SELECT DISTINCT department_id
FROM manba
WHERE last_name LIKE '%u%');
#5 、查询在部门的location id为1700的部门工作的员工的员工号
SELECT manba_id
FROM manba
WHERE department_id=ANY(
SELECT department_id
FROM departments
WHERE location_id=1700);
#6 、查询管理者是king的员工姓名和工资
SELECT last_name,salary
FROM manba
WHERE manager_id IN(
SELECT manba_id
FROM manba
WHERE last_name='K_ing');
#7 、查询工资最高的员工的姓名,要求first和last_name显示为一列,列名为姓名
SELECT CONCAT(first_name,last_name) " 姓名"
FROM manba WHERE salary=(SELECT MAX(salary)
FROM manba
【编测编学】 教学内容为:
测试基础知识、项目实战、测试管理、敏捷测试、探索式测试、APP测试、Linux、数据库、测试环境搭建、Python编程、WEB端UI自动化测试、APP端UI自动化、接口功能测试、性能测试、接口自动化测试、Jenkins持续集成 等内容。
通过学习,学员能 掌握软件测试企业最新技术,对标一线互联网企业项目要求,使学员达到中高级测试工程师的水平,毕业后可快速融入企业实际工作中。
不管你是 文科生、专科生、0基础、女同学 都可以轻松学会!
