MySQL基本概念及高级应用
定义
储存数据的仓库,高效的储存和处理数据的介质(硬盘,内存)
分类
储存数据的大小分类(了解)
巨型数据库: DB2 IBM
大型数据库: Oracle oracle
中型数据库: mysql sqlServer miscsoft
小型数据库: access micsoft
根据数据库的模型分类:
1 关系型数据库
关系型数据库,是一种建立在关系模型上的数据库
关系模型:
1.1 数据结构:值由行和列组成的二维表结构
1.2 SQL指令:structured(结构化) Query(查询)
L(language)语言,对数据库或者数据进行操作(增删改查)
1.3 完整性约束:非空约束,唯一约束…..用来保证数据的完整性
2 非关系型数据库:
采用键值对的方式存储
常见非关系型数据库:redis mongodb memercached
关系型与非关系型的区别:
1.结构不同
2.关系型数据库存储在硬盘,非关系型数据库存储在内存中
3.非关系型数据库效率高,查询速度快,常用来做缓存
SQL指令:
Structured query language 结构化查询语言
对所有关系型数据库都可以进行操作mysql(开源,免费)
名词解释:
数据库:DataBase
数据库的组成:Database + DatabaseManageSystem DB+DBS
数据库管理员:DBA DataBase Admin
DDL : Data Definition language 数据库定义语言(主要针对数据 库的创建,删除,修改,表的创建,删除,修改),常见指令:create(创 建)drop(删除) alter(修改)
DML : Data Manipulation language 数据操作语言(主要针对表的数据进 行操作,表里面的数据新增insert、删除delete、修改update)
DQL : Data Query Language 数据查询语言(针对表里面的数据进行查询操 作)
Select from where
DCL : Data control 数据控制语言(针对用户权限进行修改的操作 grant revoke)
Mysql介绍
Mysql是一个C(lient)/S(server)端软件:
1.启动服务端 net Start mysql56(安装时已经执行)
2.先与服务端建立连接,用到用户名和密码:
mysql -uroot -p
3.发送sql指令到mysql系统,mysql根据sql指令进行操作,返回一个结果集, 显示在客户端
4.退出,关闭连接,释放资源,quit/exit
停止mysql服务:net stop mysql56
DDL
数据定义语言(不区分大小写,不区分单引号和双引号)
创建数据库
create database 数据库名 [库选项]
库选项:
字符编码集: charset utf8
校对集(了解):collate
校对集有三种模式:
mysql支持哪些校对集:show collation
_bin:binary 二进制,按位比较,严格区分大小写
_ci:对大小写不敏感,不区分大小写,默认校对集
_cs:对大小写敏感:严格区分大小写
查看数据库
show databases;##查看所有数据库
//模糊查询 占位符 %
show databases like ‘%26’; ##’%a%’字母a的数据库名
//模糊查询 占位符 _
show databases like ‘_a’;找以a结尾并且名字长度只有两个的数据库,_表示只占一个字符
查看数据库的创建语句:
show create database 数据库名;
修改
1.数据库名不能修改
2.修改字符编码集
alter database 数据库名 charset 编码集;
删除数据库(慎用)
drop database 数据库名;
在数据库里面新建表:对表进行操作:
注释: –注释内容
#注释内容
使用数据库:
use 数据库名;
创建表
create table [if not exists] 表名(
字段名1 字段类型 [约束],
字段名2 字段类型 [约束]
……
)[engine = innodb] charset utf8;
数据库的存储:
innodb:支持事务(常用,默认存储)
mysiam:不支持事务/支持全文索引
查看表
查看所有表:show tables;
模糊查询:show tables like ‘%t’;–%占位符
模糊查询:show tables like ‘_t’;
查看表的创建语句
show create table 表名;
修改表
修改表名:
rename table 表名 to 新表名;
增加字段:
alter table 表名 add 字段名 数据类型 [约束]
修改字段:
alter table 表名 modify 字段名 数据类型 [约束]
删除字段:
alter table 表名 drop 字段名;
修改字段名:
alter table 表名 change 旧字段名 新字段名 数据类型;
查看表结构
desc 表名;
删除表(慎用)
drop table 表名1,表名2,表名3….;
DML
三个主要关键字: insert delete update
新增数据
insert into 表名 values(数据1,数据2,…);
数据1,数据2…是一张表中一行的所有数据,如果不是全部会报错
insert into表名(字段名1,字段名…..) values(数据1,数据2…)
注意:可以使用default表示使用默认值
查看数据:(查询)
Select 字段1,字段….* from 表名;
*代表所有字段
修改数据
Update 表名 set 字段名 = 新数据 where 条件;
更新数据时,常常需要跟where条件,如果没有条件,表示该
字段所有数据都更新;
删除数据
Delete from 表名where 条件;
删除时常常跟where条件,如果不跟条件,就会清空整个表数据;
数据类型
为了方便对数据的统一管理,规定了数据类型
SQL:三种数据类型 数字型 字符串类型 时间日期类型
java: byte(1字节) short(2字节) int(4字节) long(8字节)
数字型(number):
整数型:
tinyint(迷你整型):占一个字节,-128 +127,无符号(全为正,从0开始)0-255
smallint(小整形):占2个字节
mediumint(中整形):占3个字节
int(整形):占4个字节
bigint(大整形):占8个字节
注意:如果要使用无符号位数据,在数据类型后面添加约束(无符号位约束 unsingned);
小数型
浮点小数
单精度浮点数:float 占4个字节
双精度浮点数:double 占8个字节
float(M,D):M表示数据的总长度,D表示小数的位数整数的位数(M D)
对于float和double来说,都存在精度损失,float的将有效位数 在7位左右,double在15位左右,常常很少用;默认M为10;整数 部分长度超过范围不能存入小数,小数超过范围会四舍五入;
精确小数
(decimal);decimal(M,D)
M的最大值为65,D的最大值30,小数位支持30位
时间日期类型
DateTime: yyyy.MM.dd HH:mm:ss
Date: yyyy.MM:dd
Time: HH:mm:ss
Timestamp(时间戳): yyyy:MM:dd HH:mm:ss
Year(年):最大支持2150
注意:如果当前行的数据被修改,那么时间戳会记录当前的修改时间(时间戳 字段会自动改变成当前的修改时间).
字符串类型:
char(L):L表示所能存储的最大字符个数 定长
varchar(L):表示所能粗存储的最大字符个数 变长
varchar:在初始分配容量的时候,根据给定的的长度分配,但是具体占多少空 间,由最终存入的数据来确定.
定长:效率高,占用磁盘空间大,浪费空间
变长:效率低,节省磁盘空间
如何来选择 char/varchar?
如果基本确定该字段的长度,如L手机号,身份证号,采用char
如果长度不确定的时候,采用varchar,地址...姓名
L的最大值?
char(L):L的最大值是255,在Mysql中规定,一条记录的最大存储字节 个数为65535
使用varchar的时候,会额外占用1-2个字节来存储具体存储数据长度
数据的长度:还需要一个字节来存储null;
在实际开发过程中,如果字符长度超过255,不采用varchar,使用 text,blob;
blob,text,set,enum(这些是扩展的类型,自看书)
约束
光靠我们数据类型来约束字段约束很单一,sql 引入了其他约束
Null/not null
primary key(主键)
unique key(唯一键)
default(默认值)
comment( 描述)
auto_ increment( 自增长)
set(检查约束)
1 | 例: |
索引
系统根据某种状况,将当前字段的数据(或者是未来可能新增的数据)单独建立 一个文件
该文件的内容可以快速匹配要查询的数据(表中的记录),就像书的目录.
作用:增加查询效率
常见的索引
主键索引:primary key ,在新增主键的时候,会同时增加主键的索引文件
唯一键索引:unique key,在新增唯一键的时候,会增加唯一键索引文件
普通索引:index
增加普通索引:alter table 表名 add index(字段名);
全文索引:mysql不支持,英文,中文
表与表之间的关系
一对一关系:
在表A中的一条记录对应表B中的唯一一条记录
一对多(多对一):
在表A中的一条记录,在表B中可以找到一条或者多条记录
与之相匹配,同时,在表B中的每一条记录,都只能在表
A中找到唯一的一条记录与之匹配,那么我们就说这种关系
是一个一对多的关系.
多对多的关系:
表A中的记录在表B中有多条记录与之相匹配,同时,在表B中的一条
记录,与表A中的多条记录相匹配,表A和表B构成多对多的关系.
如何表A和表B的关系?
借助中间表,在中间表中分别存储表A的主键和表B的主键
例:学生和老师的关系.
DQL:
介绍
Data Query Language数据查询语言
简单查询: select * from表名
完整查询语句:
Select[select选项]字段1,字段2…/* from 数据源
[where子句]
[group by子句]
[having子句]
[orderby子句]
[limit子句]
Select 选项:
包含两:如果不写,默认值为ALL
ALL:查询出来的数据全部保留
Distinct(去重):去掉重复的数据,只针对查询出来的结果内容完全一样才能 进行去重
数据源
单表数据源:表名
多表数据源:
查询出来的结果(子查询):
where子句
用来对查询结果进行筛选,
比较运算符:> >= =(等于) < <= != like between A and B 在A和B之间(包 含A和B) in 在什么里面
逻辑运算符(多个条件之间的连): and(与),or(或),非(not)!
判断不为空:is not null
判断为空:is null
in子句: in/not in
原理
where是查询语句中唯一一个从磁盘取出数据,并进行一条一条的比对,如果满 足条件,则将该条数据放进内存,不符合条件则舍去;
Group by
分组 按照某一个字段将数据进行分组
分组的目的:统计数据信息 (每组有多少人)…
如何统计?
多字段分组
group by 字段1,字段2,先按照字段1进行分组后,在分组后字段2再进行分组
使用group by之后会默认按照升序排列
聚合函数
1.找
最大值 max(字段)
最小值 min(字段)
平均值 avg(字段)
统计总数 count(字段),求
总和 sum(字段)
count([distinct] 字段):如果加上distinct,会对字段进行去重
Having子句
对分组后的统计结果进行筛选,having后常常跟聚合函数
Oder by 子句
排序 后面跟字段,默认为升序排序,升序排列为asc
asc可以省略,如果想按照降序排列,在排列的字段
后面加上desc;也可以多字段排序.
Limit子句
用来限制数据显示的条数,后面跟的int的数据
数据:
Limit 数字1;表示数据显示的条数;
Limit 数字1,数字2;数字1表示从第(数字1+1)条
数据开始,显示 数字2 条数据;
作用?用来做分页查询:
当前页码 为 nowpage,每条显示50条数据;
当前为1的时候,limit 0,50;
当前为2的时候,limit 50,50;
当前为3的时候,limit 100,50;
(当前页码-1)*50,50
取别名
字段 [as] 别名
多表数据源
连接查询:将多张表的记录进行连接(按照某一种条件进行连接,
连接后的数据可能会大于当前的数据)
什么时候用?用户查看的数据来自多张表的时候使用
连接查询分为4种:
交叉连接、内连接、外连接、自然连接
交叉连接(cross join)
基本语法结构: from 左表 cross join 右表
from 左表,右表
交叉连接:用左表中的每一条数据都会与右表中
的每一条数据进行匹配,并且会保留所有结果,产生笛卡尔积(交叉查询没用)
千万不要用!!!!!!!!!!!
内连接(inner join)
基本语法:from 左表 [inner] join 右表 on 连接条件
基本语法: from 左表 [inner] join 右表 on 连接条件
内连接:
用左表中的每一条数据与右表中的数据根据连接,条件进行匹配,如果匹 配的结果在左表和右表中相同就保留该条记录,否则直接舍去;
外连接(outter join)
左外连接 : left [outter] join
基本语法结构:from 左表 left join 右表 on 连接条件
用左表的每一条数据,与右表中的每一条数据根据连接条件进行匹 配,如果匹配的结果在左表中存在,则保留,右表没有的数据则 置空
右外连接 : right [outter] join
基本语法结构: from左表right join 右表on连接条件
用左表的每一条数据与右表中的每一条数据根据连接条件进行匹配, 如匹配的结果在右表中存在则保留,左表没有的数据则置空;
左外链接和右外链接可以互相转换,如果有多张表:可以继续在后面跟连接(左 外,右外,内连接)
From 第一张表 join 第二张表 on 连接条件 join 第三张表 on 连接条件;
自然连接(nature join)
系统根据相同的字段名自动进行连接;
基本语法结构: from 左表 nature[left/right] join 右表
子查询(sub query)
一条select 语句里面包含了另外一条select语句;
按照select出现的位置来分:
From子句后面: from (select语句);
Where 子查询: where 条件(select 语句)
Exists(存在):Exists (select 语句):
注意:in 和not in比较重要
根据select 查询的结果来分:
标量子查询:子查询的结果是一个一行一列
列子查询:子查询返回的结果是一列多行
行子查询:子查询返回的结果是一行多列
以上三个都跟在where后面
表子查询:子查询返回的结果是多行多列
表子查询
返回的结果是一个二维表(多行多列),跟在from后面
注意:使用表子查询的时候需要给查询出来的表取别名
Exists(存在)子查询:跟在where后面,exist是对后面的语句进行
某一条件判断,如果该子查询有数据,就返回1,否则返回0
1 | 例: |
外键
外面的键(键不在自己表中,如果一个表的一个字段(主键除外)是其他表的主键
,那么这个件叫外键(foreign key))
设置外键:
在创建表之后设置外键
Alter table 表名 add foreign key(外键字段) references 父表(主键字段)
父表
把这个作为主键的表作为父表
子表
拥有外键的表叫做子表
添加的前提:子表中存在的数据必须保证在父表中存在才能添加成功
外键的作用:
对子表的约束:子表中新插入的数据必须在父表中存在记录才能进行插入
对父表的约束:如父表中的数据被子表引用,那么父表不能进行更新和删除
外键的约束:
restrict:严格模式,如果父表中的数据被子表引用,那么
将不允许修改和删除(默认);
Cascade(级联):级联模式,如果父表中的数据被子表引用,
父表中的数据删除,子表中的数据也会被删除,父表中的
数据更新,子表也会更新;在更新时使用;
set NULL:置空模式,如果附表中的数据被子表所引用,父表中的数据删除,子 表的记录会设置为null,父表中的数据更新,子表也会设置为null;
常用方式:在更新时使用级联模式,在删除时,使用setNULL模式,如下所示.
1 | alter table stu add FOREIGN key (C_id) REFERENCES cla (id) ON delete set null ON update cascade ;//删除时置空,更新时级联 |
视图(view)
是一个有结构但是没有结果(表中没有数据)的虚拟表
创建视图
Create view 视图名 as select 语句
create view my_ view as select stu.id, name, number, sex, age, height, cname , room from stu join cla on stu.c_ id = cla.id;
注意:
select 语句里面必须明确字段,不能使用 * ;
查看视图
show tables;
show create view 视图名;
使用视图:
当普通表一样使用,但是视图只用于查询,在视图中不要进行删除和修改;
视图作用:
1.可以使用SQL语句,方便查询
2.可以针对不同的客户,定制不同需求的表格
3.可以保证数据的安全
视图修改
alter view 视图名 as select 新的语句
alter view my_view as SELECT product.name
from product
视图的删除
drop view 视图名;
蠕虫复制
从现有的数据中去获得数据,并进行新增操作
表创建的高级操作:
1.复制表结构:
create table 自定义表名 like 需要复制的数据库名.表名
2.复制数据
insert into 表名(字段) select 字段/* from 表名
例:
insert into 829test.user_copy
select * from 829test.user
作用:
1.用来做测试(压力测试)
2.可以让表中的数据迅速的膨胀到一定的数量级
1 | 例子: |
变量
系统变量:系统已经定义好的变量
查看系统变量:
show variables;
查看某一个系统变量
select @@变量名;
更改系统变量:
Set @@变量名 = 值;
自定义变量:
Set @变量名 = 初始值;
查看变量:
select @变量名;
修改变量:
Set @变量名 = 新的值;
分支:
if 条件判断 then
执行的语句
end if;
循环:
while 条件判断 do
循环体;
end while;
iterator = continue;
leave = break;
事务
一系列将要连发生的操作
使用:
1.开启事务: start transaction;
2.进行事务的操作:
2.1.张三的账户 -500
2.2.李四的账户 +500
3.提交事务
3.1.commit;如果事务操作没有出现异常,则将事务
进行的操作更新到数据库
3.2.rollback;回滚,回到事务操作前的状态;
作用:
保证数据的一致性
原理:
事务的操作会先保存到事务操作日志里面,如果提交事务的时候,使用的commit, 则将日志里面的记录永久的更新到数据库,如果提交事务的时候使用 rollback,则删除当前事务的操作日志;
√事务的四大特性:ACID
原子性(Atomic):事务的操作应该看成一个不可分割的整体,进行
事务操作的时候,要么一起成功,要么一起失败
一致性(consistency):事务操作的前后,要保持数据的一致性;
隔离性(isolation):多个事务之间是相互隔离,互不干扰;
持久性(durability):事务一旦提交,将永久修改,不能改变;
事务的隔离级别
读未提交(read uncommitted),读已提交(read committed)
可重复读(repeatabel read ),串行化读(serializable);
mysql的隔离级别为可重复读:
查看mysql的隔离级别: select @@tx_isolation;
修改mysql的隔离级别:
只针对会话级别的修改,当次连有效
set session transaction isolation level 隔离级别
读未提交会产生数据的脏读(读出来的数据没有什么用);
读已提交只能提取事务中已经提交的数据,不可重复读,两读取到的
数据不一样
幻读:一个事务在进行读取操作,另外一个事务对其进行修改或者
插入操作,会造成两的数据不一致性;
串行化读,效率极低,一般不使用(默认隔离级别 为 可重复读)
触发器(trigger)
事先为某张表绑定逻辑处理代码,在达到某种触发条件的时候,
执行这段代码;
1 | 创建触发器: |
SQL函数
系统函数(聚合函数)
length() 求的字节长度
substring() 求字符串长度
substring() 截取
调用函数:
select 函数名(实际参数);
函数必须有返回值!
创建函数:
create function 函数名(参数列表) returns 返回值类型
begin
函数体;
return 值;
end
参数列表:变量1 数据类型,变量名2 数据类型
调用函数:select 函数名(实参);
删除函数:drop function 函数名;
Set@变量名 是一个全局变量
局部变量:
Declare 变量名 数据类型;
Declare 变量名 数据类型 default 默认值;
1 | #例如下所示: |
过程
procedure 储存过程,简称过程,他是用来对数据进行处理的一种方式,可以理解 成没有返回值的函数;
创建过程:
create procedure 过程名(参数列表)
begin
执行体;
end
删除过程:
drop procedure 过程名;
调用过程:
call 过程名(实参);
过程虽然没有返回值,但是有参数,参数的数据类型,比函数更加严格,除了SQL里 面提供的数据类型以外,还额外规定了只供过程使用的三种数据类型.
in:由过程外面传递到里面使用,相当于java中的值传递;
out:由过程外面传递到过程里面使用,但是在过程里面使用时,会先将原来 的数据清空,类似于java的引用传递;
inout:由过程外面传递到过程里面使用,过程里面进行改变,外面的值也会改 变,典型的引用传递;
参数列表: 过程数据类型 变量名 数据类型
in 数据类型可以传递值,也可以传递变量;
out/inout 只能传递变量,不能传递值;
过程里面的全局变量的修改是滞后的(在过程结束前进行修改)
返回int类型的随机数 floor(rand()*100)
1 | #例如下所示 |
注:过程里面的全局变量的修改是滞后的(在过程结束前进行修改)
游标
作用:
游动的标识,是SQL中对数据进行处理的一种方法,用来的对查询出来的结 果集进行一条一条的取出数据进行操作;类似于Java中的集合,一条一 条的取出数据就想相当于对集合进行遍历;
声明游标:
declare 游标名 cursor for select 语句;
注:(不能使用select *,必须写明具体的字段)
使用游标
打开游标 : open 游标名;
取出数据 : fetch 游标名 into var1,var2,var3…..;
关闭游标 : close 游标名;
具体使用如下所示:
1 | create procedure my_cursor() |
查询结果赋变量
set @变量名 = (select 语句);
:= 在SQL中表示赋值
select @变量名 :=字段 from……
select 字段 into @变量名 from …..
select 字段 from ……. into @变量名
三大范式
范式(Normal format):离散数学里面的一种范式;
终极目的:是为了更好的存储数据,凡是能通过关系查出来的数据,绝对不再重复储存
六大范式:要满足第二层范式,必须先满足第一范式,要满足后面一层的范式,就必须满足前面的范式,一层比一层严格,对于数据库来说,除了保证数据的不重复存储之外,还应该保证查询效率,综合考虑,数据块只需要满足前三种范式即可;
1.列的原子性:数据在取出来使用时,不需要再进行二次拆分
2.行的唯一性:每张表都应该有主键用来进行区分每一行的内容
3.表中的每一个字段都必须与主键直接相关而非间接相关