A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 厦门校区   /  2018-5-25 19:47  /  4296 人查看  /  54 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

黄志彬
外键约束就是用来保证数据的完整性;
给表取别名让表看起来更加简洁明了。

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

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

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

在两列;

连接方式:
内连接:(隐式内连接: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语句嵌套查询

什么事物:俗称后悔药,

事物的特性(面试):原子性,一致性,隔离性,持久性
回复 使用道具 举报
郑志祥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                :避免脏读,不可重复读,虚读。
回复 使用道具 举报
吴鹏

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

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

表与表的关系(重点)

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

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

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

唯一外键对应的方式:
假设一对一是一个一对多的关系,需要在多的一方创建外键指向一的一方的主键
将外键设置为唯一(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 (可重复读)。



回复 使用道具 举报
叶凌青
今天主要讲了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语句的查询结果
回复 使用道具 举报
邵倩


多表:一条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:32
47#
本帖最后由 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 事务隔离级别;
回复 使用道具 举报
白有旺
多表:以两张表的id字段信息相同作为条件建立两表关联,但在实际开发中不应该这样使用,最好用主外键约束来实现
在实际项目开发过程中经常用到从一个信息较为完善的表中派生出一个只含有几个关键字段的信息表,通过子查询就可以来实现这一目标
Java事务控制是构建J2EE应用不可缺少的一部分,合理选择应用何种事务对整个应用系统来说至关重要。一般说来,在单个JDBC 连接连接的情况下可以选择JDBC事务,
回复 使用道具 举报
123
您需要登录后才可以回帖 登录 | 加入黑马