俩表关联
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();