mysql联表查询多记录显⽰_数据库:MySQL(多表的表记录一张图介绍前端三大框架
的查询)(三)
⼀、外键约束
1、创建外键
---每⼀个班主任会对应多个学⽣ , ⽽每个学⽣只能对应⼀个班主任----主表
CREATE TABLE ClassCharger(
id TINYINT PRIMARY KEY auto_increment,
name VARCHAR (20),mysql1045错误
age INT ,
is_marriged boolean-- show create table ClassCharger: tinyint(1)
);
INSERT INTO ClassCharger (name,age,is_marriged) VALUES ("冰冰",12,0),
("丹丹",14,0),
("歪歪",22,0),
("姗姗",20,0),
("⼩⾬",21,0);----⼦表
CREATE TABLE Student(
id INT PRIMARY KEY auto_increment,
name VARCHAR (20),
charger_id TINYINT,--切记:作为外键⼀定要和关联主键的数据类型保持⼀致--[ADD CONSTRAINT charger_fk_stu]FOREIGN KEY (charger_id) REFERENCES ClassCharger(id)
) ENGINE=INNODB;
INSERT INTO Student(name,charger_id) VALUES ("alvin1",2),
("alvin2",4),
("alvin3",1),
("alvin4",3),
("alvin5",1),
("alvin6",3),
("alvin7",2);
DELETE FROM ClassCharger WHERE name="冰冰";
INSERT student (name,charger_id) VALUES ("yuan",1);-- 删除居然成功,可是 alvin3显⽰还是有班主任id=1的冰冰的;-----------增加外键和删除外键---------ALTER TABLE student ADD CONSTRAINT abc
FOREIGN KEY(charger_id)
REFERENCES classcharger(id);
ALTER TABLE student DROP FOREIGN KEY abc;
2、 INNODB⽀持的ON语句
--外键约束对⼦表的含义: 如果在⽗表中不到候选键,则不允许在⼦表上进⾏insert/update--外键约束对⽗表的含义: 在⽗表上进⾏update/delete以更新或删除在⼦表中有⼀条或多条对--应匹配⾏的候选键时,⽗表的⾏为取决于:在定义⼦表的外键时指定的-- on
update/on delete⼦句-----------------innodb⽀持的四种⽅式---------------------------------------mysql语句多表查询
-----cascade⽅式 在⽗表上update/delete记录时,同步update/delete掉⼦表的匹配记录-----外键的级联删除:如果⽗表中的记录被删除,则⼦表中对应的记录⾃动被删除--------FOREIGN KEY (charger_id) REFERENCES ClassCharger(id)
ON DELETE CASCADE------set null⽅式 在⽗表上update/delete记录时,将⼦表上匹配记录的列设为null-- 要注意⼦表的外键列不能为not nullFOREIGN KEY (charger_id) REFERENCES ClassCharger(id)
ON DELETE SET NULL------Restrict⽅式 :拒绝对⽗表进⾏删除更新操作(了解)------No action⽅式 在mysql中同Restrict,如果⼦表中有匹配的记录,则不允许对⽗表对应候选键-- 进⾏update/delete操作(了解)
splice方法js⼆、多表查询
--准备两张表--ployee--company.department
create table employee(
emp_idint auto_increment primary key not null,
emp_name varchar(50),
ageint,
dept_idint);
insert into employee(emp_name,age,dept_id) values
('A',19,200),
('B',26,201),
('C',30,201),
('D',24,202),
('E',20,200),
('F',38,204);
create table department(
dept_idint,
dept_name varchar(100)
);
insert into department values
(200,'⼈事部'),
(201,'技术部'),
(202,'销售部'),
(203,'财政部');
mysql> select * fromemployee;+--------+----------+------+---------+
| emp_id | emp_name | age | dept_id |
+--------+----------+------+---------+
| 1 | A | 19 | 200 |
| 2 | B | 26 | 201 |
| 3 | C | 30 | 201 |
| 4 | D | 24 | 202 |
| 5 | E | 20 | 200 |
| 6 | F | 38 | 204 |
+--------+----------+------+---------+无人直播手机软件下载
6 rows in set (0.00sec)
mysql> select * fromdepartment;+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
| 200 | ⼈事部 |
| 201 | 技术部 |
| 202 | 销售部 |
| 203 | 财政部 |
+---------+-----------+
4 rows in set (0.01 sec)
1、多表查询之连接查询
1.笛卡尔积查询
mysql> SELECT *FROM employee,department;-- p_p_name,employee.age,--department.dept_name fromemployee,department;+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | A | 19 | 200 | 200 | ⼈事部 |
| 1 | A | 19 | 200 | 201 | 技术部 |
| 1 | A | 19 | 200 | 202 | 销售部 |
| 1 | A | 19 | 200 | 203 | 财政部 |
| 2 | B | 26 | 201 | 200 | ⼈事部 |
| 2 | B | 26 | 201 | 201 | 技术部 |
| 2 | B | 26 | 201 | 202 | 销售部 |
| 2 | B | 26 | 201 | 203 | 财政部 |
| 3 | C | 30 | 201 | 200 | ⼈事部 |
| 3 | C | 30 | 201 | 201 | 技术部 |
| 4 | D | 24 | 202 | 201 | 技术部 |
| 4 | D | 24 | 202 | 202 | 销售部 |
| 4 | D | 24 | 202 | 203 | 财政部 |
| 5 | E | 20 | 200 | 200 | ⼈事部 |
| 5 | E | 20 | 200 | 201 | 技术部 |
| 5 | E | 20 | 200 | 202 | 销售部 |
| 5 | E | 20 | 200 | 203 | 财政部 |
| 6 | F | 38 | 204 | 200 | ⼈事部 |
| 6 | F | 38 | 204 | 201 | 技术部 |
| 6 | F | 38 | 204 | 202 | 销售部 |
| 6 | F | 38 | 204 | 203 | 财政部 |
+--------+----------+------+---------+---------+-----------+
2.内连接
--查询两张表中都有的关联数据,相当于利⽤条件从笛卡尔积结果中筛选出了正确的结果。select * from employee,department where employee.dept_id =department.dept_id;--select * from employee inner join department on employee.dept_id
=department.dept_id;+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |程序员培训多久可以入职
+--------+----------+------+---------+---------+-----------+
| 1 | A | 19 | 200 | 200 | ⼈事部 |
| 2 | B | 26 | 201 | 201 | 技术部 |
| 3 | C | 30 | 201 | 201 | 技术部 |
| 4 | D | 24 | 202 | 202 | 销售部 |
| 5 | E | 20 | 200 | 200 | ⼈事部 |
+--------+----------+------+---------+---------+-----------+
3.外连接
--(1)左外连接:在内连接的基础上增加左边有右边没有的结果select * from employee left join department on employee.dept_id =department.dept_id;+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | A | 19 | 200 | 200 | ⼈事部 |
| 5 | E | 20 | 200 | 200 | ⼈事部 |
| 2 | B | 26 | 201 | 201 | 技术部 |
+--------+----------+------+---------+---------+-----------+
--(2)右外连接:在内连接的基础上增加右边有左边没有的结果select * from employee RIGHT JOIN department on employee.dept_id =department.dept_id;+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | A | 19 | 200 | 200 | ⼈事部 |
| 2 | B | 26 | 201 | 201 | 技术部 |
| 3 | C | 30 | 201 | 201 | 技术部 |
| 4 | D | 24 | 202 | 202 | 销售部 |
| 5 | E | 20 | 200 | 200 | ⼈事部 |
| NULL | NULL | NULL | NULL | 203 | 财政部 |
+--------+----------+------+---------+---------+-----------+
--(3)全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果--mysql不⽀持全外连接 full JOIN--mysql可以使⽤此种⽅式间接实现全外连接select * from employee RIGHT JOIN department on employee.dept_id =department.dept_id
UNIONselect * from employee LEFT JOIN department on employee.dept_id =department.dept_id;+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | A | 19 | 200 | 200 | ⼈事部 |
| 2 | B | 26 | 201 | 201 | 技术部 |
| 3 | C | 30 | 201 | 201 | 技术部 |
| 4 | D | 24 | 202 | 202 | 销售部 |
| 5 | E | 20 | 200 | 200 | ⼈事部 |
| NULL | NULL | NULL | NULL | 203 | 财政部 |
| 6 | F | 38 | 204 | NULL | NULL |
+--------+----------+------+---------+---------+-----------+
-- 注意 union与union all的区别:union会去掉相同的纪录
2、多表查询之复合条件连接查询
--查询员⼯年龄⼤于等于25岁的部门
SELECT DISTINCT department.dept_name
FROM employee,department
WHERE employee.dept_id=department.dept_id

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。