多表联查
从多张表中查询数据
表和表的关系
a vs b 1 vs 1 一对一 (a表的数据在b表里只有一条匹配)
a vs b 1 vs n 一对多 (a表数据在b表里有多条匹配)
a vs b n vs n 多对多(a表数据在b表里有多条匹配,b表数据在a 表里也有多条匹配)
子查询
也就是把sql语句作为查询条件,(套娃)
例:查询id大于 小名的学生信息
SELECT * from student where id > (SELECT id from student where sname = '小名')
括号里先查出小明的成绩为多少,再查大于小名的学生信息
注意点:
1、括号里面的sql只有一个字段,不能出现多个字段名
2、如果要找两张表之间的字段,就找一样的字段名就行了
多表联查
所有表之间的关联,都需要有关联字段,一般两张表之间相同的字段名,就是关联字段
内链接inner join
把两张表关联在一起形成一张新的表,并且只展示两张表之间共有部分
假如一张学生表(不包含成绩信息)和成绩表(不包含学生信息,如姓名)之间进行关联,如果没有参加考试,那么两张表关联是找不到这条记录的,或者有某位学生的考试成绩,但是没有这个学生的学生信息,也是不显示记录内容的
a表和b表通过匹配的字段id连接: select * from a inner join b on a.id = b.id ;
小明的考试成绩要求显示姓名和成绩 :select name,degree from student inner join score on student.id = score.id where sname = '小明' ;
左连接 left join on
以左表为主,右表为辅,显示全部的左表数据,右表匹配不上的内容显示为null
右连接 right join on
以右表为主,左表为辅,左表没有的数据显示为null
例:通过左连接查出小名的成绩 SELECT degree FROM student left join score on student.id = score.id where name = '小明'
union连接
刚刚的不管是内连接还是左连接,右连接都是左右拼在一起,该连接为上下拼
创建表
create table 表名(字段名称1 字段类型 约束条件, 字段名称2 字段类型 约束条件)
约束条件可以不写,约束条件比如加默认值default等,字段类型为字符串要记得加''
约束
not null | 不允许为空 | |
default 默认值 | 如果没有填写内容的时候,会自动带上具体的值-啥都没填默认写死的值 | |
primary key 主键 | 不能为空不能重复的值:id、cno,(每一张表只会有一个主键,标识表中的每一行数据) | |
foreign key 外键 | 另外一张表的主键 | |
unique key 唯一键 | 唯一的一条数据且不能重复的数据,可以为空 |
添加数据insert into
添加单条数据 INSERT into 表名 VALUES (1,'zy','81')
添加多条数据 INSERT into 表名 VALUES (1,'zy','81'),(2,'zy1','82') 具体填什么根据自己的表判断
添加指定数据 INSERT into 表名 (id,name) VALUES (6,‘zy2’)
修改数据
update 表名 set 字段名称 = 值 where 条件
例:把class=81的数据中的姓名修改为111 找到你要该的数据,然后去改对应的值
UPDATE zy set name = '111' where class = '81'
删除数据
delete from 表名 where 条件 ====指定数据删除
delete from zy where id = 12 删除表中id为12的数据