SQL笔记
目录
复制数据 SELECT INTO,INSERT INTO SELECT
AUTO INCREMENT,在每次插入新记录时,自动地创建主键字段的值。
GROUP BY,结合聚合函数,根据一个或多个列对结果集进行分组
管理MySQL
- 开启服务 net start mysql
- 关闭服务 net stop mysql 或 mysqladmin -u root shutdown -p
- 连接到数据库 mysql -u root -p
事务
多条语句作为一个整体进行操作的功能,称为数据库事务。要么全部成功,要么全部失败
- 使用,begin; ... commit;
- 主动让事务失败,使用,begin; ... rollback;
隔离级别:
Read Uncommited,读了修改后未提交的,后来又撤回了,读到了脏数据
Read Commited,读到了commited前后的数据,数据不一致
Repeatable Read,读了多次读不到,但后来更新成功了,就读到了
Serializable,脏读,不可重复度读,幻读都不会出现,事务串行执行,效率大大下降,应用程序性能急剧降低
数据库常用命令
- 创建数据库, CREATE DATABASE db; 或者在命令行下 mysqladmin -u root -p create db
- 删除数据库,DROP DATABASE db; 或者在命令行下 mysqladmin -u root -p drop db
- USE db; 选择数据库,使用该命令后所有的mysql命令都只针对该数据库
-
SHOW DATABASES; 列出所有数据库
- SHOW TABLES; 显示指定数据库的所有表,之前需要使用USE指定数据库
- SHOW COLUMNS FROM table; 显示数据表的字段信息,字段类型,主键信息,是否为NULL,默认值等
- SHOW INDEX FROM table; 显示数据表的索引信息
- SHOW TABLE STATUS [FROM db] [LIKE ''pattern]\G; 显示系统性能及统计信息,所有表的,或某个表的,\G按列输出
- 查看表结构,DESC table;
- 查看创建时的SQL语句,SHOW CREATE TABLE table;
创建表,删除表,CREATE,DROP
CREATE TABLE IF NOT EXISTS runoob_tb1 (
runoob_id INT UNSIGNED AUTO_INCREMENT, # 自增
runoob_title VARCHAR(100) NOT NULL, # 非空
runoob_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY (runoob_id) # 添加主键
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 删除表
DROP TABLE table_name
ALTER TABLE ,添加、删除或修改列,修改约束
# 添加列
ALTER TABLE table_name
ADD column_name datatype
# 删除列
ALTER TABLE table_name
DROP COLUMN column_name
# 改变类型 SQL Serever
ALTER TABLE table_name
ALTER COLUMN column_name datatype
# 改变类型 MySQL
ALTER TABLE table_name
MODIFY COLUMN column_name datatype
#修改表,改列名和类型,
alter table test change column birth varchar(10) not null;
查询数据 SELECT
- 基本查询
SELECT * FROM runoob_tbl; # 查询所有
SELECT # *号代替其他字段
runoob_id AS id, # 设置别名,可以省略as
runoob_title title,
runoob_author author,
submission_date date
FROM runoob_tbl t1 # 设置别名t1,也可以查多个表,用逗号隔开
LIMIT 2 OFFSET 1; # limit 设定返回记录数,offset设置偏移量,默认为0
SELECT column_name,column_name
FROM table_name; # 多表查询时返回乘积
- 条件查询
SELECT * FROM students WHERE score >= 80;
SELECT * FROM students WHERE score >= 80 AND gender = 'M'; # AND 查询
SELECT * FROM students WHERE score >= 80 OR gender = 'M'; # OR 查询
SELECT * FROM students WHERE NOT class_id = 2; # NOT 查询
# 多个条件查询
SELECT * FROM students WHERE (score < 80 OR score > 90) AND gender = 'M';
- 去重查询
SELECT DISTINCT column_name,column_name
FROM table_name;
- 排序查询
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;
插入 INSERT INTO
INSERT INTO table_name # 插入所有列时可以省略字段
VALUES (value1,value2,value3,...);
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
INSERT INTO runoob_tbl
(runoob_title, runoob_author, submission_date) # 插入所有字段时可以省略
VALUES
("学习 PHP", "菜鸟教程", NOW()), # 可以一下插入多条
("学习 MySQL", "菜鸟教程", NOW()),
("JAVA 教程", "RUNOOB.COM", '2016-05-06');
# insert into 后面可以跟select,将结果插入表中,只要列是对应的就可以
# 插入或替换,
replace info test (...) values (...);
# 插入或更新,
insert info test (...) values (...) on duplicate key update name='1', score='2';
# 插入或忽略,
insert info test (...) values (...);
更新 UPDATE
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
# 使用replace函数替代将某些值替换
UPDATE runoob_tbl SET runoob_title = REPLACE(runoob_title,'JAVA 教程','C++');
WHERE runoob_id = 26; # 使用replace函数替换某些值
删除 DELETE
DELETE FROM table_name
WHERE some_column=some_value; # 省略了where删除所有内容
# 删除表中所有数据
TRUNCATE TABLE table_name; # 速度比delete快,见https://www.cnblogs.com/zhoufangcheng04050227/p/7991759.html
TOP,规定要返回的记录的数目
并非所有的数据库系统都支持 SELECT TOP子句
SQL server
SELECT TOP number|percent column_name(s) # 也支持百分比
FROM table_name;
MySQL语法
SELECT column_name(s)
FROM table_name
LIMIT number;
操作符
LIKE,IN,BETWEEN(可以用于时间),(NOT, AND, OR, 别名AS)
- LIKE 操作符,用于在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;
MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。不支持[charlist]和[^charlist]或[!charlist]
# 正则表达式 MySQL
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';
通配符:% 代表0个或多个字符,_代表一个字符,[charlist]代表字符列表中的任何单一字符,[^charlist]或[!charlist]表示不再字符列表中的任何单一字符,也可以结合NOT AND OR,
- 操作符 IN,允许在 WHERE 子句中规定多个值。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
- BETWEEN 操作符,选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
- AS,给表名或列名取别名,使用.引用表的列
SELECT column_name AS alias_name
FROM table_name AS alias_name;
CONCAT函数把字符连在一起
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
FROM Websites;
连接 JOIN,UNION
-
JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
join = inner join,left join = left outer join,right join = right outer join,full join = full outer join
INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行
- UNION 操作符用于合并两个或多个 SELECT 语句的结果集。默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SELECT column_name(s) FROM table1
UNION # UNION ALL允许重复值
SELECT column_name(s) FROM table2;
复制数据 SELECT INTO,INSERT INTO SELECT
- SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT 。
SELECT *
INTO newtable [IN externaldb]
FROM table1;
# 或只是希望的列
SELECT column_name(s)
INTO newtable [IN externaldb]
FROM table1;
- INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。
INSERT INTO table2
SELECT * FROM table1;
# 或者只复制希望的列到已存在的表中
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;
CONSTRAINT,约束
- 约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);
# 修改表的约束
ALTER TABLE Persons
MODIFY Age int NOT NULL;
NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。
DEFAULT - 规定没有给列赋值时的默认值。
- NOT NULL 约束
# 创建时添加约束
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Age int
);
# 对于已有的表添加NOT NULL
ALTER TABLE Persons
MODIFY Age int NOT NULL;
# 删除 NOT NULL约束
ALTER TABLE Persons
MODIFY Age int NULL;
- UNIQUE约束
# 创建表时添加 UNIQUE约束
CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
CREATE TABLE Persons # 或者写在后面,或者unique key (P_Id)
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)
CREATE TABLE Persons # 命名或定义多个列的约束
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)
# 对于已创建的表添加 UNIQUE 约束
ALTER TABLE Persons
ADD UNIQUE (P_Id)
ALTER TABLE Persons # 命名或定义多个列的约束
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
# 撤销约束
ALTER TABLE Persons # 撤销用constraint 命名的
DROP CONSTRAINT uc_PersonID
ALTER TABLE Persons # 撤销一个的,也可以用drop key https://zhidao.baidu.com/question/547479964.html
DROP INDEX uc_PersonID
- PRIMARY KEY
# 创建表时添加
CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
CREATE TABLE Persons # 命名或定义多个为主键
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
# 对于已创建的
# 如果使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
ALTER TABLE Persons # 命名或多个列为主键
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
# 撤销主键
ALTER TABLE Persons
DROP PRIMARY KEY
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
- FOREIGN KEY
# 创建表时
CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)
# 对于已经创建的表
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
#撤销
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
- CHECK
# 创建表时
CREATE TABLE Persons
(
P_Id int NOT NULL CHECK (P_Id>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
)
# 对于已存在的表
ALTER TABLE Persons
ADD CHECK (P_Id>0)
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
# 撤销
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
ALTER TABLE Persons
DROP CHECK chk_Person
- DEFAULT
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
OrderDate date DEFAULT GETDATE() # 函数也可以
)
# 对于已存在的表
ALTER TABLE Persons # MySQL
ALTER City SET DEFAULT 'SANDNES'
ALTER TABLE Persons # SQL Serever
ADD CONSTRAINT ab_c DEFAULT 'SANDNES' for City
# 撤销
ALTER TABLE Persons # MySQL
ALTER City DROP DEFAULT
ALTER TABLE Persons # SQL Serever
ALTER COLUMN City DROP DEFAULT
INDEX,添加索引,删除索引
# SQL Serever
CREATE INDEX index_name # 创建索引
ON table_name (column_name) # 可以为多个列
CREATE UNIQUE INDEX index_name # 创建唯一索引
ON table_name (column_name)
# MySQL
ALTER TABLE students
ADD INDEX idx_name_score (name, score);
ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);
ALTER TABLE students # 添加唯一性约束不建索引
ADD CONSTRAINT uni_name UNIQUE (name);
# 删除索引 SQL Serever
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID # uc_PersonID 为唯一性约束
# 删除索引 MySQL
DROP INDEX table_name.index_name # SQL server
ALTER TABLE table_name DROP INDEX index_name
AUTO INCREMENT,在每次插入新记录时,自动地创建主键字段的值。
# SQL Serever
CREATE TABLE Persons
(
ID int IDENTITY(1,1) PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
# MySQL
CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)
视图
# 创建视图
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
# 更新视图
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
# SQL Serever 更新视图
ALTER VIEW [ schema_name . ] view_name [ ( column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ] [ ; ]
<view_attribute> ::=
{
[ ENCRYPTION ]
[ SCHEMABINDING ]
[ VIEW_METADATA ]
}
# 删除视图
DROP VIEW view_name
日期
SQL Serever 时间函数
GETDATE() | 返回当前的日期和时间 |
DATEPART() | 返回日期/时间的单独部分 |
DATEADD() | 在日期中添加或减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的时间 |
CONVERT() | 用不同的格式显示日期/时间 |
SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:
- DATE - 格式:YYYY-MM-DD
- DATETIME - 格式:YYYY-MM-DD HH:MM:SS
- SMALLDATETIME - 格式:YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式:唯一的数字
MySQL 时间函数
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE() | 提取日期或日期/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间的单独部分 |
DATE_ADD() | 向日期添加指定的时间间隔 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
- DATE - 格式:YYYY-MM-DD
- DATETIME - 格式:YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
- YEAR - 格式:YYYY 或 YY
NULL函数
NULL无法通过等于判断,通过IS NULL 或IS NOT NULL判断。
# ISNULL函数 SQL Serever
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
# IFNULL函数 MySQL
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
# 或者使用coalescs MySQL
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products
SQL Server 数据类型
String 类型:
数据类型 | 描述 | 存储 |
---|---|---|
char(n) | 固定长度的字符串。最多 8,000 个字符。 | Defined width |
varchar(n) | 可变长度的字符串。最多 8,000 个字符。 | 2 bytes + number of chars |
varchar(max) | 可变长度的字符串。最多 1,073,741,824 个字符。 | 2 bytes + number of chars |
text | 可变长度的字符串。最多 2GB 文本数据。 | 4 bytes + number of chars |
nchar | 固定长度的 Unicode 字符串。最多 4,000 个字符。 | Defined width x 2 |
nvarchar | 可变长度的 Unicode 字符串。最多 4,000 个字符。 | |
nvarchar(max) | 可变长度的 Unicode 字符串。最多 536,870,912 个字符。 | |
ntext | 可变长度的 Unicode 字符串。最多 2GB 文本数据。 | |
bit | 允许 0、1 或 NULL | |
binary(n) | 固定长度的二进制字符串。最多 8,000 字节。 | |
varbinary | 可变长度的二进制字符串。最多 8,000 字节。 | |
varbinary(max) | 可变长度的二进制字符串。最多 2GB。 | |
image | 可变长度的二进制字符串。最多 2GB。 |
Number 类型:
数据类型 | 描述 | 存储 |
---|---|---|
tinyint | 允许从 0 到 255 的所有数字。 | 1 字节 |
smallint | 允许介于 -32,768 与 32,767 的所有数字。 | 2 字节 |
int | 允许介于 -2,147,483,648 与 2,147,483,647 的所有数字。 | 4 字节 |
bigint | 允许介于 -9,223,372,036,854,775,808 与 9,223,372,036,854,775,807 之间的所有数字。 | 8 字节 |
decimal(p,s) | 固定精度和比例的数字。 允许从 -10^38 +1 到 10^38 -1 之间的数字。 p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。 s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。 | 5-17 字节 |
numeric(p,s) | 固定精度和比例的数字。 允许从 -10^38 +1 到 10^38 -1 之间的数字。 p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。 s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。 | 5-17 字节 |
smallmoney | 介于 -214,748.3648 与 214,748.3647 之间的货币数据。 | 4 字节 |
money | 介于 -922,337,203,685,477.5808 与 922,337,203,685,477.5807 之间的货币数据。 | 8 字节 |
float(n) | 从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 n 参数指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。 | 4 或 8 字节 |
real | 从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。 | 4 字节 |
Date 类型:
数据类型 | 描述 | 存储 |
---|---|---|
datetime | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。 | 8 字节 |
datetime2 | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。 | 6-8 字节 |
smalldatetime | 从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。 | 4 字节 |
date | 仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 | 3 bytes |
time | 仅存储时间。精度为 100 纳秒。 | 3-5 字节 |
datetimeoffset | 与 datetime2 相同,外加时区偏移。 | 8-10 字节 |
timestamp | 存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 值基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。 |
MySQL 数据类型
在 MySQL 中,有三种主要的类型:Text(文本)、Number(数字)和 Date/Time(日期/时间)类型。
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, size 默认为 6。 |
MEDIUMINT(size) | 带符号范围-8388608到8388607,无符号的范围是0到16777215。 size 默认为9 |
INT(size) | 带符号范围-2147483648到2147483647,无符号的范围是0到4294967295。 size 默认为 11 |
BIGINT(size) | 带符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615。size 默认为 20 |
FLOAT(size,d) | 带有浮动小数点的小数字。在 size 参数中规定显示最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DOUBLE(size,d) | 带有浮动小数点的大数字。在 size 参数中规显示定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DECIMAL(size,d) | 作为字符串存储的 DOUBLE 类型,允许固定的小数点。在 size 参数中规定显示最大位数。在 d 参数中规定小数点右侧的最大位数。 |
注意:以上的 size 代表的并不是存储在数据库中的具体的长度,如 int(4) 并不是只能存储4个长度的数字。
实际上int(size)所占多少存储空间并无任何关系。int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。就是在显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。
例如:
1、int的值为10 (指定zerofill)
int(9)显示结果为000000010 int(3)显示结果为010
就是显示的长度不一样而已 都是占用四个字节的空间
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
GROUP BY,结合聚合函数,根据一个或多个列对结果集进行分组
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
HAVING筛选分组后的各组数据
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
SQL函数
聚合函数
- AVG() - 返回平均值
- COUNT() - 返回行数
- FIRST() - 返回第一个记录的值
- LAST() - 返回最后一个记录的值
- MAX() - 返回最大值
- MIN() - 返回最小值
- SUM() - 返回总和
标量函数
- UCASE() - 将某个字段转换为大写
- LCASE() - 将某个字段转换为小写
- MID() - 从某个文本字段提取字符,MySql 中使用
- SubString(字段,1,end) - 从某个文本字段提取字符
- LEN() - 返回某个文本字段的长度
- ROUND() - 对某个数值字段进行指定小数位数的四舍五入
- NOW() - 返回当前的系统日期和时间
- FORMAT() - 格式化某个字段的显示方式
本文来自博客园,作者:Bingmous,转载请注明原文链接:https://www.cnblogs.com/bingmous/p/15643747.html