MySQL数据库基础知识2
一、常见函数:
字符函数:length concat substr instrtrim upper lower lpad rpad replace
数学函数:round ceil floor truncate mod
日期函数:now curdate curtime year month monthname day hour minute secondstr_to_date date_format
[if !supportLists]1、[endif]字符函数
#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;
[if !supportLists]2、[endif]数字函数
#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
[if !supportLists]3、[endif]日期函数
#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;
[if !supportLists]4、[endif]聚合函数
#简单的使用
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) FROMmanba;#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
[if !supportLists]1、[endif]内连接(等值连接、非等值连接、自连接)
#等值连接
#案例1:查询哪个部门的部门员工个数>3的部门名,和员工个数,并按个数进行降序
SELECT COUNT(*),department_name
FROM manba e
INNER JOIN departmentsd
ON e.`department_id`=d.`department_id`
GROUP BYdepartment_name
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;
#案例2:查询员工名、部门名、工种名,并按部门名降序(三表连接)
SELECT last_name,department_name,job_title
FROM manba e
INNER JOIN departmentsd
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 beautybe
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 employee_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 employee_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
[if !vml]
[endif]
【编测编学】 教学内容为:
测试基础知识、项目实战、测试管理、敏捷测试、探索式测试、APP测试、Linux、数据库、测试环境搭建、Python编程、WEB端UI自动化测试、APP端UI自动化、接口功能测试、性能测试、接口自动化测试、Jenkins持续集成 等内容。
通过学习,学员能 掌握软件测试企业最新技术,对标一线互联网企业项目要求,使学员达到中高级测试工程师的水平,毕业后可快速融入企业实际工作中。
不管你是 文科生、专科生、0基础、女同学 都可以轻松学会!