一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引
一、TCL事务控制语言
###<1>事务的概念
事务是访问并可能更新数据库中各种数据项的执行单元。
事务是一条SQL语句,一组SQL语句,或者整个程序。
事务是恢复和并发控制的基本单位。
事务四个特性:ACID特性,原子性,一致性,隔离性,持续性。
###<2>为什么要使用事务
转账操作:用户A给用户B转账1000元
隐含的条件:扣钱和加钱,要么同时成功,或者同时失败。
事务就是对数据库中的数据的多步操作,并且可以控制数据操作的一致性。对数据的多步操作要么同时成功,或者同时失败。
###<3>事务的特点
1. A(Atomicity)原子性
一个事务的执行被视为不可分割的最小单元。
要么同时成功,或者同时失败。
2. C(consistency)一致性
一个事务的执行不应该破坏数据库的完整性约束。
非法数据的录入,事务会进行撤销操作。
3. I(Isolation)隔离性
通常来说,事务和事务之间不会相互影响。
4. D(Durability)持久性
软硬件崩溃,事务会去自动恢复。(Innodb存储引擎会自动恢复)
###<4>事务的使用
准备:
create table account(
name varchar(20),
money float(6,2)
);
insert account value('张三',22.22);
语法:
set autocommit = true|false; -- 设置事务的提交方式(自动提交和手动提交)
rollback; -- 事务的回滚
commit; -- 事务的提交
savepoint 还原点名称; -- 保存还原点
rollback to 还原点名称; -- 回滚到某个还原点
例如:
set autocommit = false;//设置手动提交
delete from account ;
commit;
insert account value('张三',22.22);
update account set money = money-0.22;
savepoint p1;
update account set money = money-10;
savepoint p2;
update account set money = money-10;
savepoint p3;
delete from account ;
rollback to p2;
###<5>存储引擎
5.1 概念
存储数据用的技术(存储机制,索引技术,锁定水平等等)
5.2 查看存储引擎
show engines;
5.3 常用的存储引擎
MyISAM
相对简单的存储引擎,不支持事务,不支持外键,访问速度快
以查询为主,对数据的完整性要求不严格,推荐使用MyISAM
InnoDB
支持事务,支持外键,行级别锁机制
多重并发更新的操作比较多,推荐使用Innodb
支持auto_increment属性
自动灾难恢复机制,软硬件崩溃
# 二、MySQL中的约束
###<1>约束
约束就是一种限制,通过对表的行和列的数据进行限制,确保数据的完整性和唯一性。
###<2>使用场景
在创建表的时候,创建约束
###<3>分类
1. default,默认约束,指定某列的默认值, 限制此列数据的正确性。(保证数据的域完整性)
2. not null,非空约束,指定某列的值不为空,限制此列数据的正确性。(保证数据的域完整性)
3. unique ,唯一约束,指定某列或者列组合的数据不能重复,保证数据的实体完整性。
4. primary ,主键约束,指定某列或者列组合的数据不能重复并且不能为空,保证数据的实体完整性。
5. foreign key ,外键约束,子表中的一条数据参照主表中的数据,保证数据的参照完整性。
6. check ,检查约束(保证数据的域完整性),MySQL不支持检查约束。
7. unsigned,无符号约束,指定某列的数值为正数,保证数据的域完整性。
### 3.1 default约束
添加约束:
<1>创建表的时候添加
create table t1(
id int default 1,
name varchar(20) default '小明'
);
<2>通过alter...modify/change添加
alter table t1 modify id int default 2;
alter table t1 change name name int default '小李';
删除约束:
通过alter...modify/change
alter table t1 modify id int ;
###3.2 not null 非空约束
添加约束:
<1>创建表的时候添加
create table t1(
id int ,
name varchar(20) not null
);
<2>通过alter...modify/change添加
alter table t1 modify id int not null;
删除约束:
通过alter...modify/change
alter table t1 modify id int ;
###3.3 唯一约束
添加约束:
<1>创建表时添加
create table t2(
id int unique,
name varchar(20)
);
insert t2 value(1,'小明');
insert t2 value(1,'小张');
create table t2(
id int unique,
name varchar(20)
[constraint unique_name] unique(字段1,字段2,...)
);
<2>通过alter...modify/change
alter table t2 modify/change name unique;
alter table t2 ADD [constraint unique_name] unique(字段1,字段2,...);
<3>删除约束
alter table t2 drop index unique_name;
drop index unique_name on table_name;
注意:删除唯一约束时,如果没有给唯一约束起名称,可以使用删除建立了唯一约束的第一个列名。
###3.4 主键约束
<1>创建约束
create table t6(
id int primary key,
name varchar(20)
);
<2>通过alter...modify/change
alter table t6 modify/change id primary key;
alter table t6 add [constraint pk_name] primary key(id,name);
<3>删除约束
alter table t6 drop primary key;
注意:
show create table 表名;查看当前表的约束设置
一张表只能有一个主键
删除主键后,当前列还保存非空约束
删除主键前,保证当前主键列没有设置成自增长。
create table t7(
id int primary key auto_increment,
name varchar(20)
);
###3.5 自增长约束
约束列的数量自动增加,设置到整数类型的列上
通常在主键上设置自增长约束
删除约束:alter...modify/change
create table xxx() auto_increment=初始值;
###3.6 外键约束
#####问题一:为什么要创建多张表?
减少数据的冗余,避免资源的过度浪费
用户订单表:user_order
用户名 密码 地址 联系方式 ..... 订单编号 状态 日期 商品信息...
小明 123 北京 15555225 0001 0 20180101 ...
小明 123 北京 15555225 0002 1 20180108 ...
小明 123 北京 15555225 0003 2 20180104 ...
小明 123 北京 15555225 0004 3 20180101 ...
小明 123 北京 15555225 0005 4 20180104 ...
小明 123 北京 15555225 0006 5 20180101 ...
######解决:拆表
用户表 user (主表)
用户名 密码 地址 联系方式
小明 123 北京 15555225
订单表 order (从表)
订单编号 状态 日期 商品信息... 用户名
0001 0 20180101 ... 小明
0002 1 20180108 ... 小明
0003 2 20180104 ... 小明
0004 3 20180101 ... 小明
0005 4 20180104 ... 小明
0006 5 20180101 ... 小明
######建立关系
建立关系:将主表中能够唯一的字段,添加到从表中。
######添加约束
添加外键约束
<0>准备
create table users(
uid int primary key auto_increment,
uname varchar(20) not null unique,
upwd varchar(20) not null
);
create table orders(
oid int primary key auto_increment,
stat tinyint not null,
date datetime not null,
uid int
);
<1>添加约束
create table orders(
oid int primary key auto_increment,
stat tinyint not null,
date datetime not null,
uid int,
[constraint fk_name] foreign key(uid) references users(uid)
);
通过:alter table orders add [constraint fk_name] foreign key(uid) references users(uid);
<2>删除外键约束
alter table orders drop foreign key fk_name;
如果不知道当前删除的外键的名称,show create table 表名;
#####问题二:表于表之间的关系?
一对一:
一对多:
多对多: 订单表 ---------- 商品表
学生表 ---------- 课程表
关系表
sid cid
需求分析:分析数据表(属性),分析表和表之间的关系
逻辑设计:将需求转换成关系模型ER图
表的设计:
物理设计:
### 外键中的级联关系
1. on delete cascade 删除主表中的数据时,从表中的数据会随之一起删除;
2. on update cascade 更新主表中的数据时,从表中的数据会随之更新
3. on delete set null 删除主表中的数据时,从表中的数据会置空
设置级联删除:
create table orders(
oid int primary key auto_increment,
stat tinyint not null,
date datetime not null,
uid int,
constraint fk_name foreign key(uid) references users(uid) on delete cascade
);
### 3.7 无符号和零填充约束
添加约束:
<1>创建表的时候添加
create table t1(
id int default 1 unsigned , -- 添加无符号约束
name varchar(20) default '小明',
age int(3) zerofill -- 添加零填充约束
);
<2>通过alter...modify/change添加
删除约束:
通过alter...modify/change
# 三、多表查询(重点)
### 1. 分类
<1>联合查询、合并查询 : union /union all
<2>连接查询:
内连接:inner join on
外连接:
左外连接:
右外连接:
交叉连接:
全外连接:
自然连接:natural join on
自连接:
<3>子查询:SQL语句的嵌套
### 2. 合并查询
将两个select语句查询的结果合并在一起。
合并的方式一:union ,去除重复的数据
create table t9(
id int primary key auto_increment,
name varchar(20)
);
create table t10(
num int primary key auto_increment,
name2 varchar(20)
);
insert t9 value(null,'a1');
insert t9 value(null,'a2');
insert t9 value(null,'a3');
insert t10 value(default,'a1');
insert t10 value(default,'a2');
insert t10 value(default,'a4');
select * from t9 union select * from t10;
合并的方式二:union all
select * from t9 union all select * from t10;
注意:被合并的两个结果集中的属性和属性的类型必须一致。
### 3. 连接查询
多个表的数据的乘积。
产生笛卡尔积现象。
给两张表建立关联关系,过滤错误的数据
insert users value(1,'xiaozhang','123');
insert users value(2,'xiaoli','456');
insert users value(3,'xiaowang','789');
insert orders value(1001,1,now(),1);
insert orders value(1002,1,now(),1);
insert orders value(1003,1,now(),3);
insert orders value(1004,1,now(),3);
select * from users,orders; -- 笛卡尔积现象
select * from users,orders where users.uid=orders.uid;
#####3.1 内连接
语法格式:
select u.uid from users u inner join orders o on u.uid=o.uid;
#####3.2 外连接
左外连接:
select u.uid,u.uname,o.oid, o.date from users u left outer join orders as o on u.uid=o.uid;
先查左表,然后查询右表。右表中满足条件的数据项显示,不满足条件的则显示null。
select u.uid,u.uname,o.oid, o.date from orders o left outer join user as u on u.uid=o.uid;
先查左表,然后查询右表。右表中满足条件的数据项显示,不满足条件的则显示null。
右外连接:
select u.uid,u.uname,o.oid, o.date from users u right outer join orders as o on u.uid=o.uid;
先查右表,然后查询左表。左表中满足条件的数据项显示,不满足条件的则显示null;
自然连接:natural ,自动寻找主外键连接等式
select * from users natural join orders ;
select * from users natural left join orders ;
select * from users natural right join orders ;
自连接:自己连接自己
create table employee(
num int primary key ,
name varchar(20) not null,
leadnum int
) ;
insert employee value(1001,'蒙奇D龙');
insert employee value(1003,'伊万科娃',1001);
insert employee value(1004,'暴君熊',1001);
insert employee value(1002,'五老星');
insert employee value(1005,'七武海',1002);
insert employee value(1006,'黄猿',1002);
insert employee value(1007,'赤犬',1002);
insert employee value(1008,'青稚',1002);
需求:打印伊万科娃和其领导的信息
select * from employee e1 ,employee e2 where e1.num=e2.leadnum and e2.name='伊万科娃';
select * from employee e1 ,employee e2 where e1.num=e2.leadnum and e1.name='伊万科娃';
查找伊万科娃的下属
###4. 子查询
select查询语句的嵌套
子查询中的查询语句的位置:
where后面:作为条件
from后面:作为查询的数据表
例如:
查询订单表中价格大于平均订单价格的订单信息
select * from orders where price>avg(price); -- 不可行
第一步:求订单的平均价格
select avg(price) from orders;
第二步:查询
select * from orders where price>(select avg(price) from orders) ;
练习:
1. 查询密码和用户小刘一样的用户信息
2. 查询订单数量大于1的用户信息
# 四、用户的创建和授权
授权语法格式:
GRANT 权限 ON 数据库.数据表 TO 用户名@ip地址 IDENTIFIED BY 密码;
例如:
0. 使用root账号登陆数据库
1. create database testDB;
2. grant all privileges on testDB.* to xiaoming@localhost identified by '123';
flush privileges;
3. grant select ,update on testDB.* to laowang@localhost identified by '123';
4. grant select ,update ,delete ,create ,drop ,alter on *.* to wangayi@'%' identified by '123';
注意:'%'对非本地的主机授权,赋予所有权限可以使用:all privileges
删除用户:
drop user 用户名@"%"
一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引的更多相关文章
- mysql结构相同的三张表查询一条记录\将一张表中的数据插入另外一张表
将一张表中的数据插入另外一张表 1.两张表结构相同 insert into 表1名称 select * from 表2名称 2.两张结构不相同的表 insert into 表1名称(列名1,列名2,列 ...
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
- MYSQL - 外键、约束、多表查询、子查询、视图、事务
MYSQL - 外键.约束.多表查询.子查询.视图.事务 关系 创建成绩表scores,结构如下 id 学生 科目 成绩 思考:学生列应该存什么信息呢? 答:学生列的数据不是在这里新建的,而应该从学生 ...
- 【MySQL】MySQL进阶(外键约束、多表查询、视图、备份与恢复)
约束 外键约束 外键约束概念 让表和表之间产生关系,从而保证数据的准确性! 建表时添加外键约束 为什么要有外键约束 -- 创建db2数据库 CREATE DATABASE db2; -- 使用db2数 ...
- Oracle数据库中SYS、SYSTEM、DBSNMP、SYSMAN四用户的区别
[转] SYS.SYSTEM.DBSNMP. Oracle 数据库中 SYS.SYSTEM.DBSNMP.SYSMAN 四用户的区别 用户: SYS 用户: SYS,默认密码为 CHANGE_ON ...
- 在mybatis框架中,延迟加载与连表查询的差异
1.引子 mybatis的延迟加载,主要应用于一个实体类中有复杂数据类型的属性,包括一对一和一对多的关系(在xml中用collection.association标签标识).这个种属性往往还对应着另一 ...
- oracle学习笔记(四) DQL数据查询语言和TCL 事务控制语言
DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...
- oracle学习笔记(四) DML数据控制语言和TCL 事务控制语言
DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...
随机推荐
- 开始使用Newbe.Pct-Web自动化测试
前篇介绍了,使用 Newbe.Pct 之前的准备工作.本篇将开始介绍如何使用本项目运行第一个测试用例. 阅前语 从本篇开始,读者将会接触到使用一些代码.希望读者不必纠结于语法本身.出现代码的地方都会伴 ...
- golang基础--细说defer
defer 匿名函数特性 执行方式类似其它语言中的析构函数,在函数体执行结束后按照调用顺序的相反顺序逐个执行 //执行顺序相反 package main import "fmt" ...
- javascript实例——鼠标特效篇(包含2个实例)
鼠标是现在电脑的基本配置之一,也是最常用的输入命令的工具之一.本文将将一些与鼠标有关系的特效. 1.跟随鼠标移动的彩色星星 如题,会根据鼠标的移动而移动,并在鼠标周围随机来回移动,让人感觉在放大缩小. ...
- ionic组件清单
整理时间:2017-5-22 官网版本:v3.2.0 / 2017-05-10 / MIT Licensed / Release Notes
- C#将Dll嵌入到EXE
感谢博主的方法: https://blog.csdn.net/lin381825673/article/details/39122257 我之前也看了网上的其他的方法试了都不行 第一种方法就是说用IL ...
- SVN版本控制——SVN 合并的六种方式
合并的工作是把主干或者分支上合并范围内的所有改动列出,并对比当前工作副本的内容,由合并者手工修改冲突,然后提交到服务器的相应目录里.如果当前工作副本是主干,则合并的范围是分支上的改动,如果工作副本是分 ...
- Nginx面试
声明:此文章非本人所 原创,是别人分享所得,如有知道原作者是谁可以联系本人,如有转载请加上此段话 1.请解释一下什么是 Nginx? Nginx是一个 web服务器和反向代理服务器,用于 HTTP.H ...
- hdu 1023 卡特兰数《 大数》java
Train Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- C Traps:运算
位移 如果sizeof(int) = 4,那么下面的代码的结果是什么? int x=255; printf("%d", x>>34); 实际输出:63 在编译这个代码时 ...
- elastic job will never fire
1. 描述 2018-08-20 18:11:01.912 [Thread-8] INFO org.quartz.impl.StdSchedulerFactory - Using default i ...