mysql总结

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: -

数据类型

在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。

Text 类型:

数据类型

描述

CHAR(size)

保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。

VARCHAR(size)

保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。

注释:如果值的长度大于 255,则被转换为 TEXT 类型。

TINYTEXT

存放最大长度为 255 个字符的字符串。

TEXT

存放最大长度为 65,535 个字符的字符串。

BLOB

用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。

MEDIUMTEXT

存放最大长度为 16,777,215 个字符的字符串。

MEDIUMBLOB

用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。

LONGTEXT

存放最大长度为 4,294,967,295 个字符的字符串。

LONGBLOB

用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。

ENUM(x,y,z,etc.)

允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。

注释:这些值是按照你输入的顺序存储的。

可以按照此格式输入可能的值:ENUM('X','Y','Z')

SET

与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。

Number 类型:

数据类型

描述

TINYINT(size)

-128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。

SMALLINT(size)

-32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。

MEDIUMINT(size)

-8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。

INT(size)

-2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。

BIGINT(size)

-9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*。在括号中规定最大位数。

FLOAT(size,d)

带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。

DOUBLE(size,d)

带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。

DECIMAL(size,d)

作为字符串存储的 DOUBLE 类型,允许固定的小数点。

* 这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。

Date 类型:

数据类型

描述

DATE()

日期。格式:YYYY-MM-DD

注释:支持的范围是从 '1000-01-01' 到 '9999-12-31'

DATETIME()

*日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'

TIMESTAMP()

*时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描述来存储。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC

TIME()

时间。格式:HH:MM:SS

注释:支持的范围是从 '-838:59:59' 到 '838:59:59'

YEAR()

2 位或 4 位格式的年。

注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。

* 即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。

------创建数据库表等操作------

创建数据库

CREATE DATABASE my_db

创建表

CREATE TABLE table_name

(

Id_P int,

LastName varchar(255),

FirstName varchar(255),

Address varchar(255),

City varchar(255)

)

数据类型

数据类型

描述

  • integer(size)
  • int(size)
  • smallint(size)
  • tinyint(size)

仅容纳整数。在括号内规定数字的最大位数。

  • decimal(size,d)
  • numeric(size,d)

容纳带有小数的数字。

"size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。

char(size)

容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。

在括号中规定字符串的长度。

varchar(size)

容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。

在括号中规定字符串的最大长度。

date(yyyymmdd)

容纳日期。

DROP

可以轻松地删除索引、表和数据库。

--删除数据库

DROP DATABASE db_name

--删除表

DROP TABLE table_name

--清空表数据

TRUNCATE TABLE table_name

ALTER

ALTER TABLE 语句用于在已有的表中添加、修改或删除列。

注释:某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。

mysql在nivicat15能删除列,但是修改格式失败

--添加列

ALTER TABLE table_name

ADD column_name datatype

--删除列

ALTER TABLE table_name

DROP COLUMN column_name

--修改列(修改时如果数据类型无法转换会失败)

ALTER TABLE table_name

ALTER COLUMN column_name datatype

--删除索引

ALTER TABLE table_name DROP INDEX index_name


约束

  • NOT NULL - 指示某列不能存储 NULL 值。(不为空)
  • UNIQUE - 保证某列的每行必须有唯一的值。(唯一)
  • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。(不为空+唯一)
  • FOREIGN KEY- 保证一个表中的数据匹配另一个表中的值的参照完整性。
  • CHECK - 保证列中的值符合指定的条件。(符合条件)
  • DEFAULT - 规定没有给列赋值时的默认值。(默认)

NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

PRIMARY KEY与UNIQUE

PRIMARY KEY = UNIQUE + NOT NULL

UNIQUE:每个元素都唯一,可以为空

PRIMARY KEY:复合主键,和唯一就可以

区别

1.作为Primary Key的域/域组不能为null,而Unique Key可以。

2.一个表里只允许一个Primary Key,但可以多个Unique Key。

3.Primary Key是列和唯一,Unique Key每列都唯一。


--Unique

--设置UNIQUE 约束--是一个索引

ALTER TABLE table_name

ADD UNIQUE(id)

--设置多个UNIQUE 约束(多个约束放一起,但每个约束都唯一)

ALTER TABLE table_name

ADD CONSTRAINT idss UNIQUE (id,ids)

--撤销UNIQUE 约束

ALTER TABLE table_name

DROP INDEX id



--Primary Key

--设置单主键约束

ALTER TABLE table_name

ADD PRIMARY KEY (id)

--设置联合约束

ALTER TABLE table_name

ADD CONSTRAINT book_id PRIMARY KEY (id,name)

--撤销主键约束(该写法mysql撤销单主键和联合主键都可以)

ALTER TABLE table_name

DROP PRIMARY KEY

自动设置not null

在mysql设自动递增需要设置主键

FOREIGN KEY

FOREIGN KEY 约束用于预防破坏表之间连接的行为。

FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

--设置外键

--前提:依赖表需要设置该列为主键会默认起个外键名tbl_book_copy1_ibfk_1

ALTER TABLE table_name

ADD FOREIGN KEY (ids)

REFERENCES 依赖表(ids)

--建议使用下面这种

ALTER TABLE table_name

ADD CONSTRAINT book_ids

FOREIGN KEY (ids)

REFERENCES 依赖表(ids)

--撤销外键

ALTER TABLE table_name

DROP FOREIGN KEY book_ids

CHECK

CHECK 约束用于限制列中的值的范围

--单个限制成功

ALTER TABLE table_name

ALTER name DROP DEFAULT

--多个约束同时失败

ALTER TABLE table_name

ADD CHECK (ids<45)

ADD CONSTRAINT ck_book CHECK (ids<45 AND type='小说')

这个约束在mysql有点特别,且在navicat上无法查看

但可以采用其他方式实现对数据限制约束

有两种方法:

  • 在 MySQL 种约束,如使用ENUM 类型或者触发器
  • 在应用程序里面对数据进行检查再插入。

ENUM 实现限制功能

CREATE TABLE person(

id tinyint(4) NOT NULL AUTO_INCREMENT,

   name varchar(16) NOT NULL,

   sex enum('男','女') NOT NULL

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DEFAULT

DEFAULT 约束用于向列中插入默认值

--设置默认

ALTER TABLE table_name

ALTER COLUMN name SET DEFAULT'java'

--撤销默认

ALTER TABLE table_name

ALTER name DROP DEFAULT

索引

在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

您可以在表中创建索引,以便更加快速高效地查询数据。

用户无法看到索引,它们只能被用来加速搜索/查询。

有索引的表更新时花费时间也更多,因此在常用的列上添加索引

--简单索引---允许使用重复的值

CREATE INDEX index_name

ON table_name (column_name)

--唯一索引

CREATE UNIQUE INDEX index_name

ON table_name (column_name)

--降序索引

CREATE INDEX index_name

ON table_name (column_name DESC)

--多列单索引

CREATE INDEX index_name

ON table_name (column_name_01, column_name_02)

--删除索引

ALTER TABLE table_name

DROP INDEX index_name

AUTO_INCREMENT

Auto-increment 会在新记录插入表中时生成一个唯一的数字。

注意:我们通常希望在每次插入新记录时,自动地创建主键字段的值。

因此该关键字只能用于主键,只能有一个主键

MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。

Incorrect table definition; there can be only one auto column and it must be defined as a key

--创建表时设置,记得主键设置

CREATE TABLE Persons

(

P_Id int NOT NULL AUTO_INCREMENT,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

PRIMARY KEY (P_Id)

)

--修改下一次插入时的起始值,不影响之前的

ALTER TABLE Persons AUTO_INCREMENT=100

ORDER BY

ORDER BY 语句用于对结果集进行排序。

left join 和 right join 、inner join的区别

  • INNER JOIN(内连接)中和,两边都有的显示
  • JOIN: 如果表中有至少一个匹配,则返回行
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN(全连接): 只要其中一个表中存在匹配,就返回行

SELECT * FROM `tb_user`

LEFT JOIN tb_brand

on tb_user.id=tb_brand.id


SELECT * FROM `tb_user`

RIGHT JOIN tb_brand

on tb_user.id=tb_brand.id


SELECT * FROM `tb_user`

INNER JOIN tb_brand

on tb_user.id=tb_brand.id

分页

limit

mybatis-注解实现

mybatis-xml实现

mybatis框架pageHelper插件分页

Like-通配符

通配符

描述

%

代表零个或多个字符

_

仅替代一个字符

[charlist]

字符列中的任何单一字符

[^charlist]

或者

[!charlist]

不在字符列中的任何单一字符

SELECT * FROM `tbl_book` WHERE id NOT LIKE '%1'

BETWEEN ... AND

不同数据库操作符的处理方式是有差异的,对两边数据是否包含有不同操作

//以外使用NOT BETWEEN

SELECT * FROM `tbl_book` WHERE id BETWEEN 1 AND 10

SQL Alias(别名)

UNION 和 UNION ALL

合并

前者会去重,后者全合并

注意:UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

VIEW(视图)

什么是视图?

在 SQL 中,视图是基于 SQL 语句的结果集可视化的表。

视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。

注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。

注意!!不要用视图来更新,可以改变视图的数据多少,但不要改变具体的数据

视图的作用,只是用来简化嵌套查询,把一些常用的,相对简单的查询结果做成视图,一来查询简便,二来,可以简化嵌套查询。

如果视图中数据是来自于一个表时,修改视图中的数据,表数据会更新。而且修改表中数据时,对应视图也会更新。但是如果视图数据来源于两个表时,修改视图数据时会报错,无法修改。

注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。

--创建视图

CREATE VIEW view_name AS

SELECT column_name(s)

FROM table_name

WHERE condition

--删除视图

DROP VIEW view_name

--修改视图

ALTER VIEW view_name AS

SELECT column_name(s)

FROM table_name

WHERE condition

原因

某些视图是可更新的。也就是说,可以使用 UPDATE、DELETE 或 INSERT 等语句更新基本表的内容。对于可更新的视图,视图中的行和基本表的行之间必须具有一对一的关系。

还有一些特定的其他结构,这些结构会使得视图不可更新。更具体地讲,如果视图包含以下结构中的任何一种,它就是不可更新的:

  • 聚合函数 SUM()、MIN()、MAX()、COUNT() 等。
  • DISTINCT 关键字。
  • GROUP BY 子句。
  • HAVING 子句。
  • UNION 或 UNION ALL 运算符。
  • 位于选择列表中的子查询。
  • FROM 子句中的不可更新视图或包含多个表。
  • WHERE 子句中的子查询,引用 FROM 子句中的表。
  • ALGORITHM 选项为 TEMPTABLE(使用临时表总会使视图成为不可更新的)的时候。

Date

MySQL Date 函数

函数

描述

NOW()

返回当前的日期和时间

CURDATE()

返回当前的日期

CURTIME()

返回当前的时间

DATE()

提取日期或日期/时间表达式的日期部分

EXTRACT()

返回日期/时间按的单独部分

DATE_ADD()

给日期添加指定的时间间隔

DATE_SUB()

从日期减去指定的时间间隔

DATEDIFF()

返回两个日期之间的天数

DATE_FORMAT()

用不同的格式显示日期/时间

SQL Date 数据类型

MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:

  • DATE - 格式 YYYY-MM-DD
  • DATETIME - 格式: YYYY-MM-DD HH:MM:SS
  • TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
  • YEAR - 格式 YYYY 或 YY

SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:

  • DATE - 格式 YYYY-MM-DD
  • DATETIME - 格式: YYYY-MM-DD HH:MM:SS
  • SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
  • TIMESTAMP - 格式: 唯一的数字

注意格式必须一致,如果不一致查询结果会为空

--模板

SELECT * FROM table_name

WHERE column_name='YYYY-MM-DD'

--举例

SELECT * FROM tbl_book_copy1

WHERE birthday='2022-07-31'

NULL

  • NULL 值是遗漏的未知数据。
  • 注释:无法比较 NULL 和 0;它们是不等价的。
  • --------------------------------------------
  • ISNULL(expr)
  • 如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0。
  • IFNULL(expr1,expr2)
  • 假如expr1不为NULL,则 IFNULL() 的返回值为expr1; 否则其返回值为 expr2。
  • NULLIF(expr1,expr2)
  • 如果expr1 = expr2 成立,那么返回值为NULL,否则返回值为expr1。这和CASE  WHEN expr1 = expr2 THEN NULL ELSE   expr1 END相同。

--查找NULL

SELECT * FROM table_name

WHERE column_name IS NULL

--不为NULL

SELECT * FROM table_name

WHERE column_name IS NOT NULL

--希望 NULL 值为 0时--IFNULL

SELECT IFNULL(column_name,0) FROM table_name

--可以嵌套使用的

SELECT IFNULL(NULLIF(id,ids),1) FROM tbl_book_copy1

查询表名

查询某个数据库中某个表的所有列名

SELECT COLUMN_NAME FROM information_schema.COLUMNS

WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'tb_name';

查询某个数据库中某个表的所有列名,并用逗号连接

SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR ",") FROM information_schema.COLUMNS

WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'tb_name';

注意:只需要替换db_name(数据库名)和tb_name(表名)

MYSQL函数


SQL函数

SUM()

DATE_FORMAT(date,format)

--查询2020年9月的流水

select

DATE_FORMAT(create_time,'%Y-%m-%d') date,

SUM(pay_price) as pay ,

SUM(refund_price) as refund

from yx_store_order

where DATE_FORMAT(create_time,'%Y') = 2020

AND DATE_FORMAT(create_time,'%m') = 09

GROUP BY DATE_FORMAT(create_time,'%Y-%m-%d')


--查询2020年每个月的流水

select

DATE_FORMAT(create_time,'%Y-%m') date,

SUM(pay_price) as pay ,

SUM(refund_price) as refund

from yx_store_order

where DATE_FORMAT(create_time,'%Y') = 2020

GROUP BY DATE_FORMAT(create_time,'%Y-%m')

AVG()

AVG 函数返回数值列的平均值。NULL 值不包括在计算中。

SELECT AVG(column_name) FROM table_name

--举例--查询订货高于平均的顾客名

SELECT Customer FROM Orders

WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)

COUNT()

COUNT() 函数返回匹配指定条件的行数。

--返回行数

SELECT COUNT(column_name) FROM table_name

where 条件

--返回不重复的行数

SELECT COUNT(DISTINCT column_name) FROM table_name

where 条件

FIRST()与LAST()(mysql无)

FIRST() 函数返回指定的字段中第一个记录的值。

LAST() 函数返回指定的字段中最后一个记录的值。

提示:可使用 ORDER BY 语句对记录进行排序。排序后来找第一个或者最后一个

SELECT FIRST(column_name) FROM table_name

SELECT LAST(column_name) FROM table_name

SELECT ... INTO-建表结构及数据

MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT

select into from 要求目标表不存在,因为在插入时会自动创建;insert into select from 要求目标表存在。

1. 复制表结构及其数据:

create table table_name_new as select * from table_name_old

2. 只复制表结构:

create table table_name_new like table_name_old

3. 只复制表数据:

如果两个表结构一样:

insert into table_name_new select * from table_name_old

如果两个表结构不一样:

insert into table_name_new(column1,column2...) select column1,column2... from table_name_old

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
SQL 搜索推荐 关系型数据库
MySQL 入门教程:全网最全,MySQL 增删改查高级命令硬核总结
MySQL 入门教程:全网最全,MySQL 增删改查高级命令硬核总结
139 0
MySQL 入门教程:全网最全,MySQL 增删改查高级命令硬核总结
|
SQL 存储 Oracle
MySQL总结
一.SQL语句简介 1.什么是SQL? SQL(Structured Query Language):结构化查询语言 其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”
120 0
MySQL总结
|
SQL 存储 前端开发
|
SQL 存储 Oracle
(一)MySQL_数据库概述技术总结
简介:MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,2008年被Sun公司收购,2009年Sun 被Oracle收购。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
226 6
(一)MySQL_数据库概述技术总结
|
关系型数据库 MySQL 数据库
【MySQL】MySQL命令总结 | 数据库与数据表的创建删除与查询
【MySQL】MySQL命令总结 | 数据库与数据表的创建删除与查询
176 0
|
存储 SQL 关系型数据库
MYSQL约束的总结和小练习
约束笔记: 1:主键约束默认是唯一且非空的 2:AUTO_INCREMENT在MYSQL8.0中会将自增主键保存到重做日志中,即使关闭后重启,存储引擎innoDB仍然会根据重做日志初始化计数器内存值。 3:设置了外键约束后,如果要删除主表的内容,则需要先把从表的相关内容给删除。 4:建表时一般设置not null default '' 或default 0,因为nul这个特殊值不好比较,而且查找效率低。 5:外键约束不能跨引擎使用,且mysql中其有一定成本,不适合大并发SQL操作,开发中一般在.
181 0
MYSQL约束的总结和小练习
|
存储 SQL JSON
MySQL技能树学习总结
MySQL技能树学习总结
208 0
MySQL技能树学习总结
|
SQL 关系型数据库 MySQL
mysql中lock tables与unlock tables(锁表/解锁)使用总结
mysql中lock tables与unlock tables(锁表/解锁)使用总结
347 0
|
关系型数据库 MySQL
Mysql常用语法总结
Mysql常用语法总结
99 0