[TOC]
0x00 SQL 高级语句
描述:主要学习数据库的DDL数据库定义语言,比如CREATE , DROP, ALTER 等等:
CREATE 语句
描述:CREATE 语句用于创建数据库和数据表;
- DATABASE 库
- TABLE 表
- INDEX 索引
- VIEW 视图
CREATE DATABASE|TABLE 语句
基础语法:
[TOC]
描述:主要学习数据库的DDL数据库定义语言,比如CREATE , DROP, ALTER 等等:
描述:CREATE 语句用于创建数据库和数据表;
CREATE DATABASE|TABLE 语句
基础语法:
[TOC]
描述:主要学习数据库的DDL数据库定义语言,比如CREATE , DROP, ALTER 等等:
描述:CREATE 语句用于创建数据库和数据表;
CREATE DATABASE|TABLE 语句
基础语法:1
2
3
4
5
6
7
8
9
10
11
12
13-- 创建数据库
CREATE DATABASE dbname;
-- 创建数据库中的表(注意以逗号分隔)
-- # column_name 参数规定表中列的名称。
-- # data_type 参数规定列的数据类型(例如 varchar、integer、decimal、date 等等)。
-- # size 参数规定表中列的最大长度。
-- # Constraints 约束用于规定表中的数据规则。
CREATE TABLE table_name(
column_name1 data_type(size) constraint_name COMMENT '字段描述',
column_name2 data_type(size) constraint_name COMMENT '字段描述',
column_name3 data_type(size) constraint_name COMMENT '字段描述',
);
约束(Constraints)条件:
1.PRIMARY KEY(主键约束) : NOT NULL 和 UNIQUE 的结合
;
确保某列(或两个列多个列的结合)有唯一标识主键(键、值)且主键列不能包含 NULL 值
,有助于更容易更快速地找到表中的一个特定的记录。2.NOT NULL : 指示某列不能存储 NULL 值
;
3.UNIQUE : 保证某列的每行必须有唯一的值
;
每个表可以有多个UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束
。4.FOREIGN KEY:保证一个表中的数据匹配另一个表中的值的参照完整性(不让用户乱删、错改)。
也能防止非法数据插入外键列
因为它必须是它指向的那个表中的值之一。一样是外键表约束主键表,不过这就要求该外键允许取null
)5.CHECK:保证列中的值符合指定的条件。
6.DEFAULT:规定没有给列赋值时的默认值。
7.AUTO INCREMENT字段:会在新记录插入表中时生成一个唯一的数字。
基础实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113-- Constraints 约束实例 --
-- (1) MySQL 约束 : NOT NULL / PRIMARY KEY
CREATE TABLE Persons (
Id INTEGER(10) NOT NULL PRIMARY KEY, -- 方式1:PRIMARY KEY约束(全部数据库)
LastName VARCHAR(255) NOT NULL,
Age int,
Birthday DATE DEFAULT '1970-01-01', -- 注意括号前无, (MySQL)
PRIMARY KEY (Id) -- 方式2:PRIMARY KEY约束
);
-- MySQL / SQL Server / Oracle / MS Access (定义多个列的 PRIMARY KEY 约束)
CREATE TABLE Persons (
Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT PersonID PRIMARY KEY (Id,LastName)
)
-- (2)SQL UNIQUE 约束
-- MySQL:
CREATE TABLE Persons (
Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id)
)
-- SQL Server / Oracle / MS Access:
CREATE TABLE Persons (
P_Id int NOT NULL UNIQUE, -- 关键点:多个数据库的异同
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
-- 如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束
CREATE TABLE UniqueDemo (
Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT PersonID UNIQUE (Id,LastName) -- 关键点:命名UNIQUE约束
)
-- (3) FOREIGN KEY 约束
-- "Persons" 表中的 "P_Id" 列是 "Persons" 表中的 PRIMARY KEY (主键表)
-- "Orders" 表中的 "P_Id" 列是 "Orders" 表中的 FOREIGN KEY (外键表)
-- MySQL:
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(id)
)
-- SQL Server / Oracle / MS Access:
CREATE TABLE Orders (
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(id)
)
-- 命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束 (全部数据库)
-- 注意"Orders" 表中的 "P_Id" 列指向 "Persons" 表中的 "P_Id" 列。
CREATE TABLE Orders(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (P_Id), -- 关键点
CONSTRAINT PersonOrders FOREIGN KEY (P_Id) -- 关键点
REFERENCES Person (id)
)
-- (4) CHECK 约束 在 "Persons" 表创建时在 "P_Id" 列上创建 CHECK 约束。
-- 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),
CHECK (P_Id>0) -- 关键点
)
-- SQL Server / Oracle / MS Access:
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)
)
-- 命名 CHECK 约束,并定义多个列的 CHECK 约束
CREATE TABLE CheckDemo (
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND FirstName='Sandnes')
)
-- (5) DEFAULT 约束
-- 在 "DefaultDemo" 表创建时在 "City" 列上创建 DEFAULT 约束:
CREATE TABLE DefaultDemo (
Id int NOT NULL,
City varchar(255) DEFAULT 'Sandnes',
OrderDate date DEFAULT GETDATE() -- 使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值
)
CREATE INDEX 语句
描述:CREATE INDEX 语句用于在表中创建索引, 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据
。
基础语法:1
2
3
4
5
6
7-- SQL CREATE INDEX 语法
CREATE INDEX index_name
ON table_name (column_name)
-- CREATE UNIQUE INDEX 语法
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
基础实例:1
2
3
4
5
6
7
8
9-- 在 "Persons" 表的 "LastName" 列上创建一个名为 "PIndex" 的索引:
CREATE INDEX PIndex ON Persons (LastName);
-- 如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
CREATE INDEX PIndex ON Persons (LastName, FirstName);
-- 删除索引
show create table Orders; -- 查看创建Table表的语句
ALTER TABLE Orders DROP INDEX PIndex;
show create table Orders;
注意事项:
AUTO_INCREMENT字段
描述:在表中创建一个 auto-increment 字段,每次插入新记录的时候,会自动递增其数值;
MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务,默认地它的开始值是 1,每条新记录递增 1。
基础语法:1
2
3
4
5
6
7
8
9
10
11
12
13
14-- 创建 AUTO INCREMENT 字段
CREATE TABLE SYNTAX (
ID int NOT NULL AUTO_INCREMENT, -- MySQL
ID int IDENTITY(1,1) PRIMARY KEY, -- SQL SERVER (表示以1开始递增为1)
ID Integer PRIMARY KEY AUTOINCREMENT, -- Access (要规定 "ID" 列以 10 起始且递增 5,改为 AUTOINCREMENT(10,5)即可)
)
-- Oracle 的语法
-- 您必须通过 sequence 对象(该对象生成数字序列)创建 auto-increment 字段。
CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
基础实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21-- 把 "Persons" 表中的 "ID" 列定义为 auto-increment 主键字段
CREATE TABLE Persons (
ID int NOT NULL AUTO_INCREMENT, -- 关键点
LastName varchar(255) NOT NULL,
PRIMARY KEY (ID)
)
-- 给存在的colume添加自增语法
ALTER TABLE student CHANGE id id INT( 11 ) NOT NULL AUTO_INCREMENT;
-- MySQL要让 AUTO_INCREMENT 序列以其他的值起始
ALTER TABLE Persons AUTO_INCREMENT=100
-- 自增ID实例SQL语句
DROP TABLE Persons;
CREATE TABLE Persons (
ID int NOT NULL AUTO_INCREMENT, -- 关键点
LastName varchar(255) NOT NULL,
PRIMARY KEY (ID)
);
ALTER TABLE Persons AUTO_INCREMENT=100;
INSERT INTO Persons(LastName) VALUES ('WeiyiGeek'),('Admin');
SELECT * FROM Persons;
描述:ALTER语句用于在已有的表中添加、删除或修改列
。
ALTER 语法:1
2
3
4
5
6
7
8
9
10
11
12-- 表中添加、修改、删除列(类型)
ALTER TABLE table_name ADD column_name datatype
ALTER TABLE table_name MODIFY COLUMN column_name datatype -- MySQL / ORACLE
ALTER TABLE table_name DROP COLUMN column_name
--- SQL Server / MS Access:
ALTER TABLE table_name ALTER COLUMN column_name datatype
-- Oracle 10G 之后版本:
ALTER TABLE table_name MODIFY column_name datatype;
-- 存在的colume修改字段名称以及添加自增语法
ALTER TABLE table_name CHANGE column_name column_name data_type(size) constraint_name AUTO_INCREMENT COMMENT 'Description';
基础实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92-- (0) 添加改变 "Persons" 表中 "DateOfBirth" 列的数据类型。
ALTER TABLE Persons ADD DateOfBirth date
ALTER TABLE user_log ADD COLUMN userPass VARCHAR(255) NOT NULL COMMENT '登陆密码'
ALTER TABLE Persons MODIFY COLUMN DateOfBirth year -- MySQL
ALTER TABLE Persons ALTER COLUMN DateOfBirth year
-- 删除 "Person" 表中的 "DateOfBirth" 列
ALTER TABLE Persons DROP COLUMN DateOfBirth
-- (1) 添加NOT NULL约束
ALTER TABLE Persons
MODIFY Age int NOT NULL;
-- 删除NOT NULL约束
ALTER TABLE Persons
MODIFY Age int NULL;
-- (2) 创建 UNIQUE 约束
ALTER TABLE UniqueDemo
ADD CONSTRAINT PersonID UNIQUE (Id)
-- 撤销 UNIQUE 约束
ALTER TABLE UniqueDemo
DROP INDEX PersonID
-- (3)创建 PRIMARY KEY 约束 、 命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束
-- MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD PRIMARY KEY (Id);
ALTER TABLE Persons
ADD CONSTRAINT PersonID PRIMARY KEY (Id,LastName); -- 设置了约束名称
-- 撤销 PRIMARY KEY 约束
-- MySQL撤销PRIMARY KEY约束时,不论约束条件为一列还是多列(由于PRIMARY KEY唯一性,MYSQL处理办法简单)
CREATE DATABASE Demo;
USE Demo;
CREATE TABLE Person (
id INT NOT NULL,
lastname VARCHAR(255) NOT NULL,
age INT,
addr TEXT,
brithday DATE,
CONSTRAINT psersonID PRIMARY KEY(id,lastname)
);
ALTER TABLE Person DROP PRIMARY KEY;
-- SQL Server / Oracle / MS Access(单列) 关键点
ALTER TABLE Persons
DROP CONSTRAINT Id
-- (若起约束名也可如下多个列)
ALTER TABLE Persons
DROP CONSTRAINT psersonID
-- (4) 创建 FOREIGN KEY 约束
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
-- 定义多个列的 FOREIGN KEY 约束
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
-- 撤销 FOREIGN KEY 约束(制定命名的) MySQL
ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders
-- SQL Server / Oracle / MS Access
ALTER TABLE Orders DROP CONSTRAINT fk_PerOrders
-- 禁用约束(子表的外键约束)
ALTER TABLE 表名 disable constraint 约束名;
-- (5) 创建 CHECK 约束
ALTER TABLE Persons ADD CHECK (P_Id > 0)
ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (P_Id > 0 AND City='Sandnes')
-- 撤销 CHECK 约束(多个列的CHECK约束)
ALTER TABLE Persons DROP CHECK chk_Person -- MySQL
ALTER TABLE Persons DROP CONSTRAINT chk_Person -- SQL Server / Oracle / MS Access:
-- (6) 创建 DEFAULT 约束
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES' -- MySQL
ALTER TABLE Persons MODIFY City DEFAULT 'SANDNES' -- Oracle
ALTER TABLE Persons ADD CONSTRAINT ab_c DEFAULT 'SANDNES' for City -- SQL Server / MS Access
-- 撤销 DEFAULT 约束
ALTER TABLE Persons ALTER City DROP DEFAULT -- MySQL
ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT -- SQL Server / Oracle / MS Access
-- (7) AUTO INCREMENT 递增设置 (为表修改一个字段类型、CONSTRAINT、以及自增)
ALTER TABLE Persons AUTO_INCREMENT=100
ALTER TABLE student CHANGE id id INT( 11 ) NOT NULL AUTO_INCREMENT;
-- (8) 修改火灾添加字段注释
ALTER TABLE Person MODIFY COLUMN id INT COMMENT 'Desc';
补充说明:
1.创建外键约束的方式也可以使用工具plsql
来新增外键约束;
1 | -- 在创建表的时候指定外键约束 |
2.MySql 中如何删除未命名的外键?删除外键需要知道外键的名称,如果创建时没有设置名称则会自动生成一个,你需要获取改外键的信息。
1 | -- 方式1 (值得学习) |
注意事项:
必须把主键列声明为不包含 NULL 值
(在表首次创建时)。对方表关联字段必须是主键
);子表:谁创建外键谁就是子表,父表:这个外键所依赖的表
;1 | #一、删除时,未指定cascade (级联删除)时 |
描述:通过使用 DROP 语句,可以轻松地删除索引、表和数据库(注意删除是立即执行,并且不会留下日志记录)。
基础语法:1
2
3
4
5
6
7
8
9
10
11
12
13
14-- 删除数据库
DROP DATABASE database_name
-- 删除表
DROP TABLE table_name
-- 删除表内的数据,但并不删除表本身
TRUNCATE TABLE table_name
-- 删除表中的索引
ALTER TABLE table_name DROP INDEX index_name -- MySQL
DROP INDEX index_name ON table_name -- MS Access
DROP INDEX table_name.index_name -- MS SQL Server
DROP INDEX index_name -- DB2/Oracle
描述:视图是基于 SQL 语句的结果集的可视化的表, 视图包含行和列就像一个真实的表
, 视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
您可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。
视图的作用:
如何创建、更新和删除视图?1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29-- SQL CREATE VIEW 语法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
-- SQL CREATE OR REPLACE VIEW 语法
[CREATE|REPLACE] VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
-- SQL DROP VIEW 语法
DROP VIEW view_name
-- SQL Server --
-- schema_name: 视图所属架构的名称。
-- view_name: 要更改的视图。
-- column: 将成为指定视图的一部分的一个或多个列的名称(以逗号分隔)。
ALTER VIEW [ schema_name . ] view_name [ ( column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ] [ ; ]
<view_attribute> ::=
{
[ ENCRYPTION ]
[ SCHEMABINDING ]
[ VIEW_METADATA ]
}
基础实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29-- 视图 "Current Product List" 会从 "Products" 表列出所有正在使用的产品(未停产的产品)
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
-- Northwind 样本数据库的另一个视图会计算在 1997 年每个种类的销售总数
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997] -- VIEW 视图的嵌套
GROUP BY CategoryName
-- 向 "Current Product List" 视图添加 "Category" 列
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category -- 关键点
FROM Products
WHERE Discontinued=No
-- 查询视图
SELECT * FROM [Current Product List]
-- 综合实例
INSERT INTO Persons(LastName) VALUES ('木子'),('Weiyi'),('Young');
CREATE VIEW TestID AS
SELECT ID,LastName FROM Persons
WHERE LastName != 'WeiyiGeek';
SELECT * FROM TestID;
desc TestID;
注意事项:
视图总是显示最新的数据
!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。描述:SQL 拥有很多可用于计数和计算的内建函数,可以帮助我们更方便的存储以及获取数据;
描述:在处理日期的时候我们需要确保所插入的日期的格式,与数据库中日期列的格式相匹配;只要您的数据包含的只是日期部分,运行查询就不会出问题。
但是如果涉及时间部分,情况就有点复杂了需要采用内置的函数进行转换后进行匹配;
内建日期处理函数:
函数 | 描述 | 语法 |
---|---|---|
NOW() | 返回当前的日期和时间 | |
CURDATE() | 返回当前的日期 | |
CURTIME() | 返回当前的时间 | |
DATE() | 提取日期或日期/时间表达式的日期部分 | DATE(‘2020-01-09 11:29:33’) |
EXTRACT() | 返回日期/时间的单独部分比如年、月、日、小时、分钟 | EXTRACT(unit值 FROM date字段) |
DATE_ADD() | 向日期添加指定的时间间隔 | DATE_ADD(date,INTERVAL expr type) |
DATE_SUB() | 从日期减去指定的时间间隔 | DATE_SUB(date,INTERVAL expr type) |
DATEDIFF() | 返回两个日期之间的天数 | DATEDIFF(date1,date2) |
DATE_FORMAT() | 用不同的格式显示日期/时间 | DATE_FORMAT(date,format) |
MySQL Date 数据类型存储格式:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88-- year(data):返回data表达式中的公元年分所对应的数值
-- month(data):返回data表达式中的月分所对应的数值
-- day(data):返回data表达式中的日期所对应的数值
-- 注:SQL语言中提供了如下函数,利用这些函数可以很方便地实现按年、月、日进行查询
YEAR - 格式:YYYY 或 YY
DATE - 格式:YYYY-MM-DD
TIME - 格式:HH:MM:SS
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
-- EXTRACT() 函数 unit 参数
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
-- DATE_ADD / DATE_SUB expr 参数值列表
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
-- DATE_FORMAT() 函数用format参数
%a 缩写星期名
%b 缩写月名
%c 月,数值
%D 带有英文前缀的月中的天
%d 月的天,数值(00-31)
%e 月的天,数值(0-31)
%f 微秒
%H 小时(00-23)
%h 小时(01-12)
%I 小时(01-12)
%i 分钟,数值(00-59)
%j 年的天(001-366)
%k 小时(0-23)
%l 小时(1-12)
%M 月名
%m 月,数值(00-12)
%p AM 或 PM
%r 时间,12-小时(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 时间, 24-小时(hh:mm:ss)
%U 周(00-53)星期日是一周的第一天
%u 周(00-53)星期一是一周的第一天
%V 周(01-53)星期日是一周的第一天,与 %X 使用
%v 周(01-53)星期一是一周的第一天,与 %x 使用
%W 星期名
%w 周的天(0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位
函数 | 描述 |
---|---|
GETDATE() | 返回当前的日期和时间 |
DATEPART() | 返回日期/时间的单独部分 |
DATEADD() | 在日期中添加或减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的时间 |
CONVERT() | 用不同的格式显示日期/时间 |
MSSQL Date 数据类型存储格式:
1 | DATE - 格式:YYYY-MM-DD |
基础实例(以MySQL为例):
1 | -- MySQL基础含税 |
补充案例:1
2
3
4
5
6-- 日期条件查询 (注:不同数据库对日期型数据存在差异;)
SELECT * FROM tb_stu WHERE date='2011-04-08'; -- (1)MySQL: 查询日期型数据 (注意单引号)
SELECT * from tb_name WHERE birthday='2011-04-08'; -- (2)SQLServer:
SELECT * from tb_name WHERE birthday=#2011-04-08; -- (3)Access:
-- 按月查询统计数据
SELECT * FROM tb_stu WHERE month(date)='5' ORDER BY date;
描述:函数计算从列中取得的值返回一个单一的值。
基础实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32-- SQL Server、MySQL 和 Oracle 中的 SQL FIRST() 工作区
SELECT TOP 1 name FROM Websites ORDER BY id ASC; -- MSSQL
SELECT name FROM Websites ORDER BY id ASC LIMIT 1; -- MySQL
SELECT name FROM Websites ORDER BY id ASC WHERE ROWNUM <=1; -- ORACLE
select * from person limit 5 offset 2; -- 排除显示前2条数据,藏第三条数据开始依次显示后5条数据
-- SQL Server、MySQL 和 Oracle 中的 SQL LAST() 工作区
SELECT TOP 1 name FROM Websites ORDER BY id DESC; -- MSSQL
SELECT name FROM Websites ORDER BY id DESC LIMIT 1; -- MySQL
SELECT name FROM Websites ORDER BY id DESC WHERE ROWNUM <=1; -- ORACLE
-- ROUND() 函数示例
mysql> select ROUND(-1.23); -- -1 返回参数X的四舍五入的一个整数
mysql> select ROUND(1.58); -- -2
mysql> select ROUND(1.298, 1); -- -> 1.3 返回参数X的四舍五入的有 D 位小数的一个数字。
mysql> select ROUND(1.298, 0); -- -> 1 如果D为0结果将没有小数点或小数部分
-- 选择一部分函数进行演示(其它都类似)
DROP TABLE Aggregate;
CREATE TABLE Aggregate (
ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(255) NOT NULL,
BIR DATETIME NOT NULL DEFAULT NOW()
);
DESC Aggregate;
INSERT INTO Aggregate(NAME) VALUES ('张三'),('王五');
ALTER TABLE Aggregate AUTO_INCREMENT = 100;
INSERT INTO Aggregate(NAME) VALUES ('WeiyiGeek'),('Demo');
SELECT ID,NAME FROM Aggregate ORDER BY ID ASC LIMIT 1; -- 首条
SELECT ID,NAME FROM Aggregate ORDER BY ID DESC LIMIT 1; -- 尾条
注意事项:
描述:SQL Scalar 函数基于输入值,返回一个单一的值。
SELECT MID(column_name,start[,length]) FROM table_name;
) MySQL 中函数为 LENGTH():
补充说明:1
2
3
4
5
6-- Oracle 中没有 MID 函数有 substr 函数有类似功能:
select substr(("列名", a,b) from <table_name>;
SELECT substr(name,1,4) AS ShortTitle FROM Websites;
-- MySQL 中函数为 LENGTH()
SELECT LENGTH(column_name) FROM table_name;
基础示例:1
2
3
4
5
6
7
8SELECT UCASE('WeiyiGeek') as 'UCASE' ,LCASE('WeiyiGeek') as 'LCASE';
SELECT MID('WeiyiGeek',1,5) as 'MID',SUBSTRING('WeiyiGeek',6) as 'SUBSTARING';
SELECT LENGTH('WeiyiGeek') as 'Length';
SELECT DATE_FORMAT(Now(),'%Y-%m-%d') AS 'DATE_FORMAT';
-- 字符串拼接(常用)
SELECT CONCAT("I ","Love ","You! ") AS 'concat',CONCAT_WS(" :","时间",NOW())
-- concat | CONCAT_WS(" :","时间",NOW())
-- I Love You! | 时间 :2020-01-12 06:24:18
描述:数据类型定义列中存放的值的种类,在创建 SQL 表时决定表中的每个列将要存储的数据的类型;
数据类型是一个标签是便于 SQL 了解每个列期望存储什么类型的数据的指南,它也标识了 SQL 如何与存储的数据进行交互。
数据类型 | 描述 |
---|---|
BOOLEAN | 字存储 TRUE 或 FALSE 值 |
VARCHAR(n) 或 CHARACTER VARYING(n) | 字符/字符串。可变长度。最大长度 n。 |
CHARACTER(n) | 字符/字符串。固定长度 n。 |
BINARY(n) | 二进制串。固定长度 n。 |
VARBINARY(n) 或 BINARY VARYING(n) | 二进制串。可变长度。最大长度 n。 |
INTEGER(p) | 整数值(没有小数点)精度 p。 |
SMALLINT | 整数值(没有小数点)精度 5。 |
INTEGER | 整数值(没有小数点)精度 10。 |
BIGINT | 整数值(没有小数点)精度 19。 |
DECIMAL(p,s) | 精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数,小数点后有 2 位数的数字。 |
NUMERIC(p,s) | 精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同) |
FLOAT(p) | 近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。 |
REAL | 近似数值,尾数精度 7。 |
FLOAT | 近似数值,尾数精度 16。 |
DOUBLE PRECISION | 近似数值,尾数精度 16。 |
DATE | 存储年、月、日的值。 |
TIME | 存储小时、分、秒的值。 |
TIMESTAMP | 存储年、月、日、小时、分、秒的值。 |
INTERVAL | 由一些整数字段组成,代表一段时间,取决于区间的类型。 |
ARRAY | 元素的固定长度的有序集合 |
MULTISET | 元素的可变长度的无序集合 |
XML | 存储 XML 数据 |
不同数据库对数据类型的异同
数据类型 | Access | SQLServer | Oracle | MySQL | PostgreSQL |
---|---|---|---|---|---|
boolean | Yes/No | Bit | Byte | N/A | Boolean |
integer | Number (integer) | Int | Number | Int Integer | Int Integer |
float | Number (single) | Float Real | Number | Float | Numeric |
currency | Currency | Money | N/A | N/A | Money |
string (fixed) | N/A | Char | Char | Char | Char |
string (variable) | Text (<256) Memo (65k+) | Varchar | Varchar Varchar2 | Varchar | Varchar |
binary object | OLE Object Memo | Binary (fixed up to 8K) Varbinary (<8K) Image (<2GB) | Long Raw | Blob Text | Binary Varbinary |
数据类型 | 描述 | 存储 |
---|---|---|
Text | 用于文本或文本与数字的组合。最多 255 个字符。 | |
Memo | Memo 用于更大数量的文本。最多存储 65,536 个字符。注释:无法对 memo 字段进行排序。不过它们是可搜索的。 | |
Byte | 允许 0 到 255 的数字。 | 1 字节 |
Integer | 允许介于 -32,768 与 32,767 之间的全部数字。 | 2 字节 |
Long | 允许介于 -2,147,483,648 与 2,147,483,647 之间的全部数字。 | 4 字节 |
Single | 单精度浮点。处理大多数小数。 | 4 字节 |
Double | 双精度浮点。处理大多数小数。 | 8 字节 |
Currency | 用于货币。支持 15 位的元,外加 4 位小数。提示:您可以选择使用哪个国家的货币。 | 8 字节 |
AutoNumber | AutoNumber 字段自动为每条记录分配数字,通常从 1 开始。 | 4 字节 |
Date/Time | 用于日期和时间 | 8 字节 |
Yes/No | 逻辑字段,可以显示为 Yes/No、True/False 或 On/Off。在代码中,使用常量 True 和 False (等价于 1 和 0)。注释:Yes/No 字段中不允许 Null 值 | 1 比特 |
Ole Object | 可以存储图片、音频、视频或其他 BLOBs(Binary Large OBjects)。 | 最多 1GB |
Hyperlink | 包含指向其他文件的链接,包括网页。 | |
Lookup Wizard | 允许您创建一个可从下拉列表中进行选择的选项列表。 | 4 字节 |
在 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,占位1Byte |
| SMALLINT(size) | 带符号范围-32768到32767,无符号0到65535, size 默认为 6。占位2Byte |
| MEDIUMINT(size) | 带符号范围-8388608到8388607,无符号的范围是0到16777215。size 默认为9,占位3Byte|
| INT(size) | 带符号范围-2147483648到2147483647,无符号的范围是0到4294967295。 size 默认为 11,占位4Byte |
| BIGINT(size) | 带符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615。size 默认为 20,占位8Byte |
| FLOAT(size,d) | 带有浮动小数点的小数字。在 size 参数中规定显示最大位数。在 d 参数中规定小数点右侧的最大位数。 |
| DOUBLE(size,d) | 带有浮动小数点的大数字。在 size 参数中规显示定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
| DECIMAL(size,d) | 作为字符串存储的 DOUBLE 类型,允许固定的小数点。在 size 参数中规定显示最大位数。在 d 参数中规定小数点右侧的最大位数。 |
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) 至今的秒数来存储(32位)。格式: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。 |
数据库类型总结
补充说明:
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 变量。 |
其他数据类型:
数据类型 | 描述 |
---|---|
sql_variant | 存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。 |
uniqueidentifier | 存储全局唯一标识符 (GUID)。 |
xml | 存储 XML 格式化数据。最多 2GB。 |
cursor | 存储对用于数据库操作的指针的引用。 |
table | 存储结果集,供稍后处理。 |
注意事项:
注:在不同的数据库中,同一种数据类型可能有不同的名称。即使名称相同,尺寸和其他细节也可能不同!
注:MySQL的NUMBER类型中的 size 代表的并不是存储在数据库中的具体的长度,如 int(4) 并不是只能存储4个长度的数字。实际上int(size)所占多少存储空间并无任何关系。int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间就是显示的长度不一样而已 ;例如:int的值为10 (指定zerofill)
`
int(9)显示结果为000000010
int(3)显示结果为010
1 |
|
注意事项:
=、< 或 <>
, 必须使用 IS NULL 和 IS NOT NULL 操作符。SELECT name,age,count(*),age FROM tb_stu WHERE age=’19’ group by date;
你好看友,欢迎关注博主微信公众号哟! ❤
这将是我持续更新文章的动力源泉,谢谢支持!(๑′ᴗ‵๑)
温馨提示: 未解锁的用户不能粘贴复制文章内容哟!
方式1.请访问本博主的B站【WeiyiGeek】首页关注UP主,
将自动随机获取解锁验证码。
Method 2.Please visit 【My Twitter】. There is an article verification code in the homepage.
方式3.扫一扫下方二维码,关注本站官方公众号
回复:验证码
将获取解锁(有效期7天)本站所有技术文章哟!
@WeiyiGeek - 为了能到远方,脚下的每一步都不能少
欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】
或者个人公众号【WeiyiGeek】
联系我。
更多文章来源于【WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少】, 个人首页地址( https://weiyigeek.top )
专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注、转个发、赞个助】,这将对我的肯定,我将持续整理发布更多优质原创文章!。
最后更新时间:
文章原始路径:_posts/数据存储/SQL/基础SQL编程学习2.md
转载注明出处,原文地址:https://blog.weiyigeek.top/2020/1-7-53.html
本站文章内容遵循 知识共享 署名 - 非商业性 - 相同方式共享 4.0 国际协议