002 MySQL 库表属性、数据类型、约束、库函数

MySQL命令

客户端接口自带命令 服务端自带命令: 
       - 一般自带都是发送到连接层 
       - 其他发送到SQL层
       
      
 \h     帮忙名
 \G     客户端格式化命令 列和行翻转 ,以键值对的形式显示。
 tee /tmp/1.log   记录日志的功能
 \c    中断命令
 \s   status 状态信息   或者
 source 导入SQL脚本  恢复数据库
 
 显示服务端自带命令:
 help contents     
 
 
 mysqladmin  -uroot -p    ping      数据库的状态是否存活
 mysqladmin  -uroot -p    status    查看数据库的状态
 mysqladmin  -uroot -p   variables  查看数据库的参数



函数包括 数值型函数、字符串型函数、日期时间函数、聚合函数

VERSION()	                          获取数据库的版本号。
DATABASE()、SCHEMA()	                  获取当前数据库名。
USER()、SYSTEM_USER()、SESSION_USER()	  获取当前用户名。
CURRENT_USER()、CURRENT_USER	          获取当前用户名。

CONNECTION_ID()  	                  获取服务器的连接数。
CHARSET(str)	                          获取字符串str的字符集。
COLLATION(str)	                          获取字符串str的字符排序方法。
LAST_INSERT_ID()	                  获取最近生成的AUTO_INCREMENT值

NOW()                                     返回当前时间

 

引用 OLDGUO

image-20221209101435395

SQL 含义

SQL是什么? 结构化的语言
数据作为对象为不同种类的数据操作 做了不同的分类
DDL  数据定义语言 
DCL  数据控制语言
DML  数据操作语言
DQL  数据查询语言



1. 库的定义

库名和表名必须使用小写 切记!

故障分析:测试环境正常,正式环境报错,windows大小写不敏感,库名或者表名使用了大小字母。

DDL  数据定义语言
     定义库: 库名 库属性

查看库
show databases;
show create database user;  查看库的属性。
添加数据库

CREATE DATABASE `test` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';

删
drop database test;

修改库
alter database db charset gbk;

进入库的命令:
use 库名




不指定字符集的时候,默认字符集是什么?
拉丁语

创建数据的时候的字符集的指定:
utf8mb4  能够兼容4个字节的unicode编码 

面试题:  在mysql中存储表情的话,创建库的时候应该指定什么字符集?为什么?
  解:1、表情是使用4个字节存储, 在MySQL中可以使用utf-32 或者 utf8mb4
     2、utf-32 太过于浪费空间,不推荐使用
     3、mysql的utf-8的字符集能够兼容3个字节的unicode编码,而不是4个。为了兼容utf-8,MySQL推出发布utf-8mb4字符集。

排序规则:  
utf8mb4_unicode_ci 根据unicode进行排序,排序精确
utf8mb4_general_ci 排序的效率更高,排序的精度不要求,所以通常情况推荐general

2. 表定义

# 创建表的时候,不指定字符集的话,默认继承库的属性。
CREATE TABLE `test`.`test`  (
  `id` int
); 
----------
CREATE TABLE `student` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

查看表的属性或者叫查看建表的信息  show  create table student;

删表 
delete database userdb;

表的数据清空
清空表 delete from 表名; 或 truncate table 表名;(速度快、无法回滚撤销等)

表的列 增删改查

表的字段的增删改查

 添加列 

    alter table 表名 add 列名 类型;
    alter table 表名 add 列名 类型 DEFAULT 默认值;
    alter table 表名 add 列名 类型 not null default 默认值;
    alter table 表名 add 列名 类型 not null primary key auto_increment;
    ```

  - 删除列

    alter table 表名 drop column 列名;


  - 修改列 类型


    alter table 表名 modify column 列名 类型;


  - 修改列 类型 + 名称


    alter table 表名 change 原列名 新列名 新类型;


    alter table  tb change id nid int not null;
    alter table  tb change id id int not null default 5;
    alter table  tb change id id int not null primary key auto_increment;
    
    alter table  tb change id id int; -- 允许为空,删除默认值,删除自增。


  - 修改列 默认值


    ALTER TABLE 表名 ALTER 列名 SET DEFAULT 1000;


  - 删除列 默认值

    ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;

  只能有一个自增列【自增列,一般都是主键】
  - 添加主键

    alter table 表名 add  key(列名);

  - 删除主键

    alter table 表名 drop primary key;

3 字段类型的说明

数字

数字类型 int [(m)][unsigned][zerofill]
  
int			   表示有符号,取值范围:-2147483648 ~ 2147483647
建表语句: create table stone(id int);

show create table stone1
#  默认是int字节数是11个


int unsigned	表示无符号,取值范围:0 ~ 4294967295

建表语句: create table stone5(id int unsigned) default charset=utf8;
# 不需要使用负数的时候 默认10字节

int(5)zerofill	仅用于显示,当不满足5位时,按照左边补0,
例如:00002;满足时,正常显示。
create table stone6 (id int(5)zerofill) default charset=utf8;
默认5字节


tinyint[(m)]  [unsigned] [zerofill]
  有符号,取值范围:-128 ~ 127.
  无符号,取值范围:0 ~ 255

建表语句: create table stone7(id tinyint unsigned ); 
一般使用作为年龄的字段 


bigint[(m)][unsigned][zerofill]
  有符号,取值范围:-9223372036854775808 ~ 9223372036854775807
  无符号,取值范围:0  ~  18446744073709551615

一般用不到



mysql> create table stone(id int, uid int unsigned, zid int(5) zerofill);
Query OK, 0 rows affected (0.03 sec)


浮点型的  
decimal[(m[,d])] [unsigned] [zerofill]
准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
如果存入的小数的位数超过规定的位数,那么后一位是四舍五入的。


  例如:
  create table L2(
  	id int not null primary key auto_increment,
  	salary decimal(8,2)
  )default charset=utf8;
  mysql> select * from L2;
  +----+-----------+
  | id | salary    |
  +----+-----------+
  |  1 |      1.28 |
  |  2 |      5.29 |
  |  3 |      5.28 |
  |  4 | 512132.28 |
  |  5 | 512132.28 |
  +----+-----------+
  5 rows in set (0.00 sec)


FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
  单精度浮点数,非准确小数值,m是数字总个数,d是小数点后个数。

32位的存储

DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
  双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
64位的存储



总结 :  根据业务的量去选择类型,结合数据库的性能去优化,
       比如人类的年龄是1-100之间,如果直接用int ,浪费空间 选择 tinyint unsigned  才是切合实际的优化方向。

字符串

char(m)
   char(10) 就是就划定10个字节,爱用不用,数据超过就报错,数据小于10个字节,剩下的空着就空着
                  缺点: 如果设置过大会,浪费空间
                  优点: 不会对插入有影响。
  定长字符串,m代表字符串的长度,最多可容纳255个字符。
  定长的体现:即使内容长度小于m,也会占用m长度。例如:char(5),数据是:yes,底层也会占用5个字符;如果超出m长度限制(默认MySQL是严格模式,所以会报错)。
  
      知道就好,不要用。。。。。
      如果在配置文件中加入如下配置,
      sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
      保存并重启,此时MySQL则是非严格模式,此时超过长度则自动截断(不报错)。。
  
  注意:默认底层存储是固定的长度(不够则用空格补齐),但是查询数据时,会自动将空白去除。
  如果想要保留空白,在sql-mode中加入 PAD_CHAR_TO_FULL_LENGTH 即可。
  查看模式sql-mode,执行命令:show variables  like 'sql_mode';
  
  一般适用于:固定长度的内容。
  
  create table L3(
      id int not null primary key auto_increment,
      name varchar(5),
      depart char(3)
  )default charset=utf8;
  
  insert into L3(name,depart) values("alexsb","sbalex");

varchar(m)
      varchar(30) 大白话就是先申请30个字节空间,有多少数据,就插入多少数据。
                  缺点: 先提前计算数据的大小,对插入性能有影响
                  优点:索引会对数值进行计算,数值越小,树就越小,性能查询就越快。

变长字符串,m代表字符串的长度,最多可容纳65535个字节。
  变长的体现:内容小于m时,会按照真实数据长度存储;如果超出m长度限制((默认MySQL是严格模式,所以会报错)。
      
      知道就好,不要用。。。。。
      如果在配置文件中加入如下配置,
          sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
      保存并重启,此时MySQL则是非严格模式,此时超过长度则自动截断(不报错)。    
  
  例如:
  create table L3(
      id int not null primary key auto_increment,
      name varchar(5),
      depart char(3)
  )default charset=utf8;

  mysql> create table L3(id int not null primary key auto_increment,name varchar(5),depart char(3))default charset=utf8;

  
  -- 如果 sql-mode 中加入了 PAD_CHAR_TO_FULL_LENGTH ,则查询时char时空白会保留。
  mysql> select name,length(name),depart,length(depart) from L3;
  +-------+--------------+--------+----------------+
  | name  | length(name) | depart | length(depart) |
  +-------+--------------+--------+----------------+
  | w |            2 | WU     |              3 |
  | w1 |            5 | ALS    |              3 |
  +-------+--------------+--------+----------------+
  4 rows in set (0.00 sec)


text
  text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。
  一般情况下,长文本会用text类型。例如:文章、新闻等。
  create table L4(
  	id int not null primary key auto_increment,
      title varchar(128),
  	content text
  )default charset=utf8;


mediumtext
  A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
longtext

  A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1)


 总结 通常使用字符串是 varchar(255)

时间

datetime
  YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59)


timestamp
  YYYY-MM-DD HH:MM:SS(1970-01-01 00:00:00/2037年)

  对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储,查询时,将其又转化为客户端当前时区进行返回。
  
  对于DATETIME,不做任何改变,原样输入和输出。

  mysql> create table L5(
      -> id int not null primary key auto_increment,
      -> dt datetime,
      -> tt timestamp
      -> )default charset=utf8;
  Query OK, 0 rows affected (0.03 sec)
  
  mysql> insert into L5(dt,tt) values("2025-11-11 11:11:44", "2025-11-11 11:11:44");
  
  mysql> select * from L5;
  +----+---------------------+---------------------+
  | id | dt                  | tt                  |
  +----+---------------------+---------------------+
  |  1 | 2025-11-11 11:11:44 | 2025-11-11 11:11:44 |
  +----+---------------------+---------------------+
  1 row in set (0.00 sec)
  
  mysql> show variables like '%time_zone%';
  +------------------+--------+
  | Variable_name    | Value  |
  +------------------+--------+
  | system_time_zone | CST    | 
  | time_zone        | SYSTEM |
  +------------------+--------+
  2 rows in set (0.00 sec)
  -- “CST”指的是MySQL所在主机的系统时间,是中国标准时间的缩写,China Standard Time UT+8:00
  
  mysql> set time_zone='+0:00';
  Query OK, 0 rows affected (0.00 sec)
  
  mysql> show variables like '%time_zone%';
  +------------------+--------+
  | Variable_name    | Value  |
  +------------------+--------+
  | system_time_zone | CST    |
  | time_zone        | +00:00 |
  +------------------+--------+
  2 rows in set (0.01 sec)
  
  mysql> select * from L5;
  +----+---------------------+---------------------+
  | id | dt                  | tt                  |
  +----+---------------------+---------------------+
  |  1 | 2025-11-11 11:11:44 | 2025-11-11 03:11:44 |
  +----+---------------------+---------------------+
  1 row in set (0.00 sec)


date
  YYYY-MM-DD(1000-01-01/9999-12-31)

time
  HH:MM:SS('-838:59:59'/'838:59:59')


总结 时间使用 datetime 
     如果是国际网站的话 使用timestamp ,会根据系统的时区转换。

枚举类型

ENUM('m','f')

相当于布尔
通常使用 男 女 开启关闭等状态的场景

 1  2  3  从其中的选项选择,不一定只有2个。

约束

主键  相当于身份证号码 只能唯一。
     既然唯一,那么就不能为null值,
     第一个约束:  not null 不能为空
     第二个约束:   primary key 主键   或者 unique key
     第三个约束:   AUTO_INCREMENT  自增长
     第四个约束:   defaulf 'True'  默认值
     第五个约束:  conment '注释123'  注释 一定要加
     
   

posted @ 2022-12-09 10:59  mmszxc  阅读(62)  评论(0)    收藏  举报