1.1.1 整形
| 类型 | 字节 | 范围 |
|---|---|---|
| tinyint | 1 | -128~127 |
| smallint | 2 | -32768~32767 |
| mediumint | 3 | -8388608~8388607 |
| int | 4 | -231~231-1 |
| bigint | 8 | -263~263-1 |
注意:
int(5),如果数值的位数小于 5 位,前面加上前导 0.(结合zerofill才起作用)1.1.2 浮点型(保存近似值小数)
| 类型 | 字节 | 范围 |
|---|---|---|
| float | 4 | -3.4E+38~3.4E+38 |
| double | 8 | -1.8E+308~1.8E+308 |
注意:
float(M,D) double(M,D)
1.1.3 定点数
语法:decimal(M, D)
注意:
| 数据类型 | 字节 | 长度 |
|---|---|---|
| char(长度) | 定长 | 最长 255 |
| varchar(长度) | 变长 | 最大 65535 |
| tinytext | 大段文本 | 255 |
| text | 大段文本 | 65535 |
| mediumtext | 大段文本 | 224-1 |
| longtext | 大段文本 | 232-1 |
注意:
char(10)和varchar(10)的区别?
相同点:它们最多只能保存 10 个字符;
不同点:char 不回收多余的字符,varchar 会回收多余的字符;char 效率高,浪费空间,varchar 节省空间,效率比 char 低。
char 最大长度 255
varchar 理论长度 65535
特点:
优点:
| 数据类型 | 字节 |
|---|---|
| datetime | 日期时间,占用 8 个字节 |
| date | 日期,占用三个字节 |
| time | 时间,占用 3 个字节 |
| timestamp | 时间戳,占用四个字节 |
| yaer | 年份 占用 1 个字节 |
true 和 false 在数据库中对应 1 和 0
E-R 图的语法
| 符合 | 含义 |
|---|---|
| 矩形 | 实体,一般是名词 |
| 椭圆形 | 属性,一般是名词 |
| 菱形 | 关系,一般是动词 |
实践证明,三范式是性价比最高的。
如果每列都是不可再分的最小数据单元(也称为最小的原子单元),那么满足第一范式。
注意:地址包含省、市、县、地区是否需要拆分?
如果一个关系满足第一范式,并且除了主键意外的其他列,都依赖于该主键,则满足第二范式。
注意:第二范式要求每个表只描述一件事情
如果一个关系满足第二范式,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式。
注意:传递依赖不能存在于非键字段中
语法:
create [or replace] view 视图的名称 as select语句
注意:因为视图是一个表结构,所以创建视图后,会在数据库文件夹中创建一个视图名的 frm 文件
desc 视图名;
show create view 视图名\G;
show tables;
select table_name from information_schema.views;
show table status where comment='view'\G;
alter view 视图名 as select语句;
drop view [if exists] 视图1,视图2...;
场景:找出语文成绩最高的男生和女生
select * from (select * from stu order by ch desc)as t group by stusex;
我们可以将子查询封装到视图中:
create view vw_stu as select * from stu order by ch desc;
通过视图来查询:
select * from vm_stu group by stusex;
但是结果和上面直接查询的结果不一样,这是因为视图的算法造成的:
merge:合并算法,将视图的语句和外层的语句合并后在执行。temptable:临时表算法,将视图生成一个临时表,再执行外层语句。undefined:未定义,MySQL 到底用哪种算法由 MySQL 决定,一般视图会自动使用 merge 算法,因为效率更高。**解决:**在创建视图的时候指定算法
create algorithm=temptable view 视图名 as select语句;
# 开启事务
start transaction 或者 begin [work]
# 提交事务
commit
# 回滚事务
rollback
例子:银行转帐
start transaction
update bank set money=money-100 where cardid='1001'
update bank set money=money+100 where cardid='1002';
# 如果有报错:
rollback;
# 如果成功:
commit;
注意:
语法:
# 设置回滚点
savepoint 回滚点名
# 回滚到回滚点
rollback to 回滚点
优点:查询速度快
缺点:
# 创建索引方法一
create index 索引名 on 表名(字段名);
# 创建索引方法二
alter table 表名 add index [索引的名称](列名);
# 创建表的时候就添加索引
create table emp(
id int,
name varchar(10),
index ix_name(name) # 创建索引
);
语法一:create unique index 索引名 on 表名(字段名);
语法二:alter table 表名 add unique [index] [索引的名称](列名);
语法三:创建表的时候添加唯一索引,和创建唯一键是一样的
drop index 索引名 on 表名;
# 生成随机数
select rand();
select * from stu order by rand() limit 2; # 随机抽取两个学生
# 取整(四舍五入,向上,向下)
select round(数字);
select ceil(数字);
select floor(数字);
# 截取数字
select truncate(数字,截取小数位数);
# 转成大写/小写
select ucase/lcase(字符串);
# 截取字符串
select left/right(字符串,位数);
select substring(字符串,开始位数【从1开始】,位数);
# 字符串拼接
select concat(字符串...);
# 字符串替换
coalesce(字段1,字段2); # 如果字段不为空就显示字段1,否则显示字段2
select stuname,coalesce(writtenexam.'缺考') from stuinfo natural left join stumarks; # 如果笔试成绩为空就显示‘缺考’
# 字符串长度
select length(字符串); # 字节长度
select char_length(字符串); # 字符个数
# 获取当前的时间戳
select unix_timestamp();
# 时间戳转换为时间格式
select from_unixtime(unix_timestamp());
# 获取当前时间
select now();
# 日期相减
select datediff(now(),'2008-8-8') # 当前日期距离2008-08-08共多少天
# 转换格式
select cast(now() as time)
select convert(now(),time)
select md5(字符串);
select sha(字符串);
select stuname,if(ch>=60 && math>=60,'通过','不通过') '是否通过' from stu;
预编译一次,可以多次执行。用来解决一条 SQL 语句频繁执行的问题
# 预处理语句
prepare 预处理名字 from 预处理语句;
# 执行预处理
execute 预处理名字 [using 变量];
# MySQL中声明变量
set @id=值
create procedure 存储过程名(参数)
begin
sql...
end;
call 存储过程名
drop procedure [if exists] 存储过程名
show create procedure 存储过程名\G
show procedure status\G
存储过程的参数分为:输入参数(in)【默认】,输出参数(out),输入输出参数(inout)
存储过程不能使用 return 返回值,要返回值只能通过“输出参数”来向外传递值。
例 1:输入参数
create procedure proc(in param varchar(10))
select * from stuinfo where stuno=param;
call proc('s25301');
例 2:查找同桌
create procedure proc(in name varchar(10))
begin
declare seat tinyint
select stuseat into seat from stuinfo where stuname=name
select * from stuinfo where stuseat=seat+1 or stuseat=seat-1
end;
总结:
例三:输出参数
create procedure proc(num int, out result int)
begin
set result=num*num
end;
call proc(10.@result);
select @result;
例四:输入输出参数
create procedure proc(inout num int)
begin
set num=num*num
end;
set @num=10
call proc(@num);
select @num;