K002004-0x03MySQL的SQL基础
1.SQL介绍
结构化的查询语言,关系型数据库中用的一类语言。
SQL标准 89 92 99 03
MySQL
2.SQL类常用型
2.1 mysql自带的功能
mysql> help
2.2 server端命令
mysql> help contents
DDL:数据定义语言
DCL:数据控制语言
DML:数据操作语言
DQL:数据查询语言
3.SQL的各种名词
3.1 SQL_mode SQL模式
作用:规范SQL语句书写方式。
mysql> SELECT @@sql_mode;
ONLY_FULL_GROUP_BY,
STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION
例子:
比如说:在现实的数学角度,除法运算中,除数不能为0.
当MySQL中需要做除法运算时,为了保证符合现实的数学逻辑,也要求保证除数不能为0.
所以MySQL通过设定sql_mode参数值,规范我们的除法运算,从而保证违背现实数学逻辑的sql语句
再比如说:
现实情况下,我们描述日期是,0年0月0日 在现实中是不被允许的。
NO_ZERO_IN_DATE
NO_ZERO_DATE
3.2 字符集(charset)及校对规则(collation)
字符集:
utf8 :最大存储长度,单个字符最多3个字节
utfmb4 (建议):最大存储长度,单个字符最多4个字节
差别:
utfmb4支持的编码比utf8更多
举个例子:比如,emoji字符在mb4中支持,utf8中不支持。emoji字符,一个字符占用4个字节
例如:
#5.7 默认是Latin1
mysql> show charset
mysql> create database zabbix1 charset utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql> show create database zabbix1;
+----------+---------------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------------+
| zabbix1 | CREATE DATABASE `zabbix1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+---------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
校对规则:
每种字符集,有多种校对规则(排序规则)
show collation;
作用:影响到排序的操作。简单来说就大小写是否敏感。
3.3 数据类型
3.3.1 数字:整数、小数
名词 存储长度 二进制数字 十进制数值范围
tinyint 1B =8 bit 00000000~11111111 0~255,-128~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字符
例如:
char(10):最多存10个字符,如果存储的字符不够10个,自动以空格填充剩余的空间。对于磁盘空间,都会占到10个字符长度。
varchar(10):最多存10个字符,按需分配空间
补充:
1、varchar类型,在存储数据时,会先判断字符长度,然后合理分配存储空间
而char类型,不会判断,立即分配空间。
varchar(10)
abcde --->1 判断字符长度 ----> 2.申请空间 ------>3.申请1个字节 存储5这个数值
char(10)
abcde --->1 申请10个字符空间 ------>2 存字符+空格填充
在固定长度的列中,还会选择推荐char类型。
2、varchar类型,除了会存储字符串外,还会额外使用1-2字节存储字符长度。
abcdef --》6+1
aaaaaaaaaaaaaaaaaaaa...254 ,254+1
aaaaaaaaaaaaaaaaaaaa...1000,1000+2
3.应用场景
字符串固定长度用char类型,不固定用varchar类型
4.括号中数值问题
括号中,设置的是,字符的个数,无关字符类型。
但是,不同类的字符,站哟的存储空间是不一样的。
对于英文和数字,每个字符占1个字节长度。
utf8,utf8mb4,每个中文占3个字节长度。emoji字符,占4个字节长度。
总长度不能超过数据类型的最大长度。
彩蛋:以上两种数据类型选择需考虑周全,会影响到索引应用。
enum('北京市','浙江','..') 枚举类型
1 2 3 “下标索引”
说明:属于字符串类型。
作用:
例如:
id telnum name shenfen sheng
1 18911112222 huanu 330xxxx 浙江省
..34个
彩蛋:以上数据类型选择需考虑周全,会影响到索引应用。
3.3.3 时间类型
datetame(8字节)
范围1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
timestamp(4字节)
范围1970-01-01 00:00:00~2038-01-09 03:14:07
timestamp会受时区影响
3.3.4 二进制类型
3.3.5 json(nosql)
{
id:101
name:'zhangsan'
}
3.4 约束
Primary Key :主键约束,作用:唯一且非空,每张表只能有一个主键,作为聚簇索引
not null :非空约束,作用:必须非空,我们建议每个列都设置为非空
unique key :唯一约束,作用:必须是不重复的值
unsigned :针对数字列,作用:非负数
3.5 其他属性
default :默认值
comment :注释
4.SQL的应用
4.1 client
c 结束上一行命令的执行
G 格式化输出
q 退出mysql会话(ctrl + D)
source 导入sql脚本,类似于<
system 调用Linux命令
tee 记录日志
notee 退出记录日志
4.2 server
Linux中一切皆命令,Linux中一切皆文件。
MySQL一切皆SQL,MySQL一切皆库、表。 ---oldguo
4.2.1 DDL 数据库定义语言
(1)库定义:库名 库属性
创建库:
CREATE DATABASE cnblogs CHARSET UTF8MB4;
规范:
1.库名:小写,与业务有关,不要数字开头,库名不要太长,不能使用保留字符串
2.必须制定字符集
查询库:
show database;
show create database cnblogs;
修改库:
alter database cnblogs charset utf8mb4;
A --> B
B是A字符集的严格超集。
删除库:危险,不代表生产操作。
注意:生产数据库中,除了管理员,任何人没有权限删除库。
DROP DATABASE zabbix1;
(2)表定义
(2.1)创建表
CREATE TABLE `vp_users` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '用户序号',
`name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '用户名' COLLATE 'utf8mb4_bin',
`age` TINYINT(4) NOT NULL DEFAULT '18' COMMENT '年龄',
`gender` CHAR(1) NOT NULL DEFAULT 'F' COMMENT '性别' COLLATE 'utf8mb4_bin',
`cometime` DATETIME NOT NULL COMMENT '注册时间',
`shengfen` ENUM('北京市','上海市','广东省') NOT NULL DEFAULT '北京市' COMMENT '省份' COLLATE 'utf8mb4_bin',
PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb4_bin'
ENGINE=InnoDB
;
建表规范:
1、表名;
小写字母
不能数字开头
表名要和业务有关
名字不要太长(建议20个字符以内)
不能使用关键字
2、必须设置存储引擎和字符集
3、数据类型:合适、简短、足够
4、必须要有主键
5、每个列尽量设置not null,不知道填什么,设定默认值
6、每个列要有注释
7、列明不要太长
(2.2)查询表
show tables;
desc wp_users;
show create table wp_users;
(2.3)修改表
例子:
--1、添加手机号列
ALTER TABLE wp_users ADD COLUMN tel BIGINT NOT NULL UNIQUE KEY COMMENT '手机号';
--2、将tel列数据类型改为char(11)
ALTER TABLE wp_users modify tel CHAR(11) NOT NULL UNIQUE KEY COMMENT '手机号';
--3、删除手机号列(危险)
ALTER TABLE wp_users DROP tel;
(2.4)删除表
drop table wp_users;