关系型数据库管理系统:
掌握知识点:
DDL 数据定义语言
DML 数据操纵语言
DQL 数据查询语言
DCL 数据控制语言
数据库基本操作:
DDL : 建表、建库
库 -> 多张表 -> 数据
查看当前MYSQL有哪些数据库:
show databases;
创建数据库:
create database 数据库名称;
删除数据库:
drop database 数据库名称;
查看创建数据库语句:
show create database 数据库名称;
查看正在使用的数据库:
select database();
查看数据库版本:
select version() ;
删除数据库:
drop database 数据库名称;
使用数据库:
use 数据库名称;
创建表语句:
create table 表名称(
列名称 列类型 约束,
...
列名称 列类型 约束
)
查看数据库中拥有哪一些表:
show tables;
查看创建表的语句:
show create table 表名称;
查看表结构:
desc 表名称;
快速创建表:
create table 新表名称 like 表名称;
修改表结构:
添加列:
alter table 表名称 add 列名称 列类型;
修改列(列类型):
alter table 表名称 modify 列名称 列类型;
修改列(列名称):
alter table 表名称 change 列名称 新名称 列类型;
删除列:
alter table 表名称 drop 列名称;
修改表名称:
rename table 表名称 to 新表名称;
修改表的字符集编码:
alter table 表名称 character set 字符集
DML语句: 数据操作语句
添加数据:
第一种(指定列):
insert into 表名称(列名称,列名称,...) values(值,值,...);
第二种(插入所有列):
insert into 表名称 values(值,值,...);
注: 一定是插入表的所有列,其次插入值的顺序需要跟表结构中列的顺序一致。所有类型的列,都可以插入null值
修改语句:
第一种(根据限定条件修改某一行或者某几行中的指定列的值):
update 表名称 set 列名称= 值, ... ,列名称 = 值 where 限定条件;
第二种(修改表的所有的行中指定类的值)
update 表名称 set 列名称= 值, ... ,列名称 = 值;
删除语句:
第一种(删除某一行或者某几行数据)
delete from 表名称 where 限定条件
第二种(清空表数据)
delete from 表名称;
DQL: 1、数据查询语句(获取数据库表中的数据)
select 列名称,...,列名称 from 表名称 ; 查看表中该列的所有数据
select 列名称,...,列名称 from 表名称 where 限制条件 ; 获取满足限制条件的指定行中指定列的值
select * from 表名称 ; 查看表的所有记录
给列取别名称:
select 列名称 as ‘别名称‘,...,列名称 from 表名称 where 限制条件
2、查询关键字
distinct : 去重
注: 当distinct限制多列是,多列的值都一样,则看为一条记录。
3、列运算:
例如:select empName, empSalary*12 as ‘年薪‘ from emp;
4、条件查询:
> < >= <= <>(不等于)
in(范围)
between...and...
like : 模糊查询 (%:任意多个字符 _任意一个字符)
is null: 为null的列
not:
聚合函数(将结果集中的多行记录合并成一条记录进行显示,聚合函数忽略null值)
max(列名称)
获取最高的英语成绩是多少?
select max(escore) from student;
min(列名称)
获取最小的英语成绩是多少?
select min(escore) from student;
sum(列名称)
获取所有英语成绩的总和?
select sum(escore) from student;
avg(列名称)
获取所有英语成绩的平均值?
select avg(escore) from student;
count(列名称)
统计有英语成绩的学员有多少个?
select count(escore) from student;
统计表中有多少行记录?
select count(*) from student;
结果分组
group by 列名称
将查询中相同的记录分为一组 ,显示一条记录
having字句:
对分组后的结果再次进行筛选。
获取总的人数大于等于2的结果?
select count(sex) as ‘countSex‘,sex
from student
where age between 16 and 20
group by sex
having countSex>=2;
or
select count(sex),sex
from student
where age between 16 and 20
group by sex
having count(sex)>=2;
总结SQL大致结构:
select 列名称,...列名称
from 表名称
where 限定条件
group by 列名称
having 筛选
order by 排序
limit(从结果集中获取指定的一些数据)
获取表的前两条记录?
select * from student limit 2;
or
select * from student limit 0,2;
select * from student limit 2,3;
约束:
作用:对表中的数据进行限制,保证数据的正确性、有效性和完整性
主键约束:(非空且唯一)
经常用户标识表中该行数据的唯一性标识。
primary key
auto_increment : 一般用于主键为整型,且自动递增
create table Employee(
empId int primary key auto_increment,
)
外键约束:
一个表中的某一列的值依赖于其它表的某一列的值.
工具演示的方式:
级联操作: 主表发生改变时,从表也必须进行维护。
唯一性约束: unique
非空约束:not null
检查约束(mysql的5.xxx版本演示不了): check(age>0 and age<=120)
数据库范式:
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,
各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、
第四范式(4NF)和第五范式(5NF,又称完美范式)。
第一范式(1NF) : 指数据库表的每一项,是一个不可分割单元。(每一列不能再拆分)
第二范式(2NF) : 在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
函数依赖:
通过A属性的值,可确定唯一的B属性的值。说B属性值依赖A属性值
例如:
通过学生学号可以确定唯一的学生名字。姓名依赖于学号
学生编号 ---> 学生姓名
完全函数依赖:
通过A属性(属性组)值,可以确定唯一的B属性的值,说B属性值完全依赖A属性(属性组)
通过学号+ 课程名称 可以确定唯一的分数,说分数完全依赖 属性组(学号+ 课程名称)
部分函数依赖:
通过A属性组的部分值,可以确定唯一的B属性的值,说B属性值非完全依赖A属性组
属性组(学号+ 课程名称),确定唯一的姓名 ,但是姓名只依赖一属性组(学号),姓名部分依赖一属性组
传递函数依赖:
通过A属性值确定唯一的B属性的值,通过B属性的值来确定唯一的C属性值。称C传递依赖于A。
A->B->C
学号->系号->系主任
码属性: 属性或者属性组 - 码属性
非码属性 : 除了码属性以外都是非码属性。
第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
多表连接查询: 将多个表中记录连接在一起,返回一个完整数据结构。
笛卡尔积:
select * from employee,dept;
返回两张表乘积 - 笛卡尔积
内连接:
inner join ... on
外连接:
左外连接:
left outer join ... on ...
右外连接:
right outer join... on...
事务:
一个或者多个逻辑处理单元(数据操作DML)。要么一起成功,要么一起失败。
开启事务: start transaction;
提交事务: commit
回滚事务: rollback
MYSQL中 自动提交事务:
需要查看是否提交数据:
select @@autocommit 1: 自动提交 0: 手动提交
set autocommit = 0;
事务特性:
原子性:一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。 (数据操作前后,数据总量不能发生改变)
隔离性:事务与事务之间不应该相互的干扰。
持久性: 指数据一旦提交,对数据库的操作应该是永久性的。
所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题:
脏读取:一个事务读取到了另一个事务中尚未提交的数据
不可重复读(虚读):一个事务中两次读取的数据内容不一致(同一个事务中多次读取应该一致)
幻读:一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致
数据库隔离级别:
read uncommitted : 未提交读
产生: 脏读取、不可重复读、幻读
read committed: 提交读
不产生 :脏读取 产生:不可重复读、幻读
repeatable read
不产生 :脏读取 、不可重复读 产生:幻读
serializable: 串行化
都不会产生
数据库的隔离级别越高、性能越低。
查询数据库隔离级别:
select @@tx_isolation;
MYSQL数据库隔离级别:repeatable read
Oracle 数据库隔离级别:read committed
演示由数据库隔离级别产生问题:
修改数据库隔离级别:
set global transaction isolation level 级别字符串;
set global transaction isolation level read uncommitted;
set global transaction isolation level read committed;
set global transaction isolation level repeatable read;
set global transaction isolation level serializable;