MySQL的SQL基础(三)

1. SQL介绍

结构化的查询语言,关系型数据库中通用的一类语言。
SQL标准 89 92 99 03

2. SQL常用类型

# 2.1 mysql客户端自带的功能
mysql> help
# 2.2 Server端分类命令
mysql> help contents
mysql> help Data Definition
mysql> help CREATE DATABASE

DDL: 数据库定义语言 
DCL: 数据控制语言
DML: 数据操作语言
DQL: 数据查询语言

3. SQL各种名词

3.1 sql_mode SQL模式

作用: 规范SQL语句书写方式
mysql> select @@sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                            |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |

例子: 
	比如说:
	在现实的数学角度,除法运算中,除数不能为0。
	当MySQL中需要做除法运算时,为了保证符合现实的数学逻辑,也需要保证除数不能为0.
	所以MySQL通过设定sql_mode参数值,规范我们的除法运算,从而保证不会出现违背现实数学逻辑的SQL语句
	再比如说:
	现实情况下,我们描述日期时,000日,在现实中是不被允许的
	NO_ZERO_IN_DATE,NO_ZERO_DATE

3.2 字符集(charset)及校对规则(collation)

字符集:
	utf8: 最大存储长度,单个字符最多3个字节
	utf8mb4(建议): 最大存储单位,单个字符最多4个字节
差别:
	utf8mb4支持的编码比utf8更多
	举个例子:比如,emoji字符mb4中支持,utf8不支持。emoji表情字符,一个字符占4个字节,utf8存不下。
例如:5.7版本默认时latin1
create database zabbix charset utf8mb4

校对规则:
每种字符集,由喝多校对规则(排序规则)
show collation;
作用:
影响到排序的操作。简单来说就是大小写是否敏感。
mysql> show collation;
| utf32_general_ci         | utf32    |  60 | Yes     | Yes      |       1 |
| utf32_bin                | utf32    |  61 |         | Yes      |       1 |
utf8mb4_general_ci 大小写敏感
utf8mb4_bin 大小写不敏感

# 查看A的ASCII码
mysql> select ASCII('A');

# 当作计算器用
mysql> select 3+2;

3.3 数据类型

列出常见数据类型,还有其他数据类型或者每个数据类型下面还有其他的子类型。

3.3.1 数字类型
数字: 整数,小数

			存储长度		二进制数字范围		十进制数字范围
tinyint		 1B = 8bit  00000000~1111111	0~255-125~127
int			 4B = 32bit 略					0~2^32-1,-2^31~2^31-1  			
bigint		 8B = 64bit 略					0~2^64-1,-2^63~2^63-1

mysql> create database oldboy charset utf8mb4;
mysql> use oldboy;
mysql> create table t1(id int ,name varchar(64), age tinyint)
mysql> show tables;
+------------------+
| Tables_in_oldboy |
+------------------+
| t1               |
+------------------+
mysql> desc t1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(64) | YES  |     | NULL    |       |
| age   | tinyint(4)  | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+


3.3.2 字符串类型
char(长度):定长字符串类型 255字符
varchar(长度):变长字符串类型 65535字符
例如:
char10):最多存10个字符,如果存储的字符不够10个,自动用空格填充剩余空间。对于磁盘空间都会占到10个字符长度。
varchar10):最多存10个字符,按需分配存储空间
补充:
	1. varchar类型,在存储数据时,会先判断字符长度,然后合理分配存储空间,然后合理分配存储空间。
	   char类型,不会判断,立即分配空间。
	   在固定长度的列中,还会推荐选择char类型。
	例子:
	varchar(10)
	abcde ---> 1. 判断字符长度---> 2. 申请空间 ---> 3. 存字符---> 申请一个字节存储5这个数字
	char(10)
	abcde ---> 1. 申请10个字符空间 ----> 2. 存字符+空格填充

	2. varchar类型。除了会存储字符串之外,还会额外使用1-2字节存储字符长度。
	abcdef ---> 6+1    # 在额外申请一个字节存储字节长度(比如6这个数值)
	aaaaaaaaaaaaaaaaaaaaaaaa..254 , 254+1
	aaaaaaaaaaaaaaaaaaaaaaaa..1000 , 1000+2

	3. 应用场景
	字符串固定长度的话,char类型,不固定用varchar类型

	4. 括号中数字问题
	括号中,设置的是,字符的个数,无关字符类型。
	但是不同种类的字符,占用的存储空间不一样的。
	对于英文和数字,每个字符占一个字符长度。
	对于中文,占用空间大小,要考虑字符集。
	utf8,utf8mb4,每个中文,占3个字符长度。emoji字符,占4个字节长度。
	总长度不能超过数据类型的最大长度。

彩蛋: 以上两种数据类型选择需考虑周全,会影响到索引应用。

# 查看t2表n1列的长度
mysql> select length(n1) from t2;
3.3.3 枚举类型
enum('bj','sh','sd'......)枚举类型
			1   2    3 			  "下表索引"
说明: 字符串类型
作用:
例如:
	id		telnum 		name		shenfenzheng	shen
	1		123456  	zhangsan	4253xxxx		山东省
													上海市
													山东省
													.....

3.3.3 时间类型
DATETIME
范围为从 1000-01-01 00:00:00.0000009999-12-31 23:59:59.999999

TIMESTAMP
1970-01-01 00:00:00.0000002038-01-19 03:16:07.999999
timestamp会受到时区的影响

DATETIME占用8个字节长度
TIMESTAMP占用4个字节长度

在这里插入图片描述

3.3.4 二进制类型

二进制类型(mysql不太擅长,比如图片视频,如果放土拍你视频可以放到图数据库neo4j中)

3.3.5 Json类型
{
	id: 101
	name: 'zhangsan'
}

3.4 约束

Primary Key : 主键约束,作用:唯一+非空,每张表只能有一个主键,作为聚簇索引。
not null	: 非空约束,作用:必须非空,我们建议每个列都设置非空。
unique key	: 唯一约束,作用:必须不重复的值
unsigned	: 针对数字列,非负数

3.5 其他属性

default	: 默认值
comment : 注释

4. SQL应用

4.1 Client

# 客户端自带命令
mysql> help
\c 结束上条命令运行
\G 格式化输出
\q 退出MySQL会话 (ctrl+d)
source 导出SQL脚本,类似于<
system 调用Linux命令
tee  mysql操作的内容和结果输入指定文件 比如:tee /tmp/mysql.log
notee 关闭tee功能

4.2 Server

Linux 中一切皆命令,Linux中一切皆文件。
MySQL中一切皆SQL,MySQL一切皆库、表。
SQL规范网站:https://www.sqlstyle.guide/zh/

4.2.1 DDL数据定义语言
(1) 库定义: 库名 库属性
创建库:
	CREATE DATABASE oldguo CHARSET utf8mb4;
规范:
	1. 库名: 小写,业务有关,不要数字开头,库名不要太长,不能使用保留字符串
	2. 必须指定字符集
(2) 查库
mysql> show databases;
mysql> show create database oldguo;

(3) 修改库
mysql> alter database oldguo charset utf8mb4;
A ----> B
B是A字符集的严格超集。就是B字符集的内容范围比A大,这样才不会出乱码问题
可以修改库的属性(如字符集),但是不能修改库名

(4) 删除库: 危险, 不代表生产操作。
注意: 生产数据库中,除了管理员,任何人没有删库的权限。
mysql> drop database wordpress;


表定义:
(1) 创建表
CREATE TABLE `wordpress`.`wp_users`(  
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '用户序号',
  `name` VARCHAR(64) NOT NULL COMMENT '用户名',
  `age` TINYINT UNSIGNED NOT NULL DEFAULT 18 COMMENT '年龄',
  `gender` CHAR(1) NOT NULL DEFAULT 'F'  COMMENT '性别',
  `cometime` DATETIME NOT NULL COMMENT '注册时间',
  `shengfen` ENUM('北京市','上海市','深圳市','重庆市') NOT NULL DEFAULT '北京市'  COMMENT '省份',
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8mb4;

小提示: 数字有默认的存储长度,可以不用写。 UNSIGNED数字列不能为负数。如果性别就只有男和女的话不需要使用枚举,用tinyint或者char就可以了
建表规范:
1. 表名:
	小写字母
	不能数字开头
	表名和业务相关
	名字不要太长
	不能使用关键字
2. 必须设置存储引擎和字符集
3. 数据类型: 合适,简短,足够
4. 必须要有主键
5. 每个列尽量上设置not null,不知道填啥,设定默认值
6. 每个列要有注释
7. 列名不要太长

在这里插入图片描述

优化建议题目:

在这里插入图片描述在这里插入图片描述
建议: id太大,int(10)就够。warehouse_id 如果是数字应该换数据类型为数字的,station_region_id 如果是数字应该换数据类型为数字的,replenish_type 用enum可以节省空间
c_t 应该用时间类型,u_t同上,is_deleted tinyinst(1) , 字符集utf8mb4 比较好。distribution_cost 这个用decimal数据类型

2) 查询表
# 查看库下的表
mysql> show tables;
# 查看表结构或者表属性
mysql> desc wp_users;
# 创建表的详细信息
mysql> show create table wp_users;3) 修改表
# 1. 添加手机号序列
mysql> alter table  wp_users add column shouji bigint not null unique key comment '手机号';
# 2. 将shouji列数据类型修改为char(11)
mysql> alter table  wp_users modify shouji char(11) not null unique key comment '手机号';
# 3. 删除手机号列(危险)
mysql> alter table wp_users drop shouji;4) 删除表(谨慎操作)
drop table wp_user;

5. 元数据获取

后文中涉及

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值