day3-sql常用类型

sql介绍

什么是sql

  • SQL 指结构化查询语言

  • SQL 使我们有能力访问数据库

  • SQL 是一种 ANSI 的标准计算机语言

注:存在许多的版本,他们为了兼容 ANSI 用类似的方式支持主要关键词(比如selectupdatedeleteinsertwhere等)但是它们也有自己的扩展

sql能做什么

  • SQL 面向数据库执行查询

  • SQL 可从数据库取回数据

  • SQL 可在数据库中插入新的记录

  • SQL 可更新数据库中的数据

  • SQL 可从数据库删除记录

  • SQL 可创建新数据库

  • SQL 可在数据库中创建新表

  • SQL 可在数据库中创建存储过程

  • SQL 可在数据库中创建视图

  • SQL 可以设置表、存储过程和视图的权限

sql常用类型

mysql客户端自带功能

mysql> help

server端分类命令

mysql> help contents
  • DDL : 数据定义语言

  • DCL : 数据控制语言

  • DML : 数据操作语言

  • DQL : 数据查询语言

注:快速记忆( D、C、M、Q、 定义、控制、操作、查询)

sql的各种名词

sql_mode sql模式

注:sql_mode简而言之:定义了我们MySQL应该支持的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

字符集和校验规则

注:MySQL8字符集默认字符集改成了utf8mb4

字符集(character)

  • utf8一个符号使用1~3个节点表示

  • utf8mb4(建议),最大存储长度,单个字符最多4个字节,存储与获取数据的时候,不用再考虑4字节

差别:

  • utf8mb4 支持的编码比utf8更多

  • 举个例子: 比如,emoji字符mb4中支持,utf8不支持。emoji表情字符,1个字符占4个字节,utf8存不下。

  • 对于非BMP字符,utf8mb4使用4个字节来存储,utf8不能存储非BMP字符

  • innodb中默认最大可对767个字节建立索引

  • 使用utf8 的列最多可对255个字符建立索引

  • 使用utf8mb4 的列最多可对191个字符建立索引

例如:

show charset;
create database zabbix charset  utf8mb4;
show create database zabbix;
  • 5.7 版本设置默认字符集

修改/etc/my.conf 文件

1. 在[mysqld]下添加:

character-set-server=utf8

2. 在[mysql]下添加

default-character-set=utf8

校对规则

校对规则的意思:它是一组规则,负责决定某一字符集下的字符进行比较和排序结果。

show collation;

比如说,有latin1字符集中的字母A和a,我们需要它们在比较的时候相等,那么,我们可以使用字符集校对规则 latin1_general_ci;这种校对规则在比较和排序的时候不区分大小写;如果我们需要他们在比较的时候不等呢?也很简单,我们可以使用字符集校对规则latin1_bin;这种校对规则会以二进制的方式对字符进行比较,很明显,a和A的二进制编码不同,比较的结果就是不等。影响到排序的操作。简单来说是大小写是否敏感

数据类型

数字

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1字节 (-128,127) (0,255) 小整数值
INT 4字节 (-32 768,32 767) (0,65 535) 大整数值
BINGINT 8字节 (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
create database wei charset utf8mb4;    --创建表格式为utf8mb4
use wei;
create table t1(id int ,name varchar(64),age tinyint);
show tables;
+---------------+
| Tables_in_wei |
+---------------+
| t1            |
+---------------+
1 row in set (0.00 sec)

查看表内容
desc t1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(64) | YES  |     | NULL    |       |
| age   | tinyint(4)  | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

字符串类型

类型 大小 用途
char(长度) 0 ~ 255字符 定长字符串类型
varchar(长度) 0 ~ 65535字符 变长字符串类型

例如:

  • char(10):最多存10个字符,如果存储的字符不够10个,自动用空格填充剩余空间。对于磁盘空间,都会占到10个字符长度。

  • varchar(10): 最多存10个字符 , 按需分配存储空间

补充:

1. varchar类型,在存在数据时,会判断字符长度,然后合理分配存储空间而char类型,不会判断,立即分配空间。

  例子:

varchar(10)

 

abcde---> 1. 判断字符长度 ---> 2. 申请空间 ---> 3.存字符 4. ---> 申请1个字节存储这5个数字

char(10)

abcde ---> 1. 申请10个字符空间 ---> 2. 存字符+空格填充

2. varchar类型,除了会存储字符串之外,还会额外使用 1-2字符存储长度

3. 应用场景

  字符串固定长度的话,char类型,不固定用varchar类型

4. 括号中数学问题

括号中设置是字符的个数,无关字符类型。

但是,不同种类的字符,占用的存储长度空间是不一样的。

对于英文和数学,每个字符占1个字节长度。

对于中文,占用空间大小要考虑字符集。

utf8utf8mb4,每个中文,占3个字节长度。emoji字符,占4个字节长度。

总长度不能超过数据类型的最大长度。

日期和时间类型

表示时间值得日期和时间类型为DATETIMEDATETIMESTAMPTIMEYEAR.

每个时间类型有一个有效范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性

类型 大小 (字节) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

二进制类型

二进制字符串类型有时候也直接被称为“二进制类型”。

下表中列出了 MySQL 中的二进制数据类型,括号中的M表示可以为其指定长度。

 

类型名称 说明 存储需求
BIT(M) 位字段类型 大约 (M+7)/8 字节
BINARY(M) 固定长度二进制字符串 M 字节
VARBINARY (M) 可变长度二进制字符串 M+1 字节
TINYBLOB (M) 非常小的BLOB L+1 字节,在此,L<2^8
BLOB (M) 小 BLOB L+2 字节,在此,L<2^16
MEDIUMBLOB (M) 中等大小的BLOB L+3 字节,在此,L<2^24
LONGBLOB (M) 非常大的BLOB L+4 字节,在此,L<2^32
  • BIT 类型

位字段类型。M 表示每个值的位数,范围为 1~64。如果 M 被省略,默认值为 1。如果为 BIT(M) 列分配的值的长度小于 M 位,在值的左边用 0 填充。例如,为 BIT(6) 列分配一个值 b'101',其效果与分配 b'000101' 相同。

BIT 数据类型用来保存位字段值,例如以二进制的形式保存数据 13,13 的二进制形式为 1101,在这里需要位数至少为 4 位的 BIT 类型,即可以定义列类型为 BIT(4)。大于二进制 1111 的数据是不能插入 BIT(4) 类型的字段中的。

提示:默认情况下,MySQL不可以插入超出该列允许范围的值,因而插入数据时要确保插入的值在指定范围内。

  • BINARY 和 VARBINARY 类型

BINARYVARBINARY 类型类似于 CHARVARCHAR,不同的是它们包含二进制字节字符串。使用的语法格式如下:

 

 列名称 BINARY(M) 或者 VARBINARY(M)

BINARY 类型的长度是固定的,指定长度后,不足最大长度的,将在它们右边填充 “\0” 补齐,以达到指定长度。例如,指定列数据类型为 BINARY(3),当插入 a 时,存储的内容实际为 “\a0\0”,当插入 ab 时,实际存储的内容为“ab\0”,无论存储的内容是否达到指定的长度,存储空间均为指定的值 M。

VARBINARY 类型的长度是可变的,指定好长度之后,长度可以在 0 到最大值之间。例如,指定列数据类型为 VARBINARY(20),如果插入的值长度只有 10,则实际存储空间为 10 加 1,实际占用的空间为字符串的实际长度加 1。

  • BLOB 类型

BLOB 是一个二进制的对象,用来存储可变数量的数据。BLOB 类型分为 4 种:TINYBLOBBLOBMEDIUMBLOBLONGBLOB,它们可容纳值的最大长度不同,如下表所示。

 

数据类型 存储范围
TINYBLOB 最大长度为255 (28-1)字节
BLOB 最大长度为65535 (216-1)字节
MEDIUMBLOB 最大长度为16777215 (224-1)字节
LONGBLOB 最大长度为4294967295或4GB (231-1)字节

BLOB 列存储的是二进制字符串(字节字符串),TEXT 列存储的是非进制字符串(字符字符串)。BLOB 列是字符集,并且排序和比较基于列值字节的数值;TEXT 列有一个字符集,并且根据字符集对值进行排序和比较。

主键约束

详细请看:http://c.biancheng.net/view/2440.html

 

约束主键类型:

  • Primary Key : 主键约束,作用:唯一+非空,每张表只能有一个主键,作为聚簇索引。

  • not null : 非空约束,作用:必须非空,我们建议每个列都设置非空。

  • unique key : 唯一约束,作用:必须不重复的值

  • unsigned : 针对数字列,非负数

在创建表时设置主键约束

在 CREATE TABLE 语句中,主键是通过 PRIMARY KEY 关键字来指定的。

在定义列的同时指定主键,语法规则如下:

<字段名> <数据类型> PRIMARY KEY [默认值]

例1:在wei数据库中创建t2 数据表,其主键为id输入sql语句和运行结果为:

use wei;

create table t2
(
id int(11) primary key,
name varchar(25),
depid int(11),
salary float
);
Query OK, 0 rows affected (0.20 sec)

desc t2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| depid  | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

在定义完所有列之后,指定主键的语法格式为:

[CONSTRAINT <约束名>] PRIMARY KEY [字段名]

例2:在wei数据库中创建t3 数据表,其主键为id,输入sql语句如下:

create table t3
(
id int(11),
name varchar(25),
deptld int(11),
salary float,
primary key(id)
);

在创建表时设置复合主键

主键又多个字段联合组成,语法规则如下:

PRIMARY KEY [字段1,字段2,…,字段n]

例3:创建数据表t5,假设表中没有主键id,为了唯一确定一个员工,可以把namedeptld联合起来作为主键,输入sql语句和运行结果如下:

create table t5
(
name varchar(25),
deptld int(11),
salary float,
primary key(name,deptld)
);

在修改表时添加主键约束

在修改数据表时添加主键约束的语法规则为:

ALTER TABLE <数据库名> ADD primary key (<列名>);

创建并查看t6表结构,如下:

create table t6 (id int,name varchar(25),deptld int(11),salary float);

desc t6;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | YES  |     | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptld | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

例4:修改数据表t6,将字段id设置为主键,输入的sql语句和运行结果如下:

mysql> alter table t6 add  primary key(id);
Query OK, 0 rows affected (0.42 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t6;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptld | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

其他属性

  • default : 默认值

  • comment : 注释

sql应用

client客户端

  • \c 结束上条命令运行

  • \G 格式化输出

  • \q 退出MySQL会话 (CTRL+d)

实例:

show databases \c    ---直接退出不报错
select * from city\G  --格式化输出,但是这个表有点长
desc t1\q             ---直接退出
Bye
  • source 导入sql脚本 ,类似于 <

  • system 调用linex命令

实例:

t100w.sql包下载地址:https://pan.baidu.com/s/11IQ7fVyxV9eNXVQJJyWDGg
提取码:c5pd

mysql> source t100w.sql

mysql> system ls;
APlayer.min.css  APlayer.min.js  ruby-1.9.3-p551.tar.gz  t100w.sql

server服务端

DDL数据库定义语言

库定义:库名 库属性

 

1. 创建数据库

create database wei charset utf8mb4;

规范:

  • 库名:小写,业务有关,不能数字开头,库名不要太长,不能使用保留字符串。

  • 必须制定字符集

2. 查库

mysql> show databases;
mysql> show create database wei;

3. 修改库

mysql> alter database wei charset  utf8mb4;

A ---> B

B是字符集的严格超集。

4. 删除库:危险 !,不代表生产操作

注:生产数据库中,除了管理员,任何人没有删库权限

 mysql> drop database wordpress;

表定义:

1. 创建表

开发工作

CREATE TABLE `oldboy`.`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;

建表规范:

  1. 表名

    • 小写字母

    • 不能数字开头

    • 表名和业务有关

    • 名字不要太长

    • 不能使用关键字

  1. 必须设施存储引擎和字符集

  2. 数据类型:合适、简短、足够

  3. 必须有主键

  4. 每个列尽量设施not null,不知道填啥,设定默认值

  5. 每个列要有注释

  6. 列名不要太长

  7. 表要有表注释

优化建议题目:

 

  • id 太大,int(10)就够

  • warehouse_id 如果是数字应该换数据类型为数字的

  • station_region_id 同上

  • replenish_type 用 enum 可以节省空间

  • c_t 应该用时间类型

  • u_t 同上

  • is_deleted tinyint(1)

  • 字符集 utf8mb4 比较好

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;

 

posted @ 2020-02-24 21:52  kerwin-  阅读(301)  评论(0编辑  收藏  举报