一、SQL介绍
一种结构化查询语言
SQL标准:
SQL 92
SQL 99
5.7版本:SQL_mode严格模式
二、SQL作用
SQL:用来管理和操作MySQL内部的对象
对象:
库:库名、库属性
表:表名、表属性、列名、记录、列属性和约束
三、SQL语言的类型
DDL:数据定义语言
DCL:数据控制语言
DML:数据操作语言
DQL:数据查询语言
四、数据类型
4.1、作用
控制数据的规范性,让数据有具体的含义,在列上进行控制。
4.2种类
4.2.1字符串
1.char(32):定长长度为32的字符串。在存储数据时,一次性提供32字符长度的存储长度,存不满,用空格填充。
2.varchar(32):可变长度的字符串类型。存数据时,首先进行字符串长度判断,按需分配存储空间,会单独占用一个字节来记录此次的字符长度,字符长度超过255之后,需要两个字节长度记录字节长度。
比如:
需存储的字符串是10个字符,只会分配10个字符长度存储空间,并且会单独占用一个字符长度来记录此次的字符长度。
3.enum:枚举类型
数据行较多时,会影响到索引的应用。注意:数字类禁止使用enum类型
面试题:
1.char和varchar的区别?
(1)最大字符长度:char:255 varchar:65535
(2)char:定长(固定存储空间) varchar:变长(按需)
2.char和varchar如何选择?
(1)char类型,固定长度的字符串列,比如手机号,身份证号,银行卡号,性别等……
(2)varchar类型,不确定长度的字符串可以使用。
4.2.2数字
1.tinyint -128~127
2.int
4.2.3时间
1.timestmp
范围:从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
TIMESTAMP
2.datetime
1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
timestamp会受到时区的影响
4.2.4二进制
五、表属性
5.1存储引擎
engine=InnoDB
5.2字符集
charset=utf8mb4
utf8 中文 三个字节长度
utf8mb4 中文 四个字节长度
支持emoji字符
5.3排序规则(校对规则) collation
针对英文字符串大小写问题
六、列的属性和约束
1.主键:primary key(PK)
值必须唯一
非空
数字列、整数列、无关列、自增
聚集索引列
是一种约束,也是一种索引类型,在一张表中只能有一个主键
2.非空:not null
建议:对于普通列,尽量设置not null
3.默认值:dedault
数字列的默认值,使用0,字符串类型,设置为一个nil null
4.唯一:unique
不能重复
5.自增:auto_increment
针对数字列,自动生成顺序值
6.无符号:unsigned
针对数字列
7.注释:comment
七、SQL语句应用
7.1DDL:数据定义语言
7.1.1库
(1)建库
mysql> create database oldboy charset utf8mb4;
mysql> show databases; ##查看库信息
mysql> show create database oldboy; ##另一种方法查看库信息
(2)改库
mysql> alter database oldboy charset utf8mb4;
(3)删库
mysq> drop dababase oldboy;
7.1.2
(0)建表建库规范
1.库名和表名是小写字母
为啥?
开发和生产平台可能会出现问题。
2.不能以数字开头
3.不支持- 支持_
4.内部函数名不能使用
5.名字和业务功能有关(his,jf,yz,oss.erp.crm…)
(1) 建表
create table oldguo(
ID int not null primary key AUTO_INCREMENT comment '学号',
name varchar(255) not null comment '姓名',
age tinyint unsigned not null default 0 comment '年龄',
gender enum('m','f','n') NOT null default 'n' comment '性别'
)charset=utf8mb4 engine=innodb;
(2)改表
1. 改表结构
例子:
在上表中添加一个手机号列15801332370.(重点*****)
alter table oldguo add telnum char(11) not null unique comment '手机号';
练习:
添加一个状态列:
ALTER TABLE oldguo ADD state TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态列';
查看列的信息:
DESC oldguo;
删除state列(不代表生产操作):
ALTER TABLE oldguo DROP state;
online-DDL : pt-osc (自己研究 )***
在name后添加 qq 列 varchar(255):
ALTER TABLE oldguo ADD qq VARCHAR(255) NOT NULL UNIQUE COMMENT 'qq' AFTER NAME;
练习 在name 之前添加wechat列 :
ALTER TABLE oldguo ADD wechat VARCHAR(255) NOT NULL UNIQUE COMMENT '微信' AFTER ID;
在首列上添加 学号列:sid(linux58_00001):
ALTER TABLE oldguo ADD sid VARCHAR(255) NOT NULL UNIQUE COMMENT '学生号' FIRST;
修改name数据类型的属性:
ALTER TABLE oldguo MODIFY NAME VARCHAR(128) NOT NULL ;
将gender 改为 gg 数据类型改为 CHAR 类型:
ALTER TABLE oldguo CHANGE gender gg CHAR(1) NOT NULL DEFAULT 'n' ;
7.2DML数据操作语言
7.2.1 INSERT
(1)最简单的方法插入数据:
insert into oldguo values(1,'oldguo','11111111',18);
(2)最规范的方法插入数据:(重点记忆)
insert into oldguo(name,qq,age) values ('oldboy','1111111',50);
(3)查看表数据(不代表生产操作)
select * from oldguo;
7.2.2 UPDATE(注意:谨慎操作!!!)
update oldguo set qq='123456' where id=5;
7.2.3DELETE(注意:谨慎操作!!!)
delete from oldguo where id=5;
7.2.4生产需求:将一个大表全部清空
方法一:delete from oldguo;
方法二:truncate table oldguo;
DELETE和TRUNCATE区别?
1.DELETE: 逻辑逐行删除,不会降低自增长的起始值。
效率很低,碎片较多,会影响性能。
2.TRUNCATE: 属于物理删除,将表段中的去进行清空,不会产生碎片,性能较高。
7.2.5 生产需求:使用update代替delete,进行伪删除
1.添加状态列state(0代表存在,1代表删除)
alter table oldguo add state tinyint not null dafault 0;
2.使用update模拟delete
delete from oldguo where id=6;
替换为
update oldguo set state=1 where id=6;
查看替换的结果
select * from oldguo;
3.业务语句修改
select * from oldguo;
改为
select * from oldguo where state=0;
网友评论