MySQL----DQL(下)和DML(数据库管理语言)


本文章接着上一篇博客连接起来

一 多表查询

(1)可以加分组(group by)

查询 每个城市 的部门个数
SELECT city,count(*)
FROM t_mysql_locations t,t_mysql_departments d
WHERE t.location_id=d.location_id
GROUP BY city
在这里插入图片描述

(2)可以加排序(order by)

查询 每个工种 的 工种名和员工的个数,并且 按员工个数降序
SELECT job_title,count(last_name)
FROM t_mysql_employees e,t_mysql_jobs j
WHERE e.job_id=j.job_id
GROUP BY job_title
ORDER BY count(last_name) desc
在这里插入图片描述

(3)可以实现三表连接(从三个表进行查询,把三个表进行连接)

查询员工名、部门名和所在的城市
SELECT e.last_name,p.department_name,c.city
FROM t_mysql_employees e,t_mysql_departments p,t_mysql_locations c
WHERE e.department_id=p.department_id AND p.location_id=c.location_id
在这里插入图片描述

DQL的自连接

理解自连接
自连接是连接的一种用法,但并不是连接的一种类型,因为他的本质是把一张表当成两张表来使用。
mysql有时在信息查询时需要进行对自身连接(自连接),所以我们需要为表定义别名。下面会有例子举例说明。

查询 员工名和上级的名称
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM t_mysql_employees e,t_mysql_employees m
WHERE e.manager_id=m.employee_id;
在这里插入图片描述

join链接

分类:
– 内连接 [inner] join on
– 外连接
• 左外连接 left [outer] join on
• 右外连接 right [outer] join on

使用ON 子句创建连接
• 自然连接中是以具有相同名字的列为连接条件的。
• 可以使用 ON 子句指定额外的连接条件。
• 这个连接条件是与其它条件分开的。
• ON 子句使语句具有更高的易读性。

语法:
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件

外连接(left/right join… on)

应用场景:用于查询一个表中有,另一个表没有的记录

特点:
1、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录
2、左外连接,left join左边的是主表
右外连接,right join右边的是主表
3、左外和右外交换两个表的顺序,可以实现同样的效果
4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

左外连接
join的语法:
select * from 表1 left/right JOIN 表2 on 链接条件;

女孩没有男朋友就不显示了,但是需求是不管女孩有没有男朋友都得展示,有就显示男朋友,没有就不显示男朋友
select * from t_mysql_beauty bt LEFT JOIN
t_mysql_boys b on b.id = bt.boyfriend_id;
在这里插入图片描述
右外连接也是如此,只要把left改成right就可以了

二 常见函数

概念

类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名。
好处:1、隐藏了实现细节 2、提高代码的重用性
调用:select 函数名(实参列表) 【from 表】;

作用:
主要是针对于列段类型值进行后期加工。

分类:
(1)字符函数:concat、 substr 、instr、 trim 、upper 、lower…
在这里插入图片描述

(2)数学函数:round、ceil、floor、truncate、mod
在这里插入图片描述

(3)日期函数:now、curdate、curtime、year、month、monthname、day、hour、minute、second…
在这里插入图片描述
(4)

查询某个表 的列段转换成小写
select lower(last_name) from t_mysql_employees;
在这里插入图片描述

#查询入职日期为1992–4-3的员工信息
SELECT * FROM employees WHERE hiredate = ‘1992-4-3’;
在这里插入图片描述

三 子查询

子查询其实就是在sql语句中嵌套sql语句。
步骤:
①逻辑分析充分需求,分段书写SQL子句
②最后拼接sql子句完成需求

特点:
①子查询放在小括号内
②子查询一般放在条件的右侧
③标量子查询,一般搭配着单行操作符使用> < >= <= = <>
④子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果。

谁的工资比 Abel 高?
我们首先看题目分析一下,我们可以先查询Abel的工资
SELECT salary
FROM t_mysql_employees
WHERE last_name = ‘Abel’
再然后查询员工的信息,满足 salary>Abel工资的情况结果
SELECT *
FROM t_mysql_employees
WHERE salary>(
SELECT salary
FROM t_mysql_employees
WHERE last_name = ‘Abel’
);
所有查询结果为:
在这里插入图片描述

再来举个例:

查询最低工资大于50号部门最低工资的部门id和其最低工资
首先我们先查询50号部门的最低工资
SELECT MIN(salary)
FROM t_mysql_employees
WHERE department_id = 50
再然后查询每个部门的最低工资
SELECT MIN(salary),department_id
FROM t_mysql_employees
GROUP BY department_id
还没完,最后在查询每个部门的最低工资的基础上筛选,满足min(salary)>50号部门的最低工资
SELECT MIN(salary),department_id
FROM t_mysql_employees
GROUP BY department_id
HAVING MIN(salary)>(
SELECT MIN(salary)
FROM t_mysql_employees
WHERE department_id = 50
);
其结果为:
在这里插入图片描述

四 分页查询

语法:
原有查询+limit startIndex,offset

注意事项:
1、原始查询的记录数<offset,那么查询的结果必然是原始查询的记录数
2、startIndex=0,那么可以省略,limit offset

 startIndex要显示条目的起始索引(起始索引从0开始)
offset要显示的条目个数

特点:
①limit语句放在查询语句的最后
②公式
要显示的页数 page,每页的条目数offset

查询前五条员工信息
SELECT * FROM t_mysql_employees LIMIT 0,5
在这里插入图片描述

五 DML(数据管理语言)

DML的增加

语法:
(1) 向指定表出入所有列段值
insert into 表名 values(…);
(2) 向表的特定列段插入值
insert into 表名(列段1,列段2…) valuses(列1对应的值,列2对应的值)

向t_mysql_departments插入一条数据
INSERT INTO t_mysql_departments(department_id,department_name,manager_id,location_id) VALUES(800,‘Cove’,223,1800)
查询表-------SELECT * FROM t_mysql_departments;
在这里插入图片描述

数据拷贝
(1)不必书写 VALUES 子句。
(2)子查询中的值列表应与 INSERT 子句中的列名对应

新建一张临时表存储现有数据
CREATE table t_mysql_boys_bak
as
SELECT * FROM t_mysql_boys WHERE 1=2

INSERT INTO t_mysql_boys_bak(id,boyName,userCP) VALUES (1,‘张无忌’, 1000)
INSERT INTO t_mysql_boys_bak(id,boyName,userCP) VALUES (2,‘鹿晗’, 800)
INSERT INTO t_mysql_boys_bak(id,boyName,userCP) VALUES (3,‘黄晓明’, 500)
INSERT INTO t_mysql_boys_bak(id,boyName,userCP) VALUES (4,‘段誉’, 3000)
在这里插入图片描述

筛选出id>2的数据
SELECT id,boyName,userCP FROM t_mysql_boys_bak WHERE id>2
在这里插入图片描述

DML的修改

语法:
update 表名 set 列段1=列段值1,列段2=列段2… where 筛选条件

• 可以一次更新多条数据。
• 如果需要回滚数据,需要保证在DML前,进行
• 使用 WHERE 子句指定需要更新的数据。

UPDATE t_mysql_employees
SET employee_id = 70 //设置70
WHERE employee_id = 113; // 把employee_id = 113更新
在这里插入图片描述

一次修改多表的数据

修改张无忌的女朋友的手机号为114
UPDATE t_mysql_boys bo
INNER JOIN t_mysql_beauty b ON bo.id=b.boyfriend_id
SET b.phone=‘119’,bo.userCP=1000
WHERE bo.boyName=‘张无忌’;

SELECT * from t_mysql_boys
在这里插入图片描述
SELECT * from t_mysql_beauty
在这里插入图片描述

DML的删除

语法:
delete from 表名 where 条件

delete 和 truncate区别

1.delete 可以加where 条件,truncate不能加

2.truncate删除,效率高一丢丢

3.假如要删除的表中有自增长列,
如果用delete删除后,再插入数据,自增长列的值从断点开始,
而truncate删除后,再插入数据,自增长列的值从1开始。

4.truncate删除没有返回值,delete删除有返回值

5.truncate删除不能回滚,delete删除可以回滚.

使用 WHERE 子句删除指定的记录。
DELETE FROM t_mysql_departments
WHERE department_name = ‘Finance’;
已删除
在这里插入图片描述

一次删除多表的数据

删除张无忌的女朋友的信息
DELETE b
FROM t_mysql_beauty b
INNER JOIN t_mysql_boys bo ON b.boyfriend_id = bo.id
WHERE bo.boyName=‘张无忌’;
已删除 SELECT * FROM t_mysql_beauty在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值