黑马程序员技术交流社区

标题: 【厦门JavaEE就业1期-每日总结】MySQL多表 [打印本页]

作者: 厦门校区    时间: 2018-5-25 19:47
标题: 【厦门JavaEE就业1期-每日总结】MySQL多表
同学们,以下是今日任务。今日重点是多表的内外连接查询以及子查询要求每位同学练习课堂多表相关练习,然后以口语化的方式在评论区提交你的每日总结,谈谈你对今日重点知识的理解!



作者: 六道的骸6    时间: 2018-5-25 20:57
张裕
                                MySQl多表
多表中有个外键约束:用来保证数据的完整性       
添加外键约束
        alter table 表名 add foreign key(列名) references 表名(列名);
设置外键不允许为空
        alter table 表名 modify 列名 类型 not null;

多表中有三种关系         一对多(教室和学生) 在教室表中创建外键 指向学生表
                多对多(课程和学生) 需要创建中间表 表中有两个字段作为外键指向两张表的主键
                一对一(公司和地址)         唯一外键对应方式:假设是一个一对多关系,在多的一方创建外键指向单个的主键,将外键设置成唯一(unique)
                                主键对应方式:将两个表的主键建立对应关系


                                        多表查询
分类
连接查询
        交叉连接: cross join 查询到的是两个表的笛卡尔积(得到两个表的乘积)
                        select * from 表一 cross join 表二;(或者将cross join替换成 , 号)

        !内连接:inner join(可省略)
                显示内连接:在SQL中显示的调用了inner join关键字
                        select * from 表一 inner join 表二 on 关联条件;
                隐式内连接:没有调用inner join 关键字
                        select * from 表一,表二 where 关联条件;

        !外连接:outer join(可省略)
                左外连接
                        select * from 表一 left outer join 表二 on关联条件;
                右外连接
                        select * from 表一 right outer join 表二 on关联条件;

内外连接的区别: 内连接查询的是两张表的公共部分 左外连接查的是左边表的全部加两张表的交集和右外连接相同

子查询
        一个查询语句条件需要依赖另一个查询语句的结果(语句嵌套)
        in(范围查找)
                select * from 表一 where 列名 in(select....条件);       
        exists(是否存在)
                判断记录是否存在,存在执行前面的SQL语句
        any(任意一个)
                判断条件是否> < 任意一个 执行SQL语句(排除最大最小?)
        all(比较所有 max min)
                判断是否> <所有 执行SQL语句(获得最大最小?)
       



                                        事务
事务:指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全部成功,要么全部失败.

开启事务
        start transaction
提交事务
        commit
回滚事务
        rollback

事务的隔离级别
由低到高        read uncommitted
        read committed
        repeatable read
        serializable
                       
作者: 5119    时间: 2018-5-25 21:04
游荣辉
单表约束
        主键约束        唯一约束        非空约束
多表约束
        外键约束(为了提高安全性)
多表有三种表关系       
        1.一对多: 如创建外键约束: 在多的一方创建外键指向一的一方的主键
        2.多对多: 如创建外键约束: 需要创建中间表,中间表中至少两个字段,分别作为外键指向多对多双方的主键
        3.一对一: 如创建外键约束: 唯一外键对应
                                        假设是一对多,在多的一方创建外键指向一的一方的主键,将外键设置为unique。
                                    主键对应
                                        将两个表的主键建立对应关系即可。
如何查询多表呢?
        查询多表有四种方式
                交叉连接:使用cross join关键字 (可以不写cross)
                        1.select * from 表名1 cross join 表名2;
                         不使用cross join关键字(把cross join改成逗号)
                        2.select * from classes,student;
                内连接:使用inner join和on 关键字(又叫显示内连接,可以不写inner)
                        1.select * from 表名1 inner join 表名2 on 连接条件
                        不使用inner join和on 关键字(又叫隐世内连接)
                        2.select * from 表名1 , 表名2 where 连接条件
                外连接:使用left outer join关键字(叫做左外链接,可以不写outer)
                        1.select * from 表名1 left outer join 表名2 on 连接条件
                        使用rigth outer join关键字(叫做右外连接,可以不写outer)
                        2.select * from 表名1 rigth outer join 表名2 on 连接条件
                子查询:就是在sql语句中嵌套sql语句(这是最简单的子查询语句还有带 in  any    exists   all)
作者: 李思贤126    时间: 2018-5-25 21:04
李思贤:今天 主要学习了sql中多表部分和多表查询:

学习多表首先要知道什么是约束;约束就是用来保证数据的完整性。单表中我们学习了主键约束,唯一约束,非空约束,在多表中又会学习一种新的约束-----外键约束.

表之间关系:         1 一对一(不常用,因为可以直接在一个表中完成)  
2多对一
3多对多


建表原则:        1 一对一(
唯一外键对应
假设是一对多,在多的一方创建外键指向一的一方的主键,将外键设置为unique。
主键对应
将两个表的主键建立对应关系即可。
)

2 多对一(多的一方设置外键指向一的一方主键!
)

3 多对多(建立中间表,至少设置2个字段作为外键分别指向多的表的主键!
)



多表查询:
1.交叉连接: 查到的是两个表笛卡尔积
select * from 表1 cross join 表2;
select * from 表1,表2;

2.内连接:inner join(inner可省略)
1)隐式内连接:select * from 表1,表2 where 关联条件;
2)显示内连接:select * from 表1 inner join 表2 on 关联条件;

3  外连接:outer join(outer 可省略)
1)左外连接:select*from 表1left join 表2 on关联条件
2)右外连接:select*from 表1right join 表2 on 关联条件



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 意思是右边表为主导

今天还学习了事务,隔离性讲的比较多,隔离等级分为4个等级 ,每个等级的权限不同,作用也有区别.不过不是今天的重点,了解了解,后面在学习
作者: 光宇    时间: 2018-5-25 21:29
侯玉林

今天我们讲了多表,主要有一对多,多对多,一对一三种类型.
然后又讲了该如何去用sql语句去对多表进行增删改查的操作,
主要还是select.有交叉连接,内连接(分显式和隐式),以及外连接
最后讲了事务和它的隔离级别
作者: 厦门黑马王子    时间: 2018-5-25 21:33
郑雪平

今天学习了多表设计,多表查询和事务与事务的隔离级别.在进行多表设计的同时要创建有外键
约束,因为这样才能保证数据的完整性.


     还有需要理清表与表之间的关系,总共分为:一对多关系,多对多关系和一对一这三种关系;一对

多关系我们可以拿班级与学生的关系来做举例说明;多对多关系的阐述可以使用学生与课程的关系

来举例说明;一对一关系则可以用人员与身份证的关系来加以解释说明,因为一个人只能拥有一张身

份证,一张身份证只能被一个人使用,这就是一对一关系;

      多表查询就显得比较复杂些,在进行多表查询前需先做数据准备,而且它还分为1.交叉连接;

2.显示连接;3.隐式连接;4.内连接;5.外连接,还有一个子查询,总共分为四种,其中带IN的子查询较为常

用所有也比较重要.
作者: 厦门陈强    时间: 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的最大条件方可执行


事务指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全都成功,要么全都失败。事务有四个特性:原子性  一致性  隔离性  持久性;  
Start  transaction 开启事务;  保存当前状态的数据
Commit; 提交事务;  操作全部正确是才能提交成功;并结束事务
Rollback; 回滚事务;  将数据还原到开启事务时的状态;
多个事务并发时可能会引起安全问题:脏读,不可重复读,虚读
提高事务的隔离等级可避免问题的发生:
read uncommitted        :脏读,不可重复读,虚读都有可能发生;效率最快但安全性最低
read committed        :避免脏读。但是不可重复读和虚读是有可能发生,
repeatable read        :避免脏读和不可重复读,但是虚读有可能发生。
Serializable       : 不会发生安全问题,但是效率最低
作者: sts    时间: 2018-5-25 21:53
苏海斌
今天主要讲了MySQL的多表,以及一个外键约束(用来保证数据的完整性).
多表结构就会有表与表的关系,包括一对多,多对多,以及一对一(了解就好,用的不多),
多表的重点就是查询:
包含内连接和外连接,其中内连接分为两种,即隐式和显式,至于关键字
隐式用where,显式用join  on,
例:
Select * from user , dept  where user.did = dept.did   and 条件;

Select * from user (inner) join dept  on  user.did = dept.did  and 条件;
其中显式的inner可省略;
而外连接也分为两种,即左外连接和右外连接,其实就是看左边作为主表还是右边作为主表.
另外还提了一下子查询(即一条SQL语句的条件中包含另一条SQL语句)
最后,下午讲了事务,大概的提了下脏读,不可重复读,虚读等..
作者: finfin12    时间: 2018-5-25 21:54
张育辉
六 多表查询
                                1:外键约束 alter table 表名 add foreign key (多的表名) references 哪张表(列名);
                                        作用:增加安全,防止胡乱修改,增加约束
                                2:多表关系
                                                -对多(一个教室有多个学生,一个学生只有一个教室,在多的表上添加外键)
                                                一对多的建表原则:在多的一方创建外键指向一的一方的主键
                                                多对多(一个学生可以选择多个课程,一门课程可以被多个学生选择,需要创建中间表,创建外键至少2个字段分别指向两张表的主键);
                                                多对多的建表原则:要创建中间表,中间表中至少两个字段,分别作为外键指向多对多双方的主键
                                                一对一(一个教室只有一个地址,一个地址只有一个教室)外键指向类型必须要唯一,这种做法没有意义;
                                3:内连接
                                         显示连接 select * from 表名1  inner join 表名2 on 条件筛选取交集;
                                         隐示连接 select * from 表名1 , 表名2 where 条件筛选取交集;
                                4:外连接
                                        左外连接 select * from 表名1  left outer join 表名2 on 条件筛选;outer可以省略不写
                                        右外连接 select * from 表名1  right outer join 表名2 on 条件筛选;outer可以省略不写        
                                        (两个区别就是看那张表是主表)
                                5:子连接  就是条件嵌套,一个查询语句条件需要依赖另一个查询语句的结果
                                        带in的子查询 in(1,2,3),就是满足1,2,3都可以
                                        带exists的子查询  select * from 表名 where exists (条件1);如果条件1满足前面的SQL语句就会执行
                                        带any的子查询 SELECT * FROM 表名 WHERE cid > ANY (条件1 ),只有满足里面一条就可以
                                        带all的子查询 SELECT * FROM 表名 WHERE cid > ALL (条件1),大于所有
                                6:自连接 ,就是自己把自己当做参照物
                                
                                7:事务:指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全都成功,要么全都失败。
                                          开启事务:start transaction  //建档
                                                提交事务:commit;
                                                回滚事务:rollback;回滚就是数据库修改错误,可以回到建档之前,回到开启事务之前的数据
                                8:事务的特性:原子性
                                                                原子性:事务的不可分割,组成事务的各个逻辑单元不可分割。
                                                                一致性
                                                                事务执行的前后,数据完整性保持一致
                                                                隔离性
                                                                隔离性:事务执行不应该受到其他事务的干扰。
                                                                持久性
                                                                持久性:事务一旦结束,数据就持久化到数据库中。
                                9:隔离性:一个事务的执行,不应该受到其他事务的干扰。
                                                        如果不考虑隔离性(一个事务执行受到其他的事务的干扰),引发一些安全问题,主要体现在读取数据上:
                                                        脏读:一个事务读到了另一个事务未提交的数据,导致查询结果不一致
                                                       不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致多次查询结果不一致。
                                                      虚读/幻读:一个事务读到了另一个事务已经提交的insert的数据,导致多次查询结果不一致。
                                10:设置事务的隔离级别:
                                                                        read uncommitted        :脏读,不可重复读,虚读都有可能发生
                                                                        read committed        :避免脏读。但是不可重复读和虚读是有可能发生
                                                                repeatable read        :避免脏读和不可重复读,但是虚读有可能发生。
                                                                serializable :避免脏读,不可重复读,虚读。
作者: 1748341437    时间: 2018-5-25 21:55
林玮
今天学了mysql多表和mysql事务,其实主要就是多表了,因为今天一天时间事务就讲了30分钟左右,而且以后会有一天时间来接着学这个事务了.

    外键约束:外键约束是一个针对表与表之间的的约束,他有三个关系,第一个就是[一对多]:一个表的如果设置一个外键,那么他就可以指向另一个表的一个主键(主键可以是多个),指向的这个主键就不能随便添加数了,只能添加设置了外键的表里的一些数,主要用于员工表与部门表,学生表与班级表,等等...[多对多]:外键约束多对多通俗来讲就是,你去商场买东西,你可以买多件商品,而一件商品也可以被多个人买,这就是多对多关系.多对多的指向你要通过的三张表,也就是再创建一张表,我们称它为中间表,它的主要作用是让一个表中的一列可以指向另一个表中的列,而这两列必须要为主键,让两表中其他外键通过主键指向你所指定的地儿,主要用于客户表与商品表,应聘员表,公司表,等等...[一对一]:辉哥说没什么意义,我听了一下也觉得没什么意义,明明可以只用一个表完成的是为什么要,再创建一个表找事呢?  非空约束: 约束元素不能为空;唯一约束:不能重复; 主键约束:就结合前两个约束既不能记录不能为空,也不能重复,一个表中只能有一个主键,其实主要就是外键约束,其他的没什么逻辑.今天的知识点也不难,只要多敲多练,慢慢的你就懂了.
作者: 许大炮    时间: 2018-5-25 21:55
许剑鸿 webDay09

外键约束是用来保证数据的完整性。

约束:
主键约束:可以确定一条记录,既不能为空,也不能重复。
唯一约束:不能重复,但是可以为空   
非空约束:不能为空,可以重复
外键约束:外键约束是用来保证数据的完整性。(员工和部门)

表和表之间的关系
一对多:在多的一方创建外键指向一的一方的主键(学生和班级,在学生表中创建外键指向班级的主键)
多对多:必须创建中间表,中间表至少两个列分别作为外键指向两张表的主键
一对一:不常见 因为可以直接列在一个表中

多表查询:

交叉连接:两张表的笛卡尔积
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;

表之间关系分三种:
一对多
多对多
一对一;

不同关系之间建表原则:
一对多:多的一方创建外键指向一的一方的主键;
多对多:创建中间表,中间表中至少两个字段,分别作为外键指向多对多双方的主键;
一对一:唯一外键对应,如果是一对多,多的一方创建外键指向一的主键.外键设置为unique.
       将两个表的主键建立对应关系即可

多表连接查询:
交叉连接cross join :select*from 表1,表2
获取两个表的笛卡尔积;即获取互相匹配所有记录的结果
内连接:
显示内连接:select*from 表1 inner join 表2 on 关联条件;(inner可以省略)(调用inner join)
隐式内连接:select*from 表1,表2 where 关联条件;(没有调用inner join)
外连接:outer join(outer 可以省略)
左外连接:select*from 表1 left outer join 表2 on 关联条件;
右外连接:select*from 表1 right outer join 表2 on 关联条件;

事务:逻辑上一组操作.组成这组操作的各个逻辑单元,要么全部成功,要么全部失败;
流程:
        开启事务
        提交事务
        回滚事务
        提交事务
特性:
原子性:组成事务的各个逻辑单元不可分割
一致性:数据完整性保持一致
隔离性:执行不受其他事务干扰
持久性:事务结束后,数据持久化到数据库中;

作者: seilye    时间: 2018-5-25 22:04
叶身辉:
今天学习了mysql的多表查询,首先学习了如何添加给一个表格添加外键,然后学习了表格与表格之间对应的关系,有一对一(比较少,主键对应就好了),一对多,和多对多的关系,
主要知识点有left join 左外连接查询 right join右外连接查询 外连接查询的时候条件要用on不能用where, 子查询 带in 包含的意思,带exists如果存在sql就执行不存在就不执行,any任意一个,带all所有的,uniou去重复,
还学习了事务,主要了解了事务start transaction 开启事务,commit 提交事务,
rollback回滚,以及隔离区分四个级别.
作者: 磬辰    时间: 2018-5-25 22:06
外键约束:表A的主关键字是表B中的字段,外键是用来实现参照完整性

多表连接

左外连接:... left outer ... on 关联条件,左表的所有字段和右表匹配字段

右外连接:... right outer ... on 关联条件,右表的所有字段和左表的匹配字段

全外连接:  用union 连接 左外连接和右外连接

内连接:  where a.id = b.id  等值匹配

自连接: 将自身分成两张表。可以进行等值连接或者外连接

子查询:
其实就是嵌套查询,需注意返回值是多行还是单行。

事务的特性:
1.原子性
2.一致性
3.隔离性
4.持久性

事务的隔离级别:
1.脏读
2.不可复读
3.虚读


作者: hpb199567    时间: 2018-5-25 23:04
何平波
多表约束
外键约束:用来保证数据完整性(多表),某个数据为null,就不能添加外键,外键的值不允许为空,外键的作用是保证数据不会被操作失误胡乱修改

表与表的关系
一对多   例子 :班级和学生   部门和员工

如何添加外键
例如在一对多的关系表中,在多表中添加外键,先在多表中添加外键名和外键栏指向一表中的主键.

一对多建表的原则
例如在一对多的关系表中,在多表中添加外键,先在多表中添加外键名和外键栏指向一表中的主键
多对多的关系
多对多   例子 :学生和多门课程  用户对商品
借助第三张(中间表)
多对多建表的原则
创建中间表 ,在中间表中至少两个字段,分别作为外键指向多对的主键

一对一的关系
一对一   例子 :企业和企业网址
唯一外键对应的方式:
假设是一对多,在多的一方创建外键指向一的一方的主键,将外键设置为unique
主键对应方式
将两个表的主键建立对应关系即可.

交叉连接
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值表示

子查询(sql语句的嵌套)  因子查询都是条件判断,所以要在where后
带in的子查询
用法在in()里嵌套一些查询方法;
带exists的子查询(exists代表是否存在记录)
用法在exists()里嵌套一些查询方法
带any的子查询(任意一个记录)
用法在any()里嵌套一些查询方法
带all的子查询(所有的记录)
用法在all()里嵌套一些查询方法

事务
理解:事务:指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全都

成功,要么全都失败。
方法: start transaction 开启事物
      commit 提交事物
      rollback 回滚事物,返回事物
特点:1.原子性  事务不可分割,组成事务的各个逻辑单元不可分割
     2.一致性  事务执行的前后,数据完整性保持一致.
     3.隔离性  事务执行不应该受到其他事务的干扰.
     4.持久性  事物一旦结束,数据就会持久化到数据库中.
作者: 一梦    时间: 2018-5-25 23:17
陈世彪:
今天学习了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 条件;
可以不加outer  
子查询中的 in(范围查找)
select * from 表一 where 列名 in(select....条件);
事务是一系列的操作,保证数据和业务逻辑的完整性
开始事物
start TRANSACTION
要执行的sql语句
最后提交结束
可以用commit或者rollback回退
sql默认安全等级为repeatable read;
为了解决并发使用serializable
作者: Yanmo_    时间: 2018-5-25 23:23
颜琳琳
  
   今天主要学了,多表的创建和查询以及多表的关系,多表的关系中分为:1. 一对一 2.多对多 3.一对多,主要掌握多对多和一对多两个关系,一对多中要有创建一个外键,在多的那个表格中添加一个外键(外键是用来约束数据的完整性); 多对多中要创建一个中间表,中间表中至少两个字段,分别作为外键指向多对多双方的主键;
多表中的创建的连接主要有:1. 内连接(关键词:inner join):显示内连接和隐示内连接2.外连接(关键词:outer join):左外连接和右外连接 (注意: 外连接和内连接主要区别在于两个连接的查询的内容的不同,内连接查询的是两个表共有内容,而外连接查询的是两个表共有的内容和其查询的不是共同的内容.  3.自连接:顾名思义就是自己连自己.
子查询:就是一个SQL语句中在写一个SQL语句,其中有1. 带有in子查询,2.带有exists的子查询,3.带有any的子查询,4.带有all的子查询,这些子查询主要掌握in,其他掌握即可.
学习了事务,它是一组逻辑上的操作,这一组操作的各个单元,要么成功,要么失败; 它的特性有:1.原子性,2.隔离性,3.持久性,4.一致性;
作者: Nevermo    时间: 2018-5-26 00:04
许煜
mysql总结
外键约束 保持多表之间元素完整性
一对多 建表原则 多的一方创建外键指向1的那方主键
多对多 创建中间表 中间表至少两个外键指向双方主键
多表查询 交叉连接 笛卡尔积 select* from tab1, tab2  //select * from tab1 cross join tab2
内连接 显:select* from tab1 inner join tab2 on 关联条件
        隐 select * from tab1, tab2 where 关联条件    两表交集
外链接 select * from tab1 left/right outer join tab2 on 条件 (inner/outer可省略)
子查询 一条sql语句包含另一条sql语句
Select * from tab1 where in/exist/any/all(sql语句)
事务  开启start transaction   提交commit   返回 rollback
今天主要学习目标就是做到灵活查询多表内容
作者: 张述明    时间: 2018-5-26 00:06
张述明
今天学习多表查询和事务
多表查询中使用到一个因素就是外键 外键是用来保证数据的完整性
要学会多表查询先要理解表单之间的关系
比如一对多的关系 例子 员工和部门 外键的创建要在多的一方创建外键指向一的一方的主键
多对多的关系 需要创建一个中间表 中间表至少要有两个外键指向另外两个表的主键 例子学生和课程
一对一的关系 例如 公司和公司的注册地址 . 分成唯一外键对应 和主键对应的方式.
多表的查询  连接查询  
交叉连接  select*from 表1,表2;
内连接: select* from inner join 表2 on关联条件
外链接: select* from outer join 表2 on关联条件
子查询分成带in,exists,any,all 的子查询 其中in是重点

事务
开启事务 start transaction
提交事务  commit
回滚  rollback
特性
原子性,一致性,持久性,隔离性.
事务的隔离性的级别不同可预防不同的问题 隔离的等级越高效率越低越安全
可能引发的问题如脏读 不可重复读 和虚读.

作者: AsusCoder    时间: 2018-5-26 00:11
本帖最后由 AsusCoder 于 2018-5-28 08:38 编辑

曾耀峰  
  今天学习SQL多表操作。多对多关系的表的建立,可以通过mysql数据库可视化管理工具来进行。在建立多对多关系的表,要先建立一个中间表,把两个表之间的主键放到中间表中,对于中间表,分别设置两个外键关联到这两个表之中。建议先建立多表之间的关系,再往表里面添加数据。
   今天的难点是多表查询,涉及到的重点知识有内连接查询,外连接(左外连接,右外连接)查询,和子查询三个。
   通过多表查询的练习后,个人觉得可以把多个表之间的查询看成一个整体表。因为表与表之间是有关联的,查询几个表的数据同样会得出一张大表。把N个表看成一个整体表,在逻辑上的理解会比较容易。
   另外通过子查询可以把一个复杂的查询转换为多个简单的小查询再进行拼接。


一、多表联合查询:
1.交叉查询:
  
  1).交叉查询是求多个表之间的笛卡儿积的所有情况,比如班级表classes有4个记录(数据),学生表student有9个记录,那么使用交叉查询所得到的就是36个记录。以表student为主表遍历classes表。像java中的二维数组遍历一样。
  交叉查询应用少,在求所有情况才使用。理解即可。

  2).格式:
  (1).select * from classes cross join student;
  (2).select * from classes join student;
  (3).select * from student,classes;

  其中corss join可以省略。


2.内连接(重点) inner join(inner 可以省略)
   把两个表看作两个集合,内连接就是求两个表交集的那部分。分为两部分:

   -显示内连接:在SQL中显示的调用inner join关键字
      语法: select * from 表1 inner join 表2 on 关联条件

      举例:
      
      select * from classes c inner join student s on c.cid = s.cno;

      查找出c中cid的值等于s中cno的值的所有情况:

      比如:cid = 1时,con = 1 有3个记录
           cid = 2时,con = 2 有3个记录
           cid = 3时,con  =3 有2个记录

   -隐式内连接:在SQL中没有调用inner join关键字

      语法:select * from表1,表2 where 关联条件
   
      
3.外连接(重点) outter join(outer 可以省略)
   
    - 左外连接: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;


3.查询学生的姓名和学生的选课总数,显示选课超过2门学生姓名.

分析:当遇到"数目","总数","数":肯定是求数量,求数量就要用到分组统计count(*) 和group by。选课数量超过2门,只能用having关键字来写。

   select s.sname,count(*) from from student s,stu_cour sc where s.sid = sc.sno group by sc.cno having count(*)>2;

4.查询平均成绩大于80分的学生的总数。

分析:因为求平均分和总数,这里涉及到两个聚合函数。把它拆分成题1"求平均成绩大于80分的学生",题2"求学生的总数"这两个问题

题1:"求平均成绩大于80分的学生":利用聚合函数 和分组:对stu_cour表中的学生学号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 编辑


Day09

今天学习的内容为MySQL多表(重点)和事务(了解).
MySQL多表:
我的理解:多表是位于MySQL数据库中的多个表格,多个表格是用来存储不同关系的数据,通过不同关系的表格
但是又有相关联的属性来进行数据的增删查功能,今天对多表的学习主要是表与表之间的关系,约束,多表的查询.

多表的约束:外键约束,外键约束的意思是将表与表之间相关联的属性进行约束限制,作用保护数据的完整性,在
需要对数据进行增删改操作时,需要符合外键约束条件才能操作成功.

多表的关系:关系分为一对多,多对多,一对一.
一对多:在定义为多的表格对象上创建外键指向定义为单一的表格对象的主键.
例子:员工和部门,员工为多的表格对象,部门为单一的表格对象,一个部门有多个员工,一个员工只能有一个部门
多对多:创建中间表的外键指向两张表的主键.
例子:学生和课程,一个学生可以有多个课程,一个课程也可以有多个学生.
一对一:同一张表格,通过共同属性来查询相关信息.
例子:每个人的身份证都是一一对应.

多表查询:交叉连接,内连接,外链接,自连接,子查询
交叉连接:笛卡尔积,多张表的乘积.
内连接:两张表的交集,分为隐式内连接与显示内连接.
隐式内连接: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;

子查询:SQL语句的条件为另外的SQL语句,分为in,exist,any,all的子查询.
in:包含查询
exist:存在查询
any:部分查询,大于最小,小于最大
all:所有查询


作者: 咸鱼coder    时间: 2018-5-26 00:33
万冕

今天主要学了约束,主建约束唯一且不为空 非空约束,外键约束数据完整性。

多表的多对多,主要是多表的查询,select * from 表名 where 条件
显示内连接   select * from 表名  inner join 表名2 on 条件;

隐式内连接   select * from 表名, 表名2 where 条件;
  
还有左外连接 SELECT * FROM 表名 left join 表名2 on 条件 ;
右外连接 SELECT * FROM 表名 right join 表名2 on 条件 ;

还是一样的主要敲代码熟练代码,熟练!!!
作者: 林荣彬    时间: 2018-5-26 01:05
林荣彬
      今天主要学习了多表的之间的关系和外键约束的创建,事务特性的了解.,重点学习了多表的查询.
外键约束:是用来保证数据的完整性;

表和表的关系:
一对多:在多的一方创建外键指向
多对多:需要创建中间表,中间表中至少两个字段,分别作为外键指向多对多双方的主键

多表查询的分类:
1: 连接查询分为:
  1.交叉连接:
  2.内连接:
     显示内连接:在SQL中显示的调用inner join关键字
     隐式内连接:在SQL中没有调用inner join关键字
  3.外连接:
      左外连接:在SQL中调用left  outer join
      右外连接:在SQL中调用right  outer join

2: 子查询:一条SQL语句的条件中包含另一条QSL语句
1. 带in(包含)的子查询
2. 带exists(存在)的子查询
3. 带any(任意的)的子查询
4. 带all(所有)的子查询


事务的特性:
原子性:事务的不可分割,组成的事务的各个逻辑单元不可分割
一致性:事务执行的前后,数据完整性一致
隔离性:一个事务的执行不应该受都其他事
作者: it小白001    时间: 2018-5-26 12:23
吴俊斌
学习了什么是约束,就是为了保证数据的完整性,约束类型要一致,长度也要一致.
还学习了三种数据关系
       一对多,一对一,多对多(要用中间表来建立关系)
还学习了多表查询
        交叉连接:
           内连接
                 显性 select * from 表一 cross(可省略) join 表二;
                 隐性 select * from 表一 , 表二;
                 查询的是所有出现的组合(两表乘积)
           外连接:
                  select * from 表一 (left或者right) join 表二;分别代表左外和右外 加条件要用on
                 
                  查询的是所有出现的组合(两表交集加上left或者right对应表的所有内容)

还学习了子查询(一个查询语句条件需要依赖另一个查询语句的结果):
        in:包含查询
        exist:存在查询
        any:部分查询,大于最小,小于最大
        all:所有查询


作者: 追风筝的人哇    时间: 2018-5-26 13:11
康元中
学习mysql 多表的操作
表和表的关系分为
  表和表一对一关系: 如公司的地址和公司的id
表和表一对多的关系:如学生和班级关系 / 部门和员工关系
表和表的多对多关系:如学生和课程/商品和订单
操作多张表通过设置外键操作: 一对多时将外键设置在多的那张表下 指向对应表的主键
                                          多对多设置中间表然后在该中间表添加关联表的外键分别指向对应的主键
设置外键能够起到约束的作用保证数据的完整性,: 1 设置主键上的字段的数据类型和添加外键的字段的数据类型保持一致;
                                                                  2. 设置外键就无法对数据的任意更改
  添加外键方式两种: 分别是cmd 控制台输命令 和 工具sqyol创建和添加

2  多表查询
   多表查询之链接查询
    交叉连接: 查询到的是两个表的笛卡尔积
                                        selct *from 表一 cross jion 表二
                                        select *from 表一,表二;
内连接: 显示内连接和隐式内连接 inner join (关键字inner 可以省略)
显示内连接: select *from 表一 inner join  表二 on 关联条件
隐式内连接:select *from 表一 , 表二where  关联条件

外连接: 分为左外连接和右外连接 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');

事务 :
  开启事务:start transaction;
  事务回滚rollback;
(提交事务)事务关闭commit
设置事务的隔离级别:
read uncommitted  :脏读,不可重复读,虚读都有可能发生
read committed  :避免脏读。但是不可重复读和虚读是有可能发生
repeatable read  :避免脏读和不可重复读,但是虚读有可能发生。
serializable  :避免脏读,不可重复读,虚读。
设置事务隔离级别格式
SET SESSION TRANSACTION ISOLATION LEVEL 事务隔离级别;

   

作者: 376091692    时间: 2018-5-26 14:55
凌辉:
今天学习了mysql的多表
多表分为一对多,多对多,一对一;
一对多的外键为多的一方创建外键指向一的一方的主键;
多对多先创建出中间表,表创建出两列主键,分别连接两个表;


内连接是两张表的被同时覆盖到的地方;
外连接分为左右,左外连接为左边那个球,右外连接为右边那个球
还学习了子查询:in,exists,any,all

作者: doudou0606    时间: 2018-5-26 15:48
施炎生
1.添加外键约束
alter table 表名 add foreign key(列名) references 表名(列名);
设置外键不允许为空
alter table 表名 modify 列名 类型 not null;
2. 查询多表的方式
  a.交叉连接:使用cross join关键字 (可以不写cross)
  select * from 表名1 cross join 表名2;
  select * from classes,student;
  b.内连接:使用inner join和on 关键字(又叫显示内连接,可以不写inner)
  select * from 表名1 inner join 表名2 on 连接条件
  不使用inner join和on 关键字(又叫隐式内连接)
  select * from 表名1 , 表名2 where 连接条件
  c.外连接:使用left outer join关键字(叫做左外连接,可以不写outer)
  select * from 表名1 left outer join 表名2 on 连接条件
  使用rigth outer join关键字(叫做右外连接,可以不写outer)
  select * from 表名1 rigth outer join 表名2 on 连接条件
3.子查询:
  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-26 20:15
黄志彬
外键约束就是用来保证数据的完整性;
给表取别名让表看起来更加简洁明了。

表与表的关系:
一对多,在多的那一方设置外键指向一的一方主键;
多对多,创建一个中间表从两个表中至少取一列都设置成外键分别指向两个表的主键;
一对一,两个表的主键设置外键,外键设置为唯一;
多表的查询:
交叉连接,两张表的笛卡尔积。
内连接,相当于两张表的交集。
隐式内连接;
显示内连接;
外连接,主表的全部,从表的部分
左外连接;
右外连接;
自连接:自己跟自己连接

MySQL 事务主要用于处理操作量大,复杂度高的数据:原子性,一致性,隔离性,持久性。
开启事务:start transaction;
提交事务: commit;(也等于关闭事务)
 回滚事务: rollback;    
事物的隔离级别
Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
Repeatable read (可重复读):可避免脏读、不可重复读的发生。
Read committed (读已提交):可避免脏读的发生。
Read uncommitted (读未提交):最低级别,任何情况都无法保证。
最高的是Serializable级别,最低的是Read uncommitted级别,级别越高,执行效率就越低。
作者: 郑学馨    时间: 2018-5-26 21:59
郑学馨
外键有什么作用:保证数据的完整性
怎么添加外键;利用可视化工具进行外键设置
表与表之间的关系:一对多;多对多;一对一
外键的创建:外键连接一般创建在多的一方;

多对多关系的创建规则:在两表之间创建第三表,且该表至少得存

在两列;

连接方式:
内连接:(隐式内连接:select * from student inner join

class on student.id=class.csid;
/显式内连接:select * from student ,class where

student.id=class.csid;)

外连接:(左外连接:select * from student left join class

on student.id=class.csid;
/右外连接:select * from student right join class on

student.id=class.csid;)
二者区别:确定的主表不一样,左外表示join左边的表为主表,右

外则表示join右边的表为主表;主表就是主表内的所有选项都必

须在结果中显示,不管附表是否有包含主表的内容;

什么是子查询:sql语句嵌套查询

什么事物:俗称后悔药,

事物的特性(面试):原子性,一致性,隔离性,持久性
作者: zzx835387607    时间: 2018-5-26 22:05
郑志祥Mysql(多表)个人笔记

  今天复习了单表的特点,1,唯一约束2,非空约束 3,主键约束(刚好包含前面两点)
学习了多表,多表特点:用来保证数据的完整性,(比如;部门还有人,就无法直接删除部门,解决办法  1.先删除人,再删除部门    2.将人调到别的部门,再删除部门)

多表中有三种关系  ;      
一对多(教室和学生) 在教室表中创建外键 指向学生表

  多对多(课程和学生) 需要创建中间表 表中有两个字段作为外键指向两张表的主键

  一对一(公司和地址)         唯一外键对应方式:假设是一个一对多关系,在多的一方创建外键指向单个的主键,将外键设置成唯一(unique)



,多表查询的方式:
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






   事务(了解,后面继续学习)
事务:指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全部成功,要么全部失败.

开启事务
        start transaction
提交事务
        commit
回滚事务
        rollback
隔离性:一个事务的执行,不应该受到其他事务的干扰。
如果不考虑隔离性(一个事务执行受到其他的事务的干扰),引发一些安全问题,主要体现在读取数据上:
事务的隔离级别
由低到高     
 read uncommitted        :脏读,不可重复读,虚读都有可能发生
read committed        :避免脏读。但是不可重复读和虚读是有可能发生
repeatable read        :避免脏读和不可重复读,但是虚读有可能发生。
serializable                :避免脏读,不可重复读,虚读。

作者: wpwing    时间: 2018-5-26 23:06
吴鹏

--------------------------------------------
多表:
外键约束:保证多表之间数据的完整性;
约束保证数据的完整性;

一张表的一个字段名指向另一张表的主键字段;
当外键设置为非空字段时,添加字段的时候,外键不能为空;

表与表的关系(重点)

一对多
一个部门有许多个员工,一个员工只属于某一个部门;
在多的一方创建外键指向一的一方的主键;

多对多
一个学生可以选择多门课程,一门课程可以被多个学生选择;
要借助第三张表(中间表,在这张表中至少有两个字段,分别作为外键指向双方的主键)

一对一
一个公司可以有一个注册地址,一个注册地址也只能对应一个公司;

唯一外键对应的方式:
假设一对一是一个一对多的关系,需要在多的一方创建外键指向一的一方的主键
将外键设置为唯一(unique);

主键对应的方式:
直接将两张表的主键进行外键的设置;

-------------------------------------------------------
多表查询的分类
连接查询:
    交叉查询
        查询到的时两个表的笛卡尔乘积
        select * from 表1 cross join 表2;
        select * from 表1,表2;
    内连接 关键字:inner join(inner可以省略)
        显示内连接:在sql中显示的调用关键字
        语法:select * from 表1 inner jion 表2 on 关联条件(表1.字段名=表2.字段名);
        隐式内连接 在sql中没有调用关键字
        语法:select * from 表1,表2 where 关联条件;
    外连接 关键字:outer join(outer 可以省略)
        左外连接 表1为主表,主表全部显示,从表根据主表匹配来显示;
        语法:select * from 表1 left outer join 表2 on 关联条件;
        右外连接 表2为主表,主表全部显示,从表根据主表匹配来显示;
        语法 select * from 表1 right outer join 表2 on 关联条件;

----------------------------------------------

事务:
逻辑上的一组操作(DML),组成这组操作的各个逻辑单元,要么全部成功,要么全部失败
原子性
不可分割,组成事物的各个逻辑单元不可分割
一致性
事务执行的前后,数据的完整性保持一致;
隔离性
事务执行不应该受到其它事务的干扰
多个事务在并发;
持久性
事务一旦结束,数据就持久化到数据库中;

start transaction    开启事务
commit         提交事务
rollback         回滚事务

隔离性级别:
1 Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

2 Repeatable read (可重复读):可避免脏读、不可重复读的发生。

3 Read committed (读已提交):可避免脏读的发生。

4 Read uncommitted (读未提交):最低级别,任何情况都无法保证。

以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,
级别越高,执行效率就越低。所以平时选用何种隔离级别应该根据实际情况。
在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。




作者: ...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(,,,)

表和表之间的关系

一对多:员工和部门;用户和订单
在多的一方创建外键指向一的一方的主键

多对多:学生和课程
需要创建中间表,其中至少两个字段分别作为外键 指向多对多双方的主键

一对一(很少使用,因为可以直接在表里添加一列):公司和注册地址
假设一对一是一个一对多关系,需要在多的一方创建外键指向一的一方的主键,将其设置成唯一unique

多表查询的概述
多表查询的分类 1.连接查询:(很少使用)交叉连接cross join---查询到的是两个表的笛卡尔积,
内连接:     显示内连接 在sql中显式地调用inner join 关键字---select*from表1inner join表2 on 关联条件,inner可以省略
                   隐式内连接:在SQL中没有调用inner join关键字---select * from 表1,表2 where 关联条件;

隐式显式除了写法没有区别 用哪个都行

外链接:左外链接 left join  on,右外链接right join  on

自连接:select * from emp a,emp b where a.mgr=b.empno


多表查询中的子查询

查询工资比 smith更高的全部员工信息
select * from emp where sal+ifnull(comm,0)>(select sal from emp where ename='smith');
select sal from emp where ename='smith';

查询学生生日在91年之后的班级的信息
select * from classes where cid in (SELECT cno FROM student WHERE birthday > '1991-01-01');

事务 通常是DML
开启事务 相当于存档
提交事务 生效再结束事务
回滚事务 还原到存档的位置再结束事务
作者: Do1    时间: 2018-5-30 19:23
本帖最后由 Do1 于 2019-11-23 00:37 编辑


我们知道单表中一定会有一个主键,这个主键主要是用来方便我们取某一条数据 ,就像人的身份证号码一样/
外键可以比喻成3张表,一张表是学生表,一张表是课程表,一张表则是成绩单,成绩单上面有学生的学号及对应的成绩,那么学生表中的学号是学生表中的主键,因为一个学号对应一个人,课程表中的课程编号是课程的主键,成绩单上面有着学号和课程编号,所以成绩单中有着学生表和课程表的外键,如果说成绩单写了错误的学号或者错误的课程编号,那么SQL就会报错,这种外键约束保证了数据的安全性和严密性

外键sql语句
在创建时增加
   create table my_tab1(
   id int primary key auto_increment,
   name varchar(10) not null,
   class int,
   foreign key(class) references my_tab2(主键字段名);
   )charset utf8;
   在创建好的表中增加
   alter table my_tab1 add [constraint 外键名] foreign key(外键字段名) references mytab2(主键字段名);
删除外键
  alter table my_tab drop foreign key 外键名字;
语法:
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 事务隔离级别;
作者: avip0000    时间: 2018-6-4 17:44
白有旺
多表:以两张表的id字段信息相同作为条件建立两表关联,但在实际开发中不应该这样使用,最好用主外键约束来实现
在实际项目开发过程中经常用到从一个信息较为完善的表中派生出一个只含有几个关键字段的信息表,通过子查询就可以来实现这一目标
Java事务控制是构建J2EE应用不可缺少的一部分,合理选择应用何种事务对整个应用系统来说至关重要。一般说来,在单个JDBC 连接连接的情况下可以选择JDBC事务,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2