目录
常用概念
mysql是一种关系型数据库
数据库是什么?
本质上就是一种文件系统,它保存了一组有组织的数据
数据库管理系统(DBMS)
一种操纵和管理数据库的大型软件,用于建立、维护、使用数据库,对数据库进行统一管理和控制
结构化查询语言
专门用来与数据库通信的语言
DDL
DBMS提供数据定义语言,定义数据的模式、外模式和内模式,定义模式、内模式和外模式、模式二级映像,定义有关的约束条件,例如create、drop、alter等用来建立、删除、修改数据库的语言
DML
数据库操纵语言,实现对数据库的基本操作,包括检索、更新、等,DML包含两类,一类是自主型,这一类属于交互式命令语言,另一类是宿主型的,对数据库的存取语句嵌入在高级语言中,不能单独使用
数据库的三级模式结构
美国标准学会将数据库系统内部的体系结构从逻辑上分为如下:
层次模型
最早的数据模型,用树型结构表示实体间的关系,只能表示一对多
网状模型
用有向图表示实体间的关系,可以表示多对多
关系的形式化定义及其相关概念
域
域是一种具有相同数据类型的值的集合
笛卡尔积
给定一组域(他们可以包含相同的元素,也可以不同)
关系
笛卡尔积D1*D2*D3的任一子集称为定义在域D1*D2*D3的n元关系
元组
表中的一列即为一个属性,给每一个属性起一个名称和属性名
主码
表中的某个属性组,他可以唯一确定一个元组,也就是主键
关系模型
对关系的描述
数据库常用数据类型
char 定长字符串
varchar 不定长字符串
Date YYYY-MM-DD 日期值
DDL常用
查看所有数据库 show databases;
查看当前数据库 show database(); 注意括号
创建数据库 create database [if not exists] mydb1;
选择数据库 use mydb1;
查看当前数据库的所有表 show tables;
删除数据库 drop database 数据库名;
删除当前数据库中的表 drop table 表名;
查看表结构 desc 表名;
查询指定代表创建表语句 show create table 表名;
修改数据库编码 alter database 数据库名 character set utf8;
创建表
create table table_name(
字段1 数据类型 [约束条件][comment 注释],
字段2 数据类型 [约束条件][comment 注释]);
利用子查询来创建表
CREATE TABLE table_name
SELECT 语句;
删除表
DROP TABLE [IF EXISTS] table_name;
删除指定表,并重新创建该表
truncate 会直接清空表数据,但会保留表和索引等结构,而且不可回滚
TRUNCATE TABLE table_name;
修改表
修改表名
ALTER TABLE old_table_name RENAME [TO] new_table_name;
或 RENAME TABLE old_table_name TO new_table_name [ ,........];
增加字段
在表的最后一个位置增加字段
ALTER TABLE table_name ADD 字段名 字段类型;
在表的第一个位置增加字段
ALTER TABLE table_name ADD 字段名 字段类型 FIRST;
在表的指定字段之后增加字段
ALTER TABLE table_name ADD 字段名 字段类型 AFTER 字段名2;
修改表字段
修改列属性
alter column 列名 类型
删除字段
ALTER TABLE table_name DROP 字段名;
修改字段
修改字段数据类型
ALTER TABLE table_name MODIFY 字段名 数据类型;
修改字段名
ALTER TABLE table_name CAHNGE 旧字段名 新字段名 旧数据类型;
同时修改字段名与数据类型
ALTER TABLE table_name CAHNGE 旧字段名 新字段名 新数据类型;
修改字段的顺序
ALTER TABLE table_name MODIFY 字段名 数据类型 FIRST | AFTER 字段名2;
FIRST 表示将字段调整到表第一个位置
AFTER 字段名2 表示将字段调整到字段2之后
约束添加
空值约束添加
alter table 表名
add constraint 约束名 default ... for 列名
其他约束添加
alter table 表名
add constraint 约束名 关键字 列名
DDL常用表示
select、insert、delete、update
查看前几条记录
select top n * from 表名 前n条记录
select top n percent * from 表名 前n%条记录
起别名
select name as '名字' , age as '年龄' from user_table
contract 组合
删除数据右侧多余的空格且使用contract拼接用户的名字和城市
使用MySQL的RTrim() 函数来完成
SELECT CONCAT(RTRIM(user_name), ' (',RTRIM(user_country), ')')
FROM vendors
ORDER BY vend_name;
+组合列
select sno +'(' +sn+')' from 表名
year函数
显示每名同学 的年龄 YEAR(Date())- YEAR(birthday)
关键字 distinct 去重复值
LEFT(str,len) 和RIGHT(str,len)
SELECT RIGHT( certificates_no,2) FROM user
特殊运算符
between ... and ... 指定值的范围 ,筛选的必须是数字,小的在前面,大的在后边
in 允许指定一组值
like 模糊查询 _单个字符、%代表零到多个
[]一个字符的取值范围
[^ ] 不在某个范围或集合内的任意指定字符
排序
order by 排序列 (asc/desc)
分组
group by 列1 ,列2
聚合函数
min() 、max()、 sum()、avg() 、count()、count(*)、compute()
rollup 汇总,只能汇总一条属性
having 筛选列 操作符
where是select的字句,having是group by 的字句
DCL 数据控制
crant、revoke
约束
非空约束: not null
主键约束: primary key (简称PK)
唯一约束: unique
外键约束: foreign key (简称FK)
检查约束: check(mysql不支持,oracle支持)
# 主键
constraint 约束名(PK_表名称) primary key(列名)
#主键只能有一个
# 唯一性约束
constraint 约束名(ix_表名称) unique (列1,列2...)
# 设置列为自增
#注意: 列类型必须为整型
#检查约束
constraint 约束名(ck_表名称) regexp (约束表达式 -> between ... and ...)
#默认值
default '默认值'
#注意:只能在列级别创建
#空值约束
not null
#注意: 只能在列级别创建
#外键约束
constraint 约束名 foreign key (列名) references 主键表名 (主键表列名)
#一个表最多可以有31个外键,在临时表中不能有外键,主键和外键的类型必须严格匹配
#注意: 只能在列级别上创建
多表查询
内连接
内连接:把查询结果作为WHERE子句的查询条件即称为内连
SELECT filedlist FROM table1 [INNER] JOIN table2 ON table1.column1 = table2.column1
外连接
外连接分为
左外连接
以左表为参照,显示所有数据,如果右表的某行在左表中没有匹配行,则以null显示
SELECT patient.name ,user_info.name,certificates_url , address FROM patient LEFT JOIN user_info ON (patient.id=user_info.id)
右外连接
以右表为参照数据,如果左表中没有匹配行,则以null显示 SELECT patient.name ,user_info.name,certificates_url , address FROM patient RIGHT JOIN user_info ON (patient.id=user_info.id) 全连接
交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。
insert
insert into 表名 列1,列2.. values(?,?...)
update 表名 set 修改列=修改值 where 条件
视图
是一种数据库对象,以一个或多个数据表或视图导出的虚拟的表
新建视图
直接在视图右键新建视图
或者create view_视图名 [列1,列2,...] as (子查询)
as指定视图要执行的操作
子查询不允许有order by 和 distinct
修改视图
alter view 视图名称 as(子查询)
注意: 修改视图时,由于视图是一张虚拟的表,所以对视图的更新一定会转到对基本表的更新
删除视图
drop view 视图名称[1,2...] 可以同时删除多张视图
索引
是某个表中一列或者若干列的集合(是一种加快检索的数据库结构),提供 指向存储在表的指定列中的数据值的指针
创建索引的目的: 加快数据的检索
优点:使用索引可以加快查询效率,降低数据库IO成本
使用索引可以对数据进行排序,降低CPU的消耗
缺点:索引也是一张表,该表保存了索引与主键的字段,并且指向实体的记录,所以,索引是要占空间的
虽然索引加快了查询效率,但是在更新表时,同时需要更新索引表,影响更新效率
五种索引:
主键索引、唯一性索引、组合索引、
普通索引:普通索引是最基本的索引,它没有任何限制,值可以为空;仅加速查询
全文索引:全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎
create [unique] index <索引名> on <表名|视图名> 列名
范式
定义数据库的规范化过程为不同程序的规范化要求设立的不同的标准式准则称为范式
第一范式
一个关系模式的所有属性都是不可分的基本数据项
第二范式
在符合第一范式要求下,每个非主属性都依赖于关系模式的主码
第三范式
在符合第二范式要求下,每个非主属性都不能派生出其他候选关键字,且没有冗余字段
事务
数据库执行的一个工作单位,用户定义的一组操作序列
A:原子性:事务是一个不可分割的最小单位
C:完整性:在事务执行前和执行后都没有被破坏
I:隔离性:每个事务都是独立的操作,互不干扰
D:持久性:事务一旦发生,那么应该是持久的
锁
排他锁(写锁):简称为X封锁,禁止并发操作
共享锁(共享锁):简称为S锁,允许其他用户对同一数据进行进行查询,但不能修改
三级封锁协议
一级:事务T在修改数据对象之前必须对其加X锁,知道结束
二级:在一级基础上,加上事务T在读取数据时,必须加S锁
三级:在一级基础上,事务读数据时,加X锁,在读取数据后不释放,直到事务结束
封锁粒度:也就是封锁的单位,粒度越大,封锁的对象也就越多
触发器
是一种特殊的存储过程(通过事件进行触发而被执行)
指定的表中的数据发生变化时自动生效
唤醒触发器的响应也就是DDL
触发器分为两种
after触发器:在数据改后完成以后,进行触发
instead of 触发器 在数据表变动以前被触发
创建触发器
create trigger 触发器 on 表名 for after/instead of
触发器执行的事件(insert、update、delete) as SQL语句(也就是触发器执行的命令)
CREATE TRIGGER trigger_select AFTER INSERT ON `user` FOR EACH ROW
INSERT INTO `user` (username,`password`) VALUES ('zhangsan','123456');