【编测编学】MySQL数据库基础知识 2

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基础、女同学 都可以轻松学会!

你可能感兴趣的:(【编测编学】MySQL数据库基础知识 2)