mysql联合查询1

俩表关联

student和classes表

创建student表

create table if not exists 表名(
id int primary key auto_increment,
字段名 数据类型 …
);

CREATE TABLE IF NOT EXISTS student(
	id INT PRIMARY KEY auto_increment, #PRIMARY KEY 主键,不能为空且唯一,就是not null和unique结合,一般搭配:auto_increment;
	NAME VARCHAR(20) NOT NULL,
	number BIGINT NOT NULL UNIQUE,   #unique 唯一约束,不能插入相同的值
	qq_mail VARCHAR(20) DEFAULT '[email protected]', #default 若无则默认赋值[email protected]
	classes_id INT,
	FOREIGN KEY(classes_id) REFERENCES classes(id)
#使用id为主键,classes_id为外键,关联班级表id
);#可理解为一个学生对应一个班级,一个班级可对应多个学生
DESC student;

创建class表

CREATE TABLE IF NOT EXISTS classes(
	id INT PRIMARY KEY auto_increment,
	NAME VARCHAR(20),
	`DESC` VARCHAR(30)
)

新增数据

INSERT INTO classes(name,`desc`) VALUES('python2','python 2月开班');
SELECT * FROM classes;
INSERT INTO student(name, number,qq_mail,classes_id) VALUES('小李',20190408,'[email protected]',1);
INSERT INTO student(name, number,qq_mail,classes_id) VALUES('小黄',20190409,'[email protected]',1);
SELECT * FROM student;

删除此类关联表规则

先删除子表中与主表相关联的,或者删除没有与子表关联的主表
先删除子表与主表相关联的
#先删除子表与主表相关联的
DELETE FROM student where id=1 or id=2;
再删除主表
#再删除主表
DELETE FROM classes WHERE id=1;

联合查询

准备工作:创建四个数据表

student(name,number,qq_mail,classes_id)

course(id,name)

score(id,score,student_id,course_id)

classes(id,name,`desc’)

CREATE TABLE IF NOT EXISTS classes(
	id INT PRIMARY KEY auto_increment,
	NAME VARCHAR(20),
	`DESC` VARCHAR(30)
);
CREATE TABLE IF NOT EXISTS student(
	id INT PRIMARY KEY auto_increment, #PRIMARY KEY 主键,就是not null和unique结合,不能为空且唯一,一般搭配:auto_increment;
	NAME VARCHAR(20) NOT NULL,
	number BIGINT NOT NULL UNIQUE,   #unique 唯一约束,不能插入相同的值
	qq_mail VARCHAR(20) DEFAULT '[email protected]', #default 若无则默认赋值[email protected]
	classes_id INT
	);
CREATE TABLE IF NOT EXISTS course(
	id INT PRIMARY KEY auto_increment,
	name VARCHAR(20)
);
CREATE TABLE IF NOT EXISTS score(
id INT PRIMARY KEY auto_increment,
score DECIMAL,
student_id INT,
course_id INT
);

对四个表插入数据

INSERT INTO classes(name,`DESC`) VALUES('计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构和算法'),
('中文系2019级3班','学习了中国传统文学'),
('自动化2019级5班','学习了机械自动化');
INSERT INTO student1(name,number,qq_mail,classes_id) VALUES
('小李','2019082401','[email protected]',1),
('小王','2019082412',null,1),
('菲菲','2019082403',null,1),
('妮妮安','2019082405','[email protected]',1),
('coco','2019082404',null,1),
('Jane','2019082406','[email protected]',2),
('tellme','2019082409',null,2),
('selila','2014082425','[email protected]',2);
INSERT INTO course(name) VALUES ('Java'),('中国传统文化'),
('计算机原理'),
('语文'),('高阶数学'),('英文');
INSERT INTO score(score,student_id,course_id) VALUES
#student_id=1 小李
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
(33, 3, 1),(68, 3, 3),(99, 3, 5),
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
(81, 5, 1),(37, 5, 5),
(56, 6, 2),(43, 6, 4),(79, 6, 6),
(80, 7, 2),(92, 7, 6);

内连接

语法1:select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件
语法2:select 字段 from 表1,表2 where 连接条件 and 其他条件
SELECT * FROM student1 INNER JOIN score;
SELECT * FROM student1 INNER JOIN score ON student1.id=score.student_id;
SELECT * FROM student1 INNER JOIN score ON student1.id=score.student_id 
AND student1.id=4;
SELECT student1.id,student1.name,score.course_id,score.score 
FROM student1 INNER JOIN score ON student1.id=score.student_id 
AND student1.id=4;
SELECT student1.id,student1.name,course.name,score.score 
FROM student1 INNER JOIN score ON student1.id=score.student_id
INNER JOIN course ON score.course_id =course.id
AND student1.id=4;
SELECT student1.id,student1.name AS '姓名',course.name AS '课程',
score.score AS '分数'
FROM student1 INNER JOIN score ON student1.id=score.student_id
INNER JOIN course ON score.course_id =course.id
AND student1.id=4;
SELECT student1.id,student1.name AS '姓名',course.name AS '课程',
score.score AS '分数'
FROM student1,course,score
WHERE student1.id=score.student_id
AND score.course_id=course.id
AND student1.id=4;

外连接

左外连接

如果联合查询,左侧的表完全显示是左外连接;

SELECT * FROM student1,score GROUP BY student1.id;
SELECT * FROM student1,score WHERE student1.id=score.student_id 
GROUP BY student1.id;
SELECT * FROM student1 LEFT JOIN score ON student1.id=score.student_id
GROUP BY student1.id;
右外连接

右侧的表完全显示是右外连接

SELECT * FROM score RIGHT JOIN student1 ON student1.id=score.student_id
GROUP BY student1.id;
自连接
SELECT * FROM score AS s1,score AS s2
WHERE s1.student_id=1
AND s2.student_id=3
AND s1.score<s2.score;

SELECT s2.*FROM score AS s1,score AS s2
WHERE s1.student_id=1
AND s2.student_id=3
AND s1.score<s2.score;
筛选
select * from student1 where classes_id = (select classes_id from student1
where name = '小李');
#等同于以下语句
SELECT * FROM student1 WHERE classes_id=1;

in

SELECT * FROM score WHERE course_id 
in (SELECT id FROM course WHERE name='语文'OR name='英文');

not in

SELECT * FROM score WHERE course_id 
NOT in (SELECT id FROM course WHERE name!='语文' AND NAME!='英文');

not exists

#只要括号里面的表达式为true,就执行括号外的语句
SELECT * FROM student1 WHERE EXISTS(SELECT id FROM student1 WHERE id=1);

union

SELECT * FROM student1 WHERE id<=3 
UNION 
SELECT * FROM student1 WHERE `NAME`='菲菲';

floor
向下取整

SELECT FLOOR(RAND()*9)+1,FLOOR(RAND()*9)+1,FLOOR(RAND()*9)+1,NOW();

猜你喜欢

转载自blog.csdn.net/m0_72084056/article/details/125935185
今日推荐