SQL规范中全连接是使用FULL JOIN,但是MySQL中并没有对它的支持,我们需要使用 UNION 来实现:
1 2 3 4
(SELECT * FROM `products` LEFT JOIN `brand` ON `products`.brand_id = `brand`.id) UNION (SELECT * FROM `products` RIGHT JOIN `brand` ON `products`.brand_id = `brand`.id);
1 2 3 4
(SELECT * FROM `products` LEFT JOIN `brand` ON `products`.brand_id = `brand`.id WHERE `brand`.id IS NULL) UNION (SELECT * FROM `products` RIGHT JOIN `brand` ON `products`.brand_id = `brand`.id WHERE `products`.id IS NULL);
# 创建学生表 CREATE TABLE IF NOT EXISTS `students`( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT ); # 创建课程表 CREATE TABLE IF NOT EXISTS `courses`( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, price DOUBLE NOT NULL );
# 插入数据 INSERT INTO `students` (name, age) VALUES('why', 18); INSERT INTO `students` (name, age) VALUES('tom', 22); INSERT INTO `students` (name, age) VALUES('lilei', 25); INSERT INTO `students` (name, age) VALUES('lucy', 16); INSERT INTO `students` (name, age) VALUES('lily', 20);
INSERT INTO `courses` (name, price) VALUES ('英语', 100); INSERT INTO `courses` (name, price) VALUES ('语文', 666); INSERT INTO `courses` (name, price) VALUES ('数学', 888); INSERT INTO `courses` (name, price) VALUES ('历史', 80);
学生表
课程表
一般是通过关系表来记录两张表的数据关系:
1 2 3 4 5 6 7 8 9 10 11
# 创建关系表 CREATE TABLE IF NOT EXISTS `students_select_courses`( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, course_id INT NOT NULL, # 外键 FOREIGN KEY (student_id) REFERENCES students(id) ON UPDATE CASCADE, # 外键 FOREIGN KEY (course_id) REFERENCES courses(id) ON UPDATE CASCADE )
模拟学生选课:
1 2 3 4 5 6 7 8 9
# why 选修了 英文和数学 INSERT INTO `students_select_courses` (student_id, course_id) VALUES (1, 1); INSERT INTO `students_select_courses` (student_id, course_id) VALUES (1, 3);
# lilei选修了 语文和数学和历史 INSERT INTO `students_select_courses` (student_id, course_id) VALUES (3, 2); INSERT INTO `students_select_courses` (student_id, course_id) VALUES (3, 3); INSERT INTO `students_select_courses` (student_id, course_id) VALUES (3, 4);
关系表
id为主键 student_id为学生id course_id为课程id
查询多对数据
1 2 3 4 5 6 7 8 9
# 查询所有的学生选择的所有课程 SELECT stu.id studentId, stu.name studentName, cs.id courseId, cs.name courseName, cs.price coursePrice FROM `students` stu JOIN `students_select_courses` ssc ON stu.id = ssc.student_id JOIN `courses` cs ON ssc.course_id = cs.id;
1 2 3 4 5 6 7 8 9
# 查询所有的学生选课情况 SELECT stu.id studentId, stu.name studentName, cs.id courseId, cs.name courseName, cs.price coursePrice FROM `students` stu LEFT JOIN `students_select_courses` ssc ON stu.id = ssc.student_id LEFT JOIN `courses` cs ON ssc.course_id = cs.id;
1 2 3 4 5 6 7 8 9 10
# why同学选择了哪些课程 SELECT stu.id studentId, stu.name studentName, cs.id courseId, cs.name courseName, cs.price coursePrice FROM `students` stu JOIN `students_select_courses` ssc ON stu.id = ssc.student_id JOIN `courses` cs ON ssc.course_id = cs.id WHERE stu.id = 1;
1 2 3 4 5 6 7 8 9 10
# 哪些学生是没有选课的 SELECT stu.id studentId, stu.name studentName, cs.id courseId, cs.name courseName, cs.price coursePrice FROM `students` stu LEFT JOIN `students_select_courses` ssc ON stu.id = ssc.student_id LEFT JOIN `courses` cs ON ssc.course_id = cs.id WHERE cs.id IS NULL;
1 2 3 4 5 6 7 8 9 10
# 查询哪些课程没有被学生选择 SELECT stu.id studentId, stu.name studentName, cs.id courseId, cs.name courseName, cs.price coursePrice FROM `students` stu RIGHT JOIN `students_select_courses` ssc ON stu.id = ssc.student_id RIGHT JOIN `courses` cs ON ssc.course_id = cs.id WHERE stu.id IS NULL;