4 子查询:一个查询语句条件需要依赖另一个查询语句的结果
1)带In的子查询://查询学生生日在91年之后的班级的信息
select * from classes where cid in (SELECT cno FROM student WHERE birthday > '1991-01-01');
2)带exists的子查询://查询学生生日大于91年1月1日,如果记录存在,前面的SQL语句就会执行
select * from classes where exists (SELECT cno FROM student WHERE birthday > '1991-01-01');
3)带any的子查询:// 要大于最小值
SELECT * FROM classes WHERE cid > ANY (SELECT cno FROM student )
4)带all的子查询://要大于最大值
SELECT * FROM classes WHERE cid > ALL (SELECT cno FROM student) 作者: 渣.. 时间: 2018-5-25 21:09
柯威龙
今天学习了多表的查询 多表查询有有一对多,多对多,一对一查询.主要学习了一对多查询和多对多查询.
多对多的话需要建立一个中间表,中间表的话至少有两列,分别指向双方的主键.一对多的话我们需要在多
的那一个表创建一个外键指向一的主键.
多表查询有连接查询,子查询,连接查询里面有着交叉连接,内连接和外连接,交叉连接学习到了笛卡尔积
一半来说交叉连接用的比较少. 最有印象的是内连接和外连接.内连接也分为隐式内连接和显示内连接
外连接分为左外连接和右外连接左右连接唯一差别在 left 和 right两个单词上.学了一个新单词
union可以左右外连接全部显示.子查询的话就是SQL语句里面嵌套一个SQL语句来查询结果
事务的话只知道大概一个作用,具体的没有听懂. 作者: 小故事 时间: 2018-5-25 21:14
谢洪彬:
今天学习了SQL多表
外键:一个约束,用来保证数据的完整性
外键:一般用于有对应关系的两个表,设置外键可以让数据按规定的范围输入;
多表,言外之一就是多个表的意思,那么表与表之间又有多个关系 如下:
表与表的关系:
一对多 :在多的一方创建外键指向一的一方的主键
多对多 :创建一个中间表至少两列分别设为外键指向两个表的主键
一对一 : 一对一一般不常使用,因为如果是一对一的话就直接在表后面再加一列就好了,没有必要在创建一个表.
应为表查询的功能很强大,也很经常需要操作,所以在多表查询的时候又有各种的连接关系,如下:
表查询之间的各种关系
内连接
1.显示连接
表与表之间使用关键字 inner join 连接 ,条件使用 on
2.隐式连接
表与表之间使用 ,(逗号)来连接 条件使用where
外连接
1.左外连接
表与表之间使用 left join 连接, 条件使用 on 意思是左边表为主导
2.右外连接
表与表之间使用 right join 连接, 条件使用 on 意思是右边表为主导
用所有也比较重要.作者: 厦门陈强 时间: 2018-5-25 21:36
陈强
MySQL多表的一天,从外键开始,到表与表之间的关系,再到对多表查询的处理,总体来讲都是不复杂的SQL语句,
内连接根据不同的关键字分为两类:
Where---隐式
Join---显示
外连接根据主表格的位置,也分为两类:
左外连接---left join on
右外连接---right join on
另外一个子查询中的带in的子查询也是重点
一个拓展的自表查询也是很实用的,将同一张表格根据实用者的不同,定义为不用名字的两个表格,再根据定义出来的表格的名字,去使用\比较等操作. 作者: 13163997058 时间: 2018-5-25 21:38
王刘锁
2018-5-25-SQL多表查询
一,当多张表之间有某种关系也就是外键约束的时候可以用一条sql语句来同时查询这
多张表~外键约束的作用是保证多表间数据的完整性!避免乱加误删数据等非常理操作.
语法操作 alter table 表1名 add foreign key (属性名1) reference (表2的属性2)
把表1的属性1设为外键指向表2的属性2.这时两张表就通过属性1和属性2相关连.前提
是两个属性是本身就相同的内容比如员工表的部门编号和部门表的部门编号.外键的添
加要看表间的关系,表间有一对多,多对多和一对一三种关系我们把多的设置外键指向
一的主键建立多表的关系.多对多关系的表的创建原则是需要创建一张存放两个外键分
别指向两张表的主键的中间表.操作的也是中间表.
查询两张表是的正确语法是:select * from 表1,表2 where 表1.属性1=表2.属性2 ;
条件就是通过外键查找.
二,多表查询的方式:
1,连接查询
交叉连接(一般用不到):查到的是两个表的记录数的乘积笛卡尔积,cross join
select * from 表1 cross join 表2 ;或select * from 表1,表2 ;
内连接inner可以省略:
select * from 表1 inner join 表2 on 表1外键=表2主键 ;显式
select * from 表1,表2 where 表1外键=表2主键; 隐式
外连接:;左/右外链接 左为主右为辅/右为主左为辅 主的全显示辅的只显示匹配主的
left/right可以省略:select * from 表1 left/right outer join 表2 on 条件
子查询:查询工资和职位和 smith相同的所有员工信息
select * from emp where sal=(SELECT p.sal from emp p where p.ename='smith')
or job = (SELECT p.job from emp p where p.ename='smith')作者: Eclipse启动 时间: 2018-5-25 21:49
郑阳阳
外键约束:用来保证多表之间数据的完整性
顺便提下单表约束有主键约束,唯一约束和非空约束.
多表操作:
表与表的关系:
多表间的关系有一对多,多对多,一对一(不常用,因为一对一一般可以直接在表中添加列,特殊需要才用到)
一对多,比如班级对学生的关系,一个班级有很多学生,一个学生只属于一个班级,
一对多建表需要添加外键,在多的一方添加,也就是班级与学生,在学生表中添加外键.
多对多,比如学生和课程的关系,学生可以选择很多课程,课程也会被很多学生选择,
多对多建表需要建立一个中间表中至少有两个字段来分别指向另外两个表的主键.
多表查询:
多表查询有交叉连接(不常用),内连接和外连接.
内连接分为隐式内连接和显示内连接.
隐式内连接:select * from 表名1,表名2 where 表名1.主键=表名2.主键.
显示内连接:select * from 表名1 inner join 表名2 where 表名1.主键=表名2.主键.(inner可以省略)
外连接分为左外连接和右外连接.
左外连接:select * from 表名1 left outer join 表名2 where 表名1.主键=表名2.主键(outer可以省略)
右外连接:select * from 表名1 right join 表名2 where 表名1.主键=表名2.主键.
左外连接是左边表匹配右边表,右外连接右匹配左.
内连接显示的两表之间能匹配上的数据,外连接多显示左或右多出的内容.
子查询:一个SQL需要另一个SQL查询.
事务:指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全部失败,要么全部成功.
事务的隔离级别分为:
read uncommitted:脏读,不可重复读,虚读都有可能发生,效率最高.
read committed:避免脏读.但是不可重复读和虚读是有可能发生.
repeatable read:避免脏读和不可重复读,但是虚读有可能发生.sql中的默认隔离级别.
serializable:避免脏读,不可重复读,虚读,效率最低 作者: 名字被人注册了 时间: 2018-5-25 21:50
刘文峰
外键约束的作用是保证多表之间数据的完整性
外键约束的添加有以下几种方式:
1.一对多:在多的一方设置外键,指向一的主键
2.多对多:创建一个中间表,从两个表中至少取一列都设置成外键分别指向两个表的主键
3.一对一:两个表的主键设置外键,外键设置为唯一
多表查询方式:
1.交叉连接:cross join
Select * from 表1 cross join 表2; 或 select * from 表1,表2;
将每个可能性都查询出来(查到的记录数量为两个表记录的乘积)
2.内连接: inner join; inner可省略;分显示连接和隐式连接;只查询两个表之间关联的属性
显示连接 select * from 表1 inner join 表2 on 关联条件; 显示连接用on代替where
隐式连接 select * from 表1,表2 where 关联条件; 隐式连接不变;
3,外连接:outer join outer可省略 分为左外连接 left 和右外连接 right
左外连接 select * from 表1 left join 表2 on 关联条件; leftjoin左边的表为主表,可显示里面的全部记录,不显示表2有但表1里没有的记录
右外连接 select * from 表1 right join 表2 on 关联条件; 参照左外连接;
多表查询的子查询: 四个关键字 in exists any all
A:查询语句1 in(查询语句2);将查询语句2结果是一个范围,将其作为查询语句1的条件
B:查询语句1 exists (查询语句2); 查询语句2的结果为true或false,为true执行查询语句1
C:查询语句1 any (查询语句2); 满足查询语句2的最小条件即可执行
D:查询语句1 any (查询语句2); 满足查询语句2的最大条件方可执行
交叉连接:两张表的笛卡尔积
A. 就是多张表的乘积
B. Select * from user , dept
内连接:两张表的交集
A. 隐式 关键字: .... , .... where
a) Select * from user , dept where user.did = dept.did and 条件;
B. 显式 关键字: inner join .... on
a) Select * from user (inner) join dept on user.did = dept.did and 条件;
外链接:主表全部,从表部分。
左外:关键字 left join
A. Select * from user left join dept on user.did = dept.did
右外:关键字 right join
A. Select * from dept right join user on user.did = dept.did
自连接:自己和自己连接
例子: select * from emp a , emp b where a.mgr = b.empno
子查询
一条sql语句的条件中包含了另一条sql语句
Select * from user ,dept where user.did = dept.did and sal = (Select sal from user where name=’smith’);
Select sal from user where name=’smith’ //查询的是史密斯的工资----执行结果:
工资作者: lnongge 时间: 2018-5-25 21:56
16weisong
今天学习了sql多表操作和事务的入门知识,事务部分知识属于了解,重点是sql多表关系,及多表查询,多表查询主要有2部分:连接查询和子查询.连接查询又分为:交叉连接,内连接和外连接,后面两个属于重点,前面那个属于了解部分.今天其实只要把辉哥给的作用练习都做了,比较复杂的多写几遍,就能掌握这两天数据库的知识. 作者: 滴滴eclipse启动 时间: 2018-5-25 21:56
江某人:
mysql:
约束是用来保证数据的完整性。
单表约束:
主键约束
唯一约束
非空约束
多表设计:
一对多:在多的一方创建外键指向一的一方的主键.
多对多:创建中间表,中间表至少两个字段,分别指向双方主键.
一对一(很少用):将一对一的双方的主键建立映射.
交叉连接:select * from A,B; --- 获得的是两个表的笛卡尔积
内连接:
隐式内连接:select * from A,B where 条件;
显式内连接:select * from A inner join B on 条件;
外连接:
左外连接:left outer join -- select * from A left outer join B on 条件;
右外连接:right outer join -- select * from A right outer join B on 条件;
事务三步骤
开启事务:
start transaction;
提交事务
commit;(也等于关闭事务)
回滚事务
rollback;(在没关闭当前事务都能回滚到开启事务前)
设置事务的隔离级别:
read uncommitted :脏读,不可重复读,虚读都有可能发生
read committed :避免脏读。但是不可重复读和虚读是有可能发生
repeatable read :避免脏读和不可重复读,但是虚读有可能发生。
serializable :避免脏读,不可重复读,虚读。
设置事务隔离级别格式
SET SESSION TRANSACTION ISOLATION LEVEL 事务隔离级别;作者: 李志勇 时间: 2018-5-25 21:57
李志勇:
mysql:
约束是用来保证数据的完整性。
单表约束:
主键约束
唯一约束
非空约束
表与表之间的关系:
一对多: 多对多, 一对一
交叉连接:cross join
交叉连接:查询到的是两个表的笛卡尔积。
语法:
select * from 表1 cross join 表2;
select * from 表1,表2;
内连接:inner join(inner是可以省略的)
显示内连接:在SQL中显示的调用inner join关键字
语法:select * from 表1 inner join 表2 on 关联条件;
隐式内连接:在SQL中没有调用inner join关键字
语法:select * from 表1,表2 where 关联条件;
外连接:outer join(outer可以省略的)
左外连接:
语法:select * from 表1 left outer join 表2 on 关联条件;
右外连接
语法:select * from 表1 right outer join 表2 on 关联条件;
在子查询中
个人认为 in 代表包含 exists 代表是否存在 返回boolean值 形式if
any 任何 all 全部,
事务三步骤
开启事务:
start transaction;
提交事务
commit;(也等于关闭事务)
回滚事务
rollback;(在没关闭当前事务都能回滚到开启事务前)
设置事务的隔离级别:
read uncommitted :脏读,不可重复读,虚读都有可能发生
read committed :避免脏读。但是不可重复读和虚读是有可能发生
repeatable read :避免脏读和不可重复读,但是虚读有可能发生。
serializable :避免脏读,不可重复读,虚读。
设置事务隔离级别格式
SET SESSION TRANSACTION ISOLATION LEVEL 事务隔离级别;作者: w849027724 时间: 2018-5-25 21:58
吴利君
今天学习的了数据库的进阶知识数据库的多表操作以及事务的管理,首先,我们学习的是MySQL它是关系型数据库,不像MongoDB和Redis这样的分布式数据库,它具有很强的关系,因此,在MySQL数据库之中,各个表之间都是通过主外键连接起来形成主从表的各种关系,而我们可以通过这种主外键进行多表连接查询。
数据库的创建和删除直接通过可视化软件就可以直接完成,但是表的数据是以后很多都会用到的,因此学会表的查询很重要。
这里我们表的查询其实不难,格式就是select * from * where * group by * having * order by* 格式就是这样,这是单表,如果多表,我们可以使用where然后进行表格id连接,a.id=b.id这种方式,这种可以有多个,只需要再加一个等式就行。
然后是查询的内联查询和外联查询,这种查询很重要,格式也相对固定,记住就好,最后是子查询,这个很重要,我们可以在查询语句里面插入多个查询语句,这样可以极大提高SQL语句的效率,而且我们可以通过in exists等关键字进行更加灵活的设计,极大的提高代码的简洁以及执行效率。
最后讲的是事务的管理,这几种情况是数据库操作的常见错误,今天讲的知识皮毛,以后还会进行深入讲解。我记得hibernate里面和mybatis以及spring里面都有事务相关的管理,有点难,不容易理解!作者: 2902 时间: 2018-5-25 21:59
今天学习了对多表的操作
多表有一对一的关系(不常用,出特殊需求,一般用不上,都写在同一张表上)
还有一对多和多对多的关系 这两个是常见的关系
一对多 创建联系时在多的一方设置外键 指向 一的主键;
外检具有约束作用,不得随意填写,只能写联系表主键上有的值, 外键和其主键的类型等都需要一样(非空不要求一样)
难点在于多对多的表联系的创建, 因为两张表都是多的关系,随意要通过创建第三张表来简历关系,在第三张表上 设置两个外键 分别对应两张表的主键,对于由多对多的关系产生的结果,我们也必须在第三张表上体现;(比如 多个学生选择多们课程, 这样每个学生对应的课程成绩 我们就得写在第三张表上)
子语句 一条语句里包含另一条完整的语句,这个语句通常作为条件或是条件的一部分 来实现第一条语句.
简单了解了事务,产生的问题是由事务并发产生的, 一般的问题会有 脏读,不得重复读写,虚读,这些问题我们可以通过设置隔离级别来阻止;作者: 2902 时间: 2018-5-25 22:00
今天学习了对多表的操作
多表有一对一的关系(不常用,出特殊需求,一般用不上,都写在同一张表上)
还有一对多和多对多的关系 这两个是常见的关系
一对多 创建联系时在多的一方设置外键 指向 一的主键;
外检具有约束作用,不得随意填写,只能写联系表主键上有的值, 外键和其主键的类型等都需要一样(非空不要求一样)
难点在于多对多的表联系的创建, 因为两张表都是多的关系,随意要通过创建第三张表来简历关系,在第三张表上 设置两个外键 分别对应两张表的主键,对于由多对多的关系产生的结果,我们也必须在第三张表上体现;(比如 多个学生选择多们课程, 这样每个学生对应的课程成绩 我们就得写在第三张表上)
子语句 一条语句里包含另一条完整的语句,这个语句通常作为条件或是条件的一部分 来实现第一条语句.
简单了解了事务,产生的问题是由事务并发产生的, 一般的问题会有 脏读,不得重复读写,虚读,这些问题我们可以通过设置隔离级别来阻止;作者: LittleSky 时间: 2018-5-25 22:01
常小天
今天学习了MySQL多表和事务的内容,重点在多表,事务只是简单了解一些入门知识,知道一些概念而已。多表部分的重点内容有外键和多表联合查询两部分。外键即为与外部表联系的键,它是伴随一对多的关系而产生的。一对多关系就是一个表中的多条表记录可以通过一个字段(外键)指向另一个表中的同一条表记录。举个例子就是一个班级里有多个学生,这多个学生就是“学生”这个表中的多条表记录,他们都属于一个班级,也就是通过班号指向了某一个唯一的班级,这个班级就是“班级”这个表中的一条具体的表记录。表一(班级)中存在一个具有标识功能(不重复)的字段(班号),表二(学生)想要将表一(班级)的表记录(具体的班级)作为一种属性赋给自己的表记录(一个个具体的学生),就要把表一的那个字段(班号)拿来给自己的表记录(具体的学生)使用,这个拿的动作就是建立外键,将表二(学生)里的那个借来的字段(班号)与表一(班级)里的具有标识功能的字段(班号)联系起来,让电脑知道表二里的班号就是指代表一里的班号。第二部分多表联合查询。这一部分内容要记忆并理解各种查询方法的格式和意义范畴。这其中的重点在连接查询的内连接和外连接。内连接中的显示、隐式连接在范畴上没有差别。记住格式,再记住他们的范畴是查询表一和表二都有内容的那部分表记录,就可以了。外连接分左外连接和右外连接,这两者在格式上只差一个单词,容易记忆,而他们范畴上的区别需要理解清楚。首先两个表连接的时候在左边的为主表。左连接是将关键字前的表(记为表一)拼在另一个表(记为表二)的左边,所以表一为主表,那么查询的结果是将主表,也就是表一的全部内容显示出来,即使表二中没有与表一的表记录相对应的记录。与之相反,右连接是将关键字前的表(还是记为表一)拼在另一个表(记为表二)的右边,表二在左,所以表二为主表,那么查询的结果是将主表(表二)的全部内容显示出来,即使表一中没有与表二的表记录相对应的记录。当然查询结果是将两个表的字段拼起来全部显示这样一种格式来显示的。这些基础理解了之后,再下来就是多做练习,最终达到能将这些内容融会贯通的使用。作者: chenyelong 时间: 2018-5-25 22:03
陈叶隆
1.1, 多表设计:i) 一对多:在多的一方创建外键指向一的一方的主键
ii) 多对多:创建中间表,中间表至少两个字段,分别指向双方主键
1.2, 多表查询:i) 内连接: 隐式内连接:select * from A,B where 条件; 显式内连接:select * from A join B on 条件;
ii) 外连接: 左外连接:select * from A left join B on 条件; 右外连接:select * from A right join B on 条件;
iii) 子查询:
a,带in的子查询: select * from classes where cid in (SELECT cno FROM student WHERE birthday > '1991-01-01');
b, 带exists的子查询: select * from classes where exists (SELECT cno FROM student WHERE birthday > '1991-01-01');
c, 带any的子查询: SELECT * FROM classes WHERE cid > ANY (SELECT cno FROM student );
d, 带all的子查询: SELECT * FROM classes WHERE cid > ALL (SELECT cno FROM student); 作者: 沅瞻 时间: 2018-5-25 22:04
詹源
今天学习了多表设计,多表查询,以及事务的概述(初步了解,日后深入学习);
多表之间必须用外键约束来保证数据完整性
如何在表上添加外键:
alter table 表名 add foreign key(列名)references dept(列名);
设置外键为非空:
alter table 表名 modify 列名 int not null;
交叉连接
1.使用cross join 关键词
sllect * from 表名1 cross join 表名2;
2.不使用cross join关键字
select * from 表名1,表名2; (效果与使用cross in关键字一样)
查询到的是表1和表2全部的元素
内连接
1.显式内连接(使用inner(可省略) join on关键字, 得到的是两张表共有的数据,
以主键的表和外键的表来获取数据)
select * from 表名1 x join 表名2 x on x.主键=x.外键
x代表的是可以为表名改名,防止数据库判断不出你要查询的是哪个表的值.
2.隐式内连接
select * from 表名1 x,表名2 x where x.主键=x.外键
x代表的意思同上. 其实显示和隐式内连接的获取数据的写法效果是一样的,获取到的都是表1和表2共有的数据.
外连接(查询到的是某个表的内容和它与另一个表的共有内容)
关键字:outer(可省略) join on
左外连接 left outer join
select * from 表名1 x left outer join 表名2 x on x.主键=x.外键
x代表同上,这个写法的意思是获取在左边的表名1的数据和表1表2共有的数据,
注意:表2的没有对应值的数据就会用null值表示
右外连接 right outer join
select * from 表名1 x right outer join 表名2 x on x.主键=x.外键
x代表同上,这个写法的意识是获取在右边的表名2的数据和表1表2共有的数据,
注意:表1的没有对应值的数据就会用null值表示
- 左外连接:LEFT JOIN
语法:select * from 表1 left outer join 表2 on 关联条件
SELECT * from classes c LEFT JOIN student s on c.cid = s.cno;
以左边的classes为主表,得到classes的所有数据。然后得到 c 与 s交集部分的数据;
- 右外连接:RIGHT JOIN
select * from classes c RIGHT JOIN student s on c .cid = s.cno;
以右边的student为主表,先得到student的所有结果,然后再得到c 与s交集部分的数据
4.子查询
一个查询语句条件需要依赖另一个查询语句的结果。
select ename,job from emp y,emp l where y.mgr = l.empo;
多表查询的练习:
1.查询班级名称,和班级总人数
分析:
-1.查班级名称,班级总人数 :select c.cname,count(*) from student s,classes c
-2.两张表的关联条件: where c.cid = s.cno;
-3.因为student表里面的记录了学生的班级编号,是个重复的字段。因此要对s.cno分组: group by s.con;
-4.合并 select c.cname,count(*) from student s,classes c where c.cid = s.cno group by s.con;
2.查询学生的姓名和学生所选的总课程平均成绩。
分析:
-1.查询学生姓名,所学总课程平均成绩:select s.sname,VAG(sc.score) from student s, stu_cour sc;
-2.在stu_cour表里求总课程平均成绩:首先 每个学生编号sno是重复的,对这个编号分组,就能得出每个学生所选的课程和成绩:group by sc.sno;
-3.两张表的关联条件: where s.sid = sc.sno;
-4.合并:select s.sname,VAG(sc.score) from student s, stu_cour sc where s.sid = sc.sno group by sc.sno;
select sc.sno from stu_cour sc GROUP BY sc.sno HAVING AVG(sc.socre)>80
题2:"学生的总数":select count(*) from student s where s.id =?;
用 in来连接:
select count(*) from student s where s.id in (select sc.sno from stu_cour sc GROUP BY sc.sno HAVING AVG(sc.socre)>80);
5.查询学生和平均成绩,但是平均成绩大于01班的任何一个学生的平均成绩。
-题目1:"01班的每个学生的平均成绩":
学生的平均成绩
select avg(sc.score) from stu_cour sc group by sc.son;
01班的学生:
select s.sid from student s,classes c2 where s.cno = c2.cid And c2.cname = '01班';
拼接:因为是01班的学生 所以通过sid in()来拼接
select avg(sc.score) from stu_cour sc class group by sc.son where s.sid in (select s.sid from student s,classes c2 where s.cno = c2.cid And c2.cname = '01班');
大于任何一个学生,应该是最大值了:all()
查询学生和平均成绩:
select s.sname,avg(sc.socre) from student s,stu_cour sc group by sc.sno having avg(sc.socre)>any 作者: COLDER 时间: 2018-5-26 00:16 本帖最后由 COLDER 于 2018-10-18 19:14 编辑
多表查询:交叉连接,内连接,外链接,自连接,子查询
交叉连接:笛卡尔积,多张表的乘积.
内连接:两张表的交集,分为隐式内连接与显示内连接.
隐式内连接:select * from emp e,dept d where e.deptno = d.deptno and 条件;
显示内连接:select * from emp e (inner) join dept d on e.deptno = d.deptno and 条件;
外链接:主表的全部加上从表的部分,外链接分为左外链接,右外链接,左右方向均是指向主表.
左外链接:select * from emp e left (outer) join dept d on e.deptno = d.deptno;
右外链接:select * from emp e right (outer) join dept d on e.deptno = d.deptno;
自连接:自己与自己连接,select * from emp e,emp e1 where e.mgr = e1.emptno;
外连接: 分为左外连接和右外连接 outer join (outer 可以省略)
左外连接语法格式: select *from 表一 left outer join 表二 on 关联条件
右外连接语法格式: select *from 表一 right outer join 表二 on 关联条件
子查询: 一条sql 语句中的条件中包含另一条sql语句; 带in 子查询;带exists的子查询, 带any子查询,带all
如 : 查询学生生日在91年之后的班级的信息。
select * from classes where cid in (SELECT cno FROM student WHERE birthday > '1991-01-01');
,多表查询的方式:
1,连接查询 (就是通过外键查询的)
交叉连接(一般用不到):查到的是两个表的记录数的乘积笛卡尔积,cross join
格式select * from 表1 cross join 表2 ;(方式一)
select * from 表1,表2 ;(方式二,比较常见)
内连接inner可以省略:
select * from 表1 inner join 表2 on 表1外键=表2主键 ;显式
select * from 表1,表2 where 表1外键=表2主键; 隐式(比较常见)
外连接:;左/右外链接 左为主右为辅/右为主左为辅 主的全显示辅的只显示匹配主的
格式:select * from 表1 left/right outer join 表2 on 条件
条件 (where 表1.属性1=表2.属性2 ;)
注释:如果左外连接,说明左边是主表,全部显示,右边没有用null补齐
如果右外连接,说明右边是主表,全部显示,左边没有用null补齐
子查询:(嵌套)查询工资和职位和 smith相同的所有员工信息
select * from emp where sal=(SELECT p.sal from emp p where p.ename='smith')
注释;从emp表查询工资=(从emp表查询 p.工资, 令emp为p p.名字为smith )
or job = (SELECT p.job from emp p where p.ename='smith')
从emp表查询 p.工种, 令emp为p p.名字为smith
作者: ...ylq 时间: 2018-5-27 00:43
叶凌青
今天主要讲了SQL对多表记录操作
分为:
一对多:在多的一方创建外键指向一的一方的主键
多对多:创建中间表,中间表至少两个字段,分别指向双方主键
一对一:(很少)
多表查询:
连接查询
主要
内连接: inner join -- inner 可以省略
隐式内连接:select * from A,B where 条件;
显式内连接:select * from A inner join B on 条件;
外连接outer join -- outer 可以省略
左外连接:left outer join -- select * from A left outer join B on 条件;
右外连接:right outer join -- select * from A right outer join B on 条件;
子查询
一个SQL需要依赖另一个SQL语句的查询结果作者: 望蜀 时间: 2018-5-27 09:00
邵倩
多表:一条sql 操作多个表
可以通过ER图来看两表直接是否有关系
约束是用来保证数据的完整性
主键约束:确定一条记录,既不能为空,也不能重复
唯一约束:可以为空,不能重复
外键约束,用来保证多表直接的数据完整性
添加外键约束
1.在员工表上添加外键
alter table employee add foreign key(dno) refrences dept(did)
insert into employee values(,,,)