1、SQL基础应用
1.1 SQL的介绍
1>SQL标准https://blog.csdn.net/weixin_33963189/article/details/90584378
SQL-92:https://blog.csdn.net/zhongmengya/article/details/5049025
SQL-99:https://blog.csdn.net/qq_23924249/article/details/856259562>SQL_MODE
https://blog.csdn.net/ccccalculator/article/details/70432123注:以上都是为了保证SQL语句的规范性
1.2 SQL的常用分类
DDL(Data Definition Language):数据定义语言
DCL(Data Control Language):数据控制语言
DML(Data Manioulation Language):数据操作语言
DQL(Data QueryLanguage):数据查询语言
1.3 表的核心属性介绍
1.3.1 列属性
1>数据类型
(1)数字类型
常用的数字类型:
tinyint : -128~127
int :-2^31~2^31-1
说明:手机号是无法存储到int的。一般是使用char类型来存储收集号
(2)字符类型
常用的字符类型:
char(10) :定长的字符串类型,在存储字符串时,最大字符长度10个,立即分配10个字符长度的存储空间,如果存不满,空格填充。
varchar(10):变长的字符串类型看,最大字符长度10个。在存储字符串时,自动判断字符长度,按需分配存储空间。
enum('bj','tj','sh'):枚举类型,比较适合于将来此列的值是固定范围内的特点,可以使用enum,可以很大程度的优化我们的索引结构。
注意:
对于char(10)和varchar(10)的数据类型
括号中表示的是,最多的字符个数.
具体占用字节长度如下:
基础字符
a ------> 1字节
1 ------> 1字节
? ------> 1字节
中文:
张 ---gbk--> 2字节
张 ---uft8--> 3字节
张 ---utf8mb4=--> 4字节
(3)时间类型
常用的时间类型:
datetime
范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
timestamp
1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
timestamp会受到时区的影响
(4)二进制类型(一般不使用)
neo4J:专门用于图片、视频存储
2>约束
常见约束:
not null:非空
unique key:唯一
primary key:主键(非空且唯一)
说明:
a> 一个表有且一个主键列,最好是一个无关列数字列,一般会在表中设置自增长的id列
b> 尽量每个列非空,如果无法保证,可以追加默认值
c> 手机号、身份证号、银行卡号……种类的列设定为UK(unique key)
3>其他类型
unsigned:无符号,一般是在int或tinyint后添加的附加属性
default:设定默认值
auto_increment:数字列自增长
comment:注释信息
1.3.2 表属性
1>存储引擎
engine=xxx,如:engine=innodb
2>字符集及校对规则
字符集:
gbk:专门存简体中文
utf8:
特点:中文字符占3个字符
utf8mb4(推荐):是utf8的超级
特点:中文字符占4个字符
查看支持的字符集:show charset;
校对规则(collation):
校对规则是跟着字符集走的
查看所有的字符集:show collation
utf8mb4_general_ci:通用的校对,默认,不区分大小写
utf8mb4_bin:区分大小写
修改校对规则:ALTER DATABASE school CHARSET utf8mb4 COLLATE utf8mb4_bin
utf8与utf8mb4的区别?
a> utf8-->中文字符占3个字符,而utf8mb4-->中文字符占4个字符
b> utf8mb4支持emoji字符
c> utf8mb4支持ü
1.4 DDL语句
1.4.1 库定义
1>建库
CREATE DATABASE school CHARSET utf8mb4;
建库的规范:
- 库名是小写
- 库名不能是数字开头
- 库名要和业务有关
- 建库时需要设定字符集
2>删库
DROP DATABASE school;
3>修库
\\修改test库的字符集
wenjuan[(none)]>alter database test charset utf8mb4;
\\修改test库的字符集和校对规则(默认utf8mb4_general_ci)
wenjuan[(none)]>ALTER DATABASE test CHARSET utf8mb4 COLLATE utf8mb4_bin
4>查库(DQL)
wenjuan[(none)]>show databases; \\查询所有的库
+--------------------+
| Database |
+--------------------+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| school |
| sys |
| world |
+--------------------+
7 rows in set (0.00 sec)
wenjuan[(none)]>show create database school; \\查询指定库的属性
+----------+--------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------+
| school | CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)
wenjuan[(none)]>
1.4.2 表定义
1>建表
标准的建表语句:
CREATE TABLE xs(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
NAME VARCHAR(20) NOT NULL COMMENT '姓名',
age TINYINT NOT NULL DEFAULT 0 COMMENT '年龄',
sex CHAR(1) NOT NULL DEFAULT 'n' COMMENT '性别',
shengfen ENUM('bj','sh','cq') NOT NULL DEFAULT 'bj' COMMENT '省份',
shijian DATETIME NOT NULL DEFAULT NOW() COMMENT '入学时间'
)ENGINE=INNODB CHARSET=utf8mb4;
建表规范:
- 表名小写,无数字开头,与业务有关
- 表中必须有主键,一般是一个自增长的无关列
- 选择合适的数据类型,字符长度要适中
- 每个列尽量是非空,并设定默认值
- 每个列必须要有注释
- 建表时必须设置存储引擎和字符集
查看表结构信息:
DESC xs;
SHOW CREATE TABLE xs;
2>改表
(1)添加(重要)
举例1:在xs表中添加手机号列?(常用)
ALTER TABLE xs ADD shouji CHAR(11) NOT NULL UNIQUE KEY COMMENT '手机号';
举例2:在xs表中的sex后面添加weixin列?
ALTER TABLE xs ADD weixin VARCHAR(64) NOT NULL UNIQUE KEY COMMENT '微信号' AFTER sex;
举例2:在xs表中的第一列位置添加QQ号列?
ALTER TABLE xs ADD qq VARCHAR(64) NOT NULL UNIQUE KEY COMMENT 'QQ号' FIRST;
(2)删除列(危险操作!!不代表生产操作!!!)
ALTER TABLE xs DROP qq;
(3)修改列属性
列名和属性都修改:(常用)
ALTER TABLE xs CHANGE NAME sname VARCHAR(64) NOT NULL COMMENT '姓名'
只改属性,不改列名:
ALTER TABLE xf MODIFY sname VARCHAR(20);
1.5 DCL语句
授权:grant 权限 on 范围 to 用户 identified by 密码;
权限回收:revoke 权限 on 范围 from 用户;
1.6 DML语句
专门用做表的数据行的增删改查
1.6.1 insert
1>完整写法:
INSERT INTO xs(id,sname,age,sex,shengfen,shijian,shouji) VALUES(1,'小花',18,'m','bj',NOW(),'18820012009')
2>简化插入数据:
INSERT INTO xs VALUES(2,'lis',19,'f','sh',NOW(),'18820012229');
3>针对性的插入数据:
INSERT INTO xs(sname,age,sex,shengfen,shouji) VALUES('arex',12,'m','bj','18820982089')
4>批量插入数据:
INSERT INTO xs(sname,age,sex,shengfen,shouji) VALUES('小小',20,'f','sh','18340982089'),('李四',23,'m','sh','17708982089'),('港盛',19,'f','bj','12345678901')
1.6.2 update
UPDATE xs SET age=31 WHERE id=1
注意:update语句必须要加where条件,否则很危险
1.6.3 delete
DELETE FROM xs WHERE id=2
注意:delete语句必须要加where条件,否则很危险
delete与trancate的区别?(面试题)
truncate:
(1)DDL语句,清空整表的所有数据,按照区来删除的,属于物理删除.性能高.
(2)表所占用的空间,会立即释放.
delete:
(1)DML语句,清空整表的所有数据,按照行来删除的,属于逻辑删除.性能低.
(2)表所占用的空间,不会立即释放.
1.6.4 使用update替代delete实现伪删除
1>添加一个状态列state
ALTER TABLE xs ADD state TINYINT NOT NULL DEFAULT 1 ;
2>用update替代delete
原语句:
DELETE FROM xs WHERE id=6;
改写后:
UPDATE xs SET state=0 WHERE id=6;
3>查询业务语句进行调整
原语句:
select * from xs;
改写后:
select * from xs where state=1;
未完……