目录
SQL语言分为四大类:
- DDL(Data Defined Language) 数据定义语言.主要是对库,表等操作语句
- DML(Data Manipulation Language) 数据操作语言.主要是对表中数据的操作(增,删,改)
- DQL(Data Query Language) 数据查询语言.主要是对表中数据的查询.
- DCL(Data Control Language) 数据控制语言.主要是对数据库的权限安全操作DDL
数据类型
整型 | int 大整型 4个字节 0~(2^32-1) tinyint 微小整型 1个字节 smallint 小整型 2个字节 bigint极大整型 8个字节 | |
浮点型 | float 4个字节 double 8个字节 | |
字符型 | char 定长 1~255 varchar 变长 1~65535 | |
字节型 | blob | 适合存储图像 |
日期型 | date 日期 time 时间 datetime 日期时间 timestamp 时间戳 (自动改变) | 不需要指定长度 |
char和varchar的特点:
- char:浪费存储空间,性能高
- varchar:节省存储空间,性能低
mysql的默认搜索引擎是: InnoDB
DDL
操作库
-
创建库
create database 数据库名
-
删除库
drop database 数据库名
-
使用/切换 数据库
use 数据库名
-
查询数据库
show databases; 查询所有的数据库
select database(); 查询当前使用的数据库
-
修改库
alter database 库名 character set utf-8;
操作表
-
查看当前库下所有表
show tables;
-
创建表
create table 表名(
列名 数据类型(长度) [约束] ,
列名 数据类型(长度) [约束] ,
列名 数据类型(长度) [约束]
) ;
-
查看表的字段信息
desc 表名;
-
更新表字段-添加列
alter table 表名 add 列名 数据类型(长度);
-
更新表字段-删除列
alter table 表名 drop 列名 数据类型(长度);
-
更新列名
alter table 表名 change 旧列名 新列明 数据类型(长度);
-
更新表名
rename table 旧表名 to 新表明;
-
查看创建表的语句
show create table 表名;
-
修改表的编码格式
alter table 表名 character set gbk;
建议使用utf-8
-
删除表
drop table 表名
DML
数据操作语言
是指对表中的数据的 增 删 改
插入-insert
insert into 表名 (列名1,列名2...) values (值1,值2...);
注意:
-
列名顺序与原表无关,但是列要在原表中存在
-
要插入的列 , 不需要是全列表 . 可只列出需要插入的字段名
-
值与列的顺序必须一致
-
字符串和日期值需要使用单引号
-
可以插入null , 前提是该列允许null
-
插入全列时 , 可以省略列名 , 值得赋值是按照原表列的顺序赋值
更新-update
update 表名
set 字段1 = 值1 ,
字段2 = 值2 , ...
where 字段 = 值;
将满足where条件的字段1,字段2..更新为对应的值
不加where条件, 更新整个表
删除-delete
delete
from 表名
where 字段 = 值;
删除表中满足where条件的数据
没有where条件 , 则会删除整个表
约束
对插入数据的约束
约束类型:
-
主键约束
primark key
主键不能为空
主键不能重复, 唯一
主键是索引
-
自增约束
auto_increment
-
唯一约束
unique
-
数据类型
数据类型约束即,限制该列存储的数据类型,不符合不能存入!
-
非空约束
not null
-
默认值约束
default xx
该列不赋值时, 默认值为xx
不指定默认值约束 , 默认为null
-
引用完整性约束 -> 外键
constraint fk_course_stu foreign key (sid) references stu(sid)
设计了外键后,课程表中的sid字段就与学生表的sid字段有联系.
父表: stu表 (被引用的表)
子表: course表 (引用表)
插入时:
学生表可以随意插入值
课程表插入值时,sid字段只能插入学生表中有的sid值
删除或更新时:
RESTRICT: 如果想要删除/更新父表的记录,子表中有关联该父表记录的,则不允许删除父表记录
NO ACTION: 同restrict一样,删除时先检查外键.如果有引用,不能删除
CASCADE: 级联,父表删除/更新时,如果有子表有关联,那么子表父表数据一起删除/更新
SET NULL: 置空,父表删除/更新时,如果子表有关联,那么子表该条记录置为null
外键条件
-
外键要存在,首先必须保证表的引擎是 InnoDB(默认的存储引擎),如果不是 InnoDB 存储引擎,那么外键可以创建成功,但没有约束作用;
-
外键字段的字段类型(列类型),必须与父表的主键类型完全一致;
-
每张表中的外键名称不能重复;
-
增加外键的字段,如果数据已经存在,那么要保证数据与父表中的主键对应。
-
如果外键约束模式选择SET NULL ,那么字段必须允许为NULL,否则出现Cannot add foreign key constraint。
外键约束
所谓外键约束,就是指外键的作用。之前所讲的外键的作用都是默认的作用,实际上,可以通过对外键的需求,进行定制操作。外键约束有三种模式,分别为:
-
district:严格模式(默认),父表不能删除或更新一个已经被子表数据引用的记录;
restrict
no action
-
cascade:级联模式,父表的操作,对应子表关联的数据也跟着被删除;
-
set null:置空模式,父表的操作之后,子表对应的数据(外键字段)被置空。
/*
引用完整性约束-外键(foreign key)
创建外键的方式
1 在建表时直接指定
在引用了别的表字段的表中添加外键约束
constraint 外键名 foreign key(当前表字段) references 其他表(字段)
2 建好表后再指定
alter table 表名 add constraint 外键名 foreign key (字段) references 其他表(字段)
*/
create table stu(
sid int primary key auto_increment comment '学生主键',
sname varchar(10) comment '学生姓名',
age int comment '学生年龄'
);
create table course(
cid int primary key auto_increment comment '课程主键',
cname varchar(10) comment '课程名称',
sid int comment '关联学生表id',
constraint fk_course_stu foreign key(sid) references stu(sid)
);
alter table course add constraint fk_course_stu foreign key (sid) references stu(sid);
ps: 建表时在字段后 使用comment ‘注释’,可以对该列注释
DQL
DQL是指查询语言,从数据表中通过一系列条件将符合条件查出.
DQL查询语句只是查看数据,不会对原表有任何影响.
查询的结果是一张虚拟表.
查询的关键字: select
语法:
select
selection_list --要查询的列
from
table_name -- 要查询的表名
where condition -- 过滤行条件
group by grouping_clumns -- 对结果按照列进行分组
having condition -- 分组后再过滤
order by sort_column -- 排序
limit offset,row_count -- 对结果限制
条件查询
条件查询就是查询时在基础查询的后面使用
where语句,where后使用运算符将符合条件的数据保留
= 相等
!= <> 不等
<小于 >大于 <= >=
and 和/与 两边的条件同时成立才行
or 或 两边的条件有一个成立即可
in(set) 范围 在set集合范围内
between 值1 and 值2 在..之间.. (包含临界值,从小到大)
not in 取反
模糊查询
1、%:匹配任意0个或多个字符(将含有百分号前的数据导出,不限制%占据的位数)
2、_:匹配任意1个字符。(每个下划线只能占据一位,先找出下划线前的数据,在筛选出符合条件的数据)
排序查询
order by asc 升序 | desc 降序
聚合函数
把多行数据变到一行输出
函数名 | 含义 |
---|---|
count(列名) | 计数 |
sum(列名) | 求和 |
max(列名) | 最大值 |
min(列名) | 最小值 |
avg(列名) | 平均值 |
可以使用as给列取别名
select count(sid) as 'row-num' from stu;
-- as可以使用
-- select count(sid) 'row-num' from stu;
-- 别名可以使用中文
去重
去重函数 distinct(列)
将指定列的数据去重
-- 不重复的年龄
select distinct(age) from stu;
-- 查询年龄不重复的共有多少人
select count(distinct age) from stu;
注意:
mysql使用distinct的使用 一定要位于 查询的最前端
分组查询
当需要分组查询时,需要使用group by语句.
语法:
select * from stu [where ...] group by 字段 [order by..]
注意:
-
一般分组之后的操作都是聚合操作
-
分成几组,虚拟表结果就是几行数据
-
聚合函数,是对每组进行单独聚合操作
-
与聚合函数一同出现的列名,必须出现在group by后
反之,如果出现了一个没有在groupby后出现的字段,那么查询结果不正常!
having与where的区别:
-
where是分组前过滤,having是分组后过滤
-
where后不能使用聚合函数,having可以使用聚合函数
限制输出
可以将查询好的结果,限制输出. 可以限制输出几条,从哪里输出. 语法:在sql语句最后写 limit offset,row_count
limit 开始下标,行数;
-- 分页显示
-- 写分页逻辑,会设计几个标量
-- 1)page 当前页
-- 2)pagesize 每页展示多少条数据
-- 3)total 共多少条记录
-- 4)pagecount 总页数
-- 第一页
select * from stu limit 0,3;
-- 第二页
select * from stu limit 3,3;
-- 第三页
select * from stu limit 6,3;
-- 第四页
select * from stu limit 9,3;