数据库增删改查梳理
约束条件 作用: 保证数据的完整性和一致性
PRIMARY KEY (PK) 主键 >>>>(唯一且不能为空)
FOREIGN KEY (FK) 外键
UNIQUE KEY (UK) 唯一键
NOT NULL 设置字段不能为空 默认的字段可以为空
AUTO_INCREMENT 字段的值自动增长(要求:int 且为主键)
DEFAULT 设置默认值
UNSIGNED 无符号(数据不能为负)
ZEROFILL 使用0填充
常见例子
create table panzhenwei (id int primary key auto_increment ,name char(4),sex enum('male','female') not null default 'male' ,age int unsigned)
定义主键
新表定义主键
1.使用not null +unique
2.直接在字段后添加primary key
3.在最后单独定义
create table panzhenwei (id int constraint 键的名称 primary key(字段名...) )
添加主键
alter table 表名 add primary key(字段)
alter talbe 表名 modify 字段 数据类型 primary key
定义外键
外键使用要注意的几个点;
1.两张表都必须是InnoDB表 (show create table 表名)
2.对应列必须具有相似的内部数据类型。
3.建立外键关系的对应列必须建立了索引(eg: primary key)
简单的说就是创建外键的时候的数据类型要与主键的数据类型保持一致
首先设置被关联表,在设置关联表 ,然后在关联表上指定被通过某一与被关联表上的相同项进行关联
1.新表定义外键,都是在最后添加
create table 表1(字段1 数据类型 ,dep_id int ,
foreign key(dep_id) references dep(id))
create table 表1(字段1 数据类型 ,dep_id int ,
constranint panhzenwei_pk foreign key(dep_id) references dep(id))
这条指令中本表的的dep_id 的项关联dep表中的id的项
dep 的id项必须是主键
并且在插入数据的时候,先插如被关联表的数据在插入关联表的数据
在删除数据的时候,如果被关联表的某些数据被关联之后,是不能做出删除或更改的操作的,只能在关联的表上进行操作
要先将关联数据删除,才能删除被关联的表的数据。
数据库的增删改查
增
create database panzhenwei charset utf8
删
drop database panzhenwei
改
alter database panzhenwei charset utf8; 只能更改数据库的编码方式
查
show create database panzhenwei 查看创建的数据库的编码类型
setect database() 查看当前使用的数据库
use panzhenwei 切换到使用的数据库
表的创建
create table 表名(字段名 数据类型[宽度] [约束条件]);所谓的约束条件是设置唯一键,主键或者是外键
增
将查询的内容添加到一张新的表中(只能复制表的结构和内容,不会复制表的 约束条件)
create table 新表 select * from 要复制的表
如果只是想要复制表的结构但是不需要表的内容(只需要将查询到内容为空复制到新的表中就可以了)
create table 新表 select * from 要复制的表 where 1=2;
或者
create table 新表 like 要复制的表 (使用这个可以将表的主键也复制来)
删
alter table 表名 drop 字段名
alter table 表名 drop 约束条件
drop table 表名
改
alter table 表名 rename 新的表名
alter table 表名 panzhenwei engine = innodb 修改表的存储引擎
alter table 表名 add 字段名 数据类型 [约束条件]
alter table 表名 add 字段名 数据类型 after 字段2 ;表示的是在字段2的后面添加一个新的字段
添加字段的位置默认是直接添加到所有字段的后面,可以通过使用before/after 设置在某个字段的前后面,直接使用first 将添加的字段添加到最前面的位置
一般用于更改数据类型,如果存在主键的话,可以通过modify 添加自增 auto_increment
alter table 表名 modify 字段名 数据类型 [约束条件] #修改字段的数据类型 可以通过这种方式添加主键等,但是不能通过这种方式对键进行删除
更改字段名,同时也可以更改数据类型
alter table 表名 change 旧字段名 新字段名 数据类型(新字段的数据类型) [约束条件]
查
show tables 查看存在的表
show create table panzhenwei 查看创建表的语句和表的类型>>> 可以使用\G 在显示内容的时候竖行显示结果
desc panzhenwei 查看表的结构
行记录(数据的增删改查)
增 insert into
insert into 表名 vaules(1,'panzhenwei',25) 按照字段的顺序插入数据
insert into 表名(字段名) values(插入对应字段的值) 按照指定的字段插入数据,如果剩余的字段如果有设置了自增的功能的话,就会按照自增自行添加数据
如果没有设置自增,默认设置对应字段的值为null ,如果字段设置了不能为null 的话,就会报错
如果想要一次性插入多条内容的话,内容之间通过逗号进行分隔
将查询出来的内容添加到已经存在的表中
insert into 表名(字段1,字段2...) select 字段1,字段2.... from 表2 ;后面还可以添加条件
删 delete from
delete from 表名 where 条件 删除表中符合条件的数据 (即使是清空数据id也不会从0开始)
trunkcate 表名 直接清空表的数据 >>>> id也重新从0开始添加
改:update
update 表名 set 字段1=新值,字段2 where 条件 对符合条件的行的某个字段的值进行更改
查
单表查询的基本结构
select distinct 字段名 .... from 表名 where 条件 group by 字段 having 筛选(函数条件) order by 字段1.. ase limit 显示的条数
各个关键字执行的优先顺序
from >where > group by > having > select > distinct >order by > limit
如果没有使用group by 则整体作为一组
having 的作用是将分组的结果筛选
order by 将选择的结果按照字段升序(asc)或者是倒序(desc)进行排序,
limit 显示的起始位置 包括起始位置在内显示多少条
多表查询
select 字段 from 表1 inner /left/right join 表2 on 表1.字段 = 表2.字段
使用inner join与join 的结果是一样的
所谓的左连接/右连接指的是以哪边的字段为优先,如果进行的是左连接,就是
按照左边的数据为优先,通过某个字段关联起来之后,如果右边在左边的数据中
没有对应的项的话,就使用null
全外连接(my sql中使用左连接和右连接进行合并)
selec * from 表1 left join 表2 on 表1.字段 = 表2.字段
union
selec * from 表1 right join 表2 on 表1.字段 = 表2.字段
使用union 与all_union 的区别是union 会去除相同的记录
子查询
将一个查询的结果作为另一个查询的查询条件
子查询中可以包含:in/not in /any /all /exists 和no exists 等关键字
还可以包含比较运算符= != > <
视图增删改查
根据SQL语句获取动态的数据集,并为其命名 # CREATE VIEW 视图名称 AS sql 查询语句 # create view t1 as select * from teacher; # 创建的视图有自己的表结构,并且如果对视图的数据进行更改的话,相当于更改本生的表的数据 #更改视图 # 语法:ALTER VIEW 视图名称 AS 查询语句 相当于删掉重建一样 # 删除视图 # 语法:DROP VIEW 视图名称 # DROP VIEW teacher_view
查看视图的内容的数据的时候,使用select 语句像正常的表一样进行查询
使用show create table 视图的名称 一样可以查看视图建立的的SQL语句
索引原理与优化
索引的目的>>>> 提高查询的效率
目的是通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,
同时把随机的事件变成顺序的事件
建立索引的时候要注意的问题
1.索引字段要尽量的小(注意为什么,目的是什么)
2.索引的最左匹配特性(按照表字段从左往右建立搜索树,
搜索的时候按照从左往右,由左边的一个字段确定下一步的搜索方向)
聚集索引与辅助索引
两者相同的是都是通过B+树构建的(二叉树查找)搜索树
叶子节点是否存放一整行的信息
InnoDB存储引擎表示索引组织表,即表中数据按照主键顺序存放。
而聚集索引(clustered index)
就是按照每张表的主键构造一棵B+树
聚集索引中的叶子节点包含整行的信息,
子节点的数据就是用户所要查询的数据
辅助索引的叶子节点不包含行记录的全部数据
叶子节点除了包含键值以外,还包含一个书签,记录在哪里可以找到与索引对应的
整行信息
建立的索引有
普通索引
index
唯一索引
primary key
unique
联合索引(上面的三个索引方式应用在多个字段中)
index(id name)
primary key (id name )
unique(id name )
创建索引的几种方式
1.新表很创建索引
create table 表名(字段 数据类型 primary key )>>>>聚集索引
create table 表名(字段 数据类型 index/unique 索引名称 (建立索引的字段名))>>>> 辅助索引
2.存在的表添加索引
2.通过修改的方式添加
alter table 表名 add primary key
alter table 表名 modify 字段 数据类型 primary key >>>>聚集索引
alter table 表名 add unique/index 索引名称 (建立索引的字段名)
通过修改的方式进行删除
alter table 表名 drop index 索引名称
建立和删除索引的的特色方法
1.直接创建
create table index/unique 索引名称 on 表名 (建立索引的字段名)
2.直接删除索引
drop index 索引名称 on 表名;
查看索引
show index from 表名
show keys from 表名
事务的四大特性
原子性,一致性,隔离型,持久性
strat transaction; 开启事务
操作
commit 确认,写入到本地,不可还原
存储过程
delimiter // 更改原来的分隔符
create procedure 名称(参数)
begin
通过存储过程执行的SQL语句;
end // 结果存储过程
delimiter ; 将分隔符还原为原来的符号
参数的意义与使用
#in 仅用于传入参数用 #out 仅用于返回值用,就是从储存过程里面传递值出来,而没有传递值进去
inout 是上面两种的合并
call p1() 没有使用参数的时候的调用方式
create procedure p2(in g1 int ,out g2 int) 有参数
# set @g2 = 0;# 有out/inout类型的数据才会进行声明 # call p2(2,@g2) # select @res; #查看返回的值
调用
授权表
user表 可以设置所有的库,库下所有的表,表下所有的进行权限的 设置
db 表 对某一数据库中的所有的表和所有的字段进行权限的设置
tables_priv 对一张表和该表的所有字段进行权限的设置
columns_prive 只能对一张表的某一字段进行权限的设置
创建用户的格式
grant 权限 on 数据库.* to 用户名@登录主机 identified by “密码”
例如增加一个用户,增加一个test1用户,密码为123456,
可以在任何主机上登录,并对所有数据库有查询,增加,修改和删除的功能
grant select,insert,update,delete on *.* to test1@”%” identified by “123456″;
增加一个test2用户,密码为123456,只能在192.168.2.12上登录,
并对数据库student有查询,增加,修改和删除的功能
grant select,insert update,delete on student.* to test2#192.168.2.12 identified by “123456″
flush privileges; 对权限进行刷新
放开所有的权限 grant all privileges on ......
修改用户密码
update mysql.user set password=password(’123456′) where User=’test1′ and Host=’localhost’;
删除用户
delete from user where user=’test2′ and host=’localhost
删除用户及权限
drop user 用户名@’%’
show grants 常用当前用户的权限