DDL
-数据定义语言
C(Create): 创建数据库:
create database 数据库名;//创建数据库
create database if nor exists 数据库名称;//创建数据库并判断不存在,再进行创建
create database 数据库名称 character set 字符集名称;//创建数据库并指定字符集
R(Retrieve): 查询数据库:
show databases;//查询所有数据库名称
show create database 数据库名称;//查询数据库的字符集/创建数据库的语句
U(Update): 修改
alter database 数据库名称 character set 字符集名称;//修改数据库字符集
D(Delete): 删除数据库:
drop database 数据库名;//删除数据库
drop database if exists 数据库名称;//判断数据库存在再进行删除
使用数据库:
1.select database ();//查询正在使用的数据库名称
2.use 数据量名称;//使用数据库
表结构操作语句
数据库类型:
1. int:整数类型
* age int,
2. double:小数类型
* score double(5,2)
3. date:日期,只包含年月日,yyyy-MM-dd
4. datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
5. timestamp:时间错类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss
* 如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
6. varchar:字符串
表的增删改查
C(Create)创建表格式:
create table 表名 (
数据名
数据类型,
);
复制表:
create table 表名 like 被复制的表名;
R(Retrieve)查询:
查看数据库所有表:
show tables;
查看表结构:
desc 表名;
查看表的字符集:
show create table 表名;
U(Update):修改
增加表的一条字段:
alter table 表名 add 数据名称 数据类型;
修改以存在数据字段:
alter table 表名 change 修改的数据名 修改的数据类型;
修改表名
alter table 表名 rename to 新的表名;
修改表的字符集
alter table 表名 character set 字符集名称;
修改列名称 类型
alter table 表名 change 列名 新列名 新数据类型;
alter table 表名 modify 列名 新数据类型;
D(Delete):删除
删除列:
alter table 表名 drop 列名;
删除表:
drop table 表名;
判断表存在再进行删除:
drop table if exists 表名 ;
删除后再重新创建该表:
truncate 表名;
DML
-数据操作语言
添加数据:
添加格式:
insert into 表名(数据名)values(数据);
insert into 表名 (数据名1,数据名2) values(数据1,数据2);
insert into 表名 values(数据1,数据2);
删除数据:
删除格式:
delete from 表名 where 判断条件;
delete from 表名(删除整个表);
delete from 表名; 有多少条记录就会执行多少次删除操作
truncate table 表名; 效率更高,先删除表,然后再创建一张一样的表。
修改数据:
修改格式:
update 表名 set 被修改的数据 where 判断修改条件;
注意:
如果不加任何条件,则会将表中所有记录全部修改
DQL
-数据查询语言
语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
基础查询:
select * from 表名;//查询表中所有数据
select 数据名 from 表名;//查询单个表中数据
select 数据名1,数据名2 from 表名;//查询表中多个字段
排序查询:
order by 排序字段1 排序方式1,排序字段2 排序方式2....
排序方式:
asc:升序(默认)
desc:降序
注意:如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
聚合函数:(将一列数据作为整体,进行纵向计算)
1.count:计算个数//一般选择非空的列计算
count(*)//计算列里无论有没有null或者0的都会计算
2. max:计算最大值
3. min:计算最小值
4. sum:计算和
5. avg:计算平均值
注意:聚合函数计算,配出null值
解决方案:
1.选择不包含非空的列进行计算
2.if null函数判断并替换为0
分组查询:
语法:group by 分组字段
注意:
1. 分组之后查询的字段:分组字段、聚合函数
2. where 和 having 的区别:
1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
分页查询:
语法:
limit开始的索引,每页查询的条数
公式:
开始的索引 = (当前的页码 - 1) * 每页显示的条数
-- 每页显示X条记录
limit是一个MySQL"方言"
去除重复:
select distinct(列名);
计算列
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
表达式1:哪个字段需要判断是否为null
如果该字段为null后的替换值
起别名:
as:as也可以省略
条件查询:
where 子句判断条件
运算符
* > 、< 、<= 、>= 、= 、<>
* between...and
* in( 集合)
* like:模糊查询
* 占位符:
* _:单个任意字符
* %:多个任意字符
* is null
* and 或 &&
* or 或 ||
* not 或 !
约束
概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
分类:
1. 主键约束:primary key
2. 非空约束:not null
3. 唯一约束:unique
4. 外键约束:foreign key
主键约束:
1. 含义:非空且唯一
2. 一张表只能有一个字段为主键
3. 主键就是表中记录的唯一标识
关键字:primary key
格式:
create table 表名(
数据名
数据类型
primary key
);
删除主键格式:
alter table 表名 drop primary key;
已存在表,添加主键:
alter table 表名 modify 数据名 数据类型 primary key;
自动增长:
概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长
添加主键约束,并完成主键自动增长格式:
create table 表名(
数据名
数据类型
primary key auto_increment
);
删除自动增长:
alter table 表名 modify 数据名 数据类型;
添加自动增长:
alter rable 表名 modify 数据名 数据类型 auto_increment;
非空约束:
关键字:not null //某一列的值不能为null
创建表时添加约束:
create table 表名(
数据名
数据类型 not null
);
删除非空约束:
alter table 表名 modify 数据名 数据类型;
创建表后,添加非空约束:
alter table 表名 modify 数据名 数据类型 not null;
唯一约束:
关键字:unique //某一列的值不能重复
创建表时添加唯一约束:
create table 表名(
数据名
数据类型 unique
);
删除唯一约束:
alter table 表名 drop index 数据名;
已存在表添加唯一约束:
alter table 表名 modify 数据名 数据类型 unique;
外键约束:
关键字:foreign key //让表与表产生关系,从而保证数据的正确性
创建表时添加外键:
create table 表名(
...
外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
删除外键:
alter table 表名 drop foreign key 外键名称;
已存在表中添加外键:
alter table 表名 add constrainit 外键名称 foreign key(外键字段名称)references 主表名称(主表列名称);
级联操作:
添加级联:
alter table 表名 add constraint 外键名称 foreign key(外键字段名称)
references 主表名称 on update cascade on delete cascade;
级联更新:
on update cascade
级联删除:
on delete cascade
数据库的设计
1.分类:
一对一:
如:人与身份证
理解:一个人只能有一个身份证,一个身份证对应一个人
实现方式:一对一实现,可以在任意一方添加唯一外键指向另一方的主键
一对多(多对一)
如:部门与员工
理解:一个部门有多个员工,一个员工对应一个部门
实现关系:在多的一方建立外键,指向一方的主键
多对多:
如:学生与课程
理解:一个学生可以选择多个课程,一个课程可以供多个学生选择
实现方式:多对多关系实现需要借助第三张中间表,中间表至少包含两个字段,两个字段作为第三张表的外键,分别指向两张表的主键
数据库设计的范式
概念:
设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
分类:
1. 第一范式(1NF):每一列都是不可分割的原子数据项
2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
* 几个概念:
1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
例如:学号-->姓名。 (学号,课程名称) --> 分数
2. 完全函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
例如:(学号,课程名称) --> 分数
3. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称) -- > 姓名
4. 传递函数依赖:A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
例如:学号-->系名,系名-->系主任
5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如:该表中码为:(学号,课程名称)
* 主属性:码属性组中的所有属性
* 非主属性:除过码属性组的属性
3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
多表&事务
查询语法:
select
列名列表
from
表名列名
笛卡尔积:
有两个个集合A,B,取这两个集合的所有组成情况.
要完成多表查询,需要消除无用的数据
多表查询的分类:
内连接查询:
隐式内连接:使用where条件消除无用数据
例:select * from emp,dept where emp.`dept_id` = dept.`id`;
显式内连接:
select 字段列表 from 表名1 inner join 表名2 on 条件(inner单词可省略)
例:select * from emp inner join dept on emp.`dept_id` = dept.`id`;
外连接查询:
左外连接:
语法:select 字段列表 from 表1 left outer join 表2 on 条件;
查询的是左表所有数据以及其交集部分
例:select t1.*,t2.`name` from emp t1 left join dept t2 ON t1.`dept_id` = t2.`id`;
右外连接:
语法:select 字段列表 from 表1 right outer join 表2 on 条件; 查询的是右表所有数据以及其交集部分
例:select * from dept t2 right join emp t1 on t1.`dept_id` = t2.`id`;
子查询:
概念:查询中嵌套查询,称嵌套查询为子查询
例:select max(salary工资) from emp表名;
子查询不同情况:
席查询的结果都是单行单列的:
子查询可以作为条件,使用运算符去判断
子查询的结果是多行单列:
子查询可以作为条件,使用运算符in来判断
子查询的结果是多行多列:
子查询可以作为一张虚拟表参与查询;
多表查询 |