mysql加强
级联操作
- 问题: 当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表!但是,我们希望直接修改或删除主表数据,从而影响副表数据。可以使用级联操作实现!!!
- 级联修改: ON UPDATE CASCADE
- 级联删除: ON DELETE CASCADE
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptId INT,-- 把部门名称改为部门ID
-- 声明一个外键约束
CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE -- ON CASCADE UPDATE :级联修改
-- 外键名称 外键 参考表(参考字段)
)
- 注意: 级联操作必须在外键基础上使用
-- 级联修改(修改)
-- 直接修改部门
UPDATE dept SET id=5 WHERE id=4;
-- 级联删除
-- 直接删除部门
DELETE FROM dept WHERE id=1;
关联查询(多表查询)
- 交叉连接查询(不推荐。产生笛卡尔乘积现象:4 * 4=16,有些是重复记录)
SELECT empName,deptName FROM employee,dept;
- 内连接查询:只有满足条件的结果才会显示(使用最频繁)
把两个表的相关数据提取出来形成一个新表
SELECT empName,deptName -- 2)确定哪些哪些字段
FROM employee,dept -- 1)确定查询哪些表
WHERE employee.deptId=dept.id -- 3)表与表之间连接条件
-- 内连接的另一种语法
SELECT empName,deptName
FROM employee
INNER JOIN dept
ON employee.deptId=dept.id;
-- 使用别名
SELECT e.empName,d.deptName
FROM employee e
INNER JOIN dept d
ON e.deptId=d.id;
- 左连接
使用左边表的数据去匹配右边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null
左表的数据一定会完成显示!
SELECT d.deptName,e.empName
FROM dept d
LEFT OUTER JOIN employee e
ON d.id=e.deptId;
- 右连接
使用右边表的数据去匹配左边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null
注意: 右外连接:右表的数据一定会完成显示!
SELECT d.deptName,e.empName
FROM employee e
RIGHT OUTER JOIN dept d
ON d.id=e.deptId;
- 自连接查询
SELECT e.empName,b.empName
FROM employee e
LEFT OUTER JOIN employee b
ON e.bossId=b.id;
子查询
一个查询,通常就是一个select语句(即出现一次select关键字)
常见子查询及相关关键字
- 使用in查询
in的基本语法形式为:
where 操作数 in (值1,值2, ....) 则in子查询就是:
where 操作数 in ( 列子查询 );
含义:
表示该操作数(字段值) 等于 该子查询的其中任意一个只,就算满足条件。
- 使用any查询
使用形式:
where 操作数 比较运算符 any ( 列子查询 );
含义:
表示该操作数的值只要跟列子查询的任意一个值满足给定的比较运算,就算满足了条件——就是只要有一个成就成。
- 使用all查询
where 操作数 比较运算符 all ( 列子查询 );
含义:
表示该操作数的值必须跟列子查询的所有值都满足给定的比较运算,才算满足了条件。
举例:
找出产品表中的价格最高的产品。
分析:最高价的产品的价格会大于等于所有产品价格。
select * from product where price >= all(
select price from product
);
- 使用some的子查询
与any一样
- 使用exists的子查询
where exists (子查询)
含义:
如果该子查询有结果数据(无论什么数据,只要大于等于1行),则就是true,否则为false
举例:
找出具有在售商品的那些类别:
select * from product_type where exists(
select * from product where product.protype_id=product_type.protype_id
);
- 使用not exists子查询
与not exists相反
联合查询(union)
- 基本含义
联合查询就是将两个select语句的查询结果“层叠”到一起成为一个“大结果”。 两个查询结果的能够进行“联合”的先觉条件是:结果字段数相等。