SQL进阶篇之高级应用

大数据 创建于:2023-05-28

SQL CREATE DATABASE 语句

CREATE DATABASE 用于创建数据库。

SQL CREATE DATABASE 语法

CREATE DATABASE database_name

SQL CREATE DATABASE 实例

创建一个名为 "my_db" 的数据库,使用下面的 CREATE DATABASE 语句:

CREATE DATABASE my_db

SQL CREATE TABLE 语句

CREATE TABLE 语句用于创建数据库中的表

SQL CREATE TABLE 语法

CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)

数据类型(data_type)规定了列可容纳何种数据类型,如下表所示:

数据类型 描述
integer(size)/int(size)/smallint(size)/tinyint(size) 仅容纳整数。在括号内规定数字的最大位数
decimal(size,d)/numeric(size,d) 容纳带有小数的数字 ,"size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数
char(size) 容纳固定长度的字符串(可容纳字母、数字以及特殊字符),在括号中规定字符串的长度
varchar(size) 容纳可变长度的字符串(可容纳字母、数字以及特殊的字符),在括号中规定字符串的最大长度
date(yyyymmdd) 容纳日期

SQL CREATE TABLE 实例

创建名为 "Person" 的表,该表包含 5 个列,列名分别是:"Id_P"、"LastName"、"FirstName"、"Address" 以及 "City":

CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

Id_P 列的数据类型是 int,包含整数。其余 4 列的数据类型是 varchar,最大长度为 255 个字符。 空的 "Persons" 表类似这样:

Id_P LastName FirstName Address City

SQL ALTER TABLE 语句

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

SQL ALTER TABLE 语法

如需在表中添加列,请使用下列语法:

ALTER TABLE table_name
ADD column_name datatype

要删除表中的列,请使用下列语法:

ALTER TABLE table_name
DROP COLUMN column_name

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

要改变表中列的数据类型,请使用下列语法:

ALTER TABLE table_name
ALTER COLUMN column_name datatype

原始的Persons 表:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

SQL ALTER TABLE 实例

在表 "Persons" 中添加一个名为 "Birthday" 的新列,使用下列 SQL 语句:

ALTER TABLE Persons
ADD Birthday date

请注意,新列 "Birthday" 的类型是 date,可以存放日期。数据类型规定列中可以存放的数据的类型。

新的 "Persons" 表类似这样:

Id LastName FirstName Address City Birthday
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

改变 "Persons" 表中 "Birthday" 列的数据类型,使用下列 SQL 语句:

ALTER TABLE Persons
ALTER COLUMN Birthday year

请注意,"Birthday" 列的数据类型是 year,可以存放 2 位或 4 位格式的年份

DROP COLUMN 实例

接下来,我们删除 "Person" 表中的 "Birthday" 列:

ALTER TABLE Person
DROP COLUMN Birthday

Persons 表会成为这样:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

SQL CREATE INDEX 语句

CREATE INDEX 语句用于在表中创建索引,在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据 无法看到索引,它们只能被用来加速搜索/查询

注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

SQL CREATE INDEX 语法

在表上创建一个简单的索引。允许使用重复的值:

CREATE INDEX index_name
ON table_name (column_name)

注释:"column_name" 规定需要索引的列。

SQL CREATE UNIQUE INDEX 语法

在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

CREATE INDEX 实例

创建一个简单的索引,名为 "Index_Pers",在 Person 表的 LastName 列:

CREATE INDEX Index_Pers
ON Person (LastName) 

如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC:

CREATE INDEX Index_Pers
ON Person (LastName DESC) 

假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:

CREATE INDEX Index_Pers
ON Person (LastName, FirstName)

SQL 撤销索引、表以及数据库

通过使用 DROP 语句,可以轻松地删除索引、表和数据库

SQL DROP INDEX 语句

我们可以使用 DROP INDEX 命令删除表格中的索引。

用于 Microsoft SQLJet (以及 Microsoft Access) 的语法:

DROP INDEX index_name ON table_name

用于 MS SQL Server 的语法:

DROP INDEX table_name.index_name

用于 IBM DB2 和 Oracle 语法:

DROP INDEX index_name

用于 MySQL 的语法:

ALTER TABLE table_name DROP INDEX index_name

SQL DROP TABLE 语句

DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除):

DROP TABLE 表名称

SQL DROP DATABASE 语句

DROP DATABASE 语句用于删除数据库:

DROP DATABASE 数据库名称

SQL TRUNCATE TABLE 语句

如果我们仅仅需要除去表内的数据,但并不删除表本身,可以使用使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据):

TRUNCATE TABLE 表名称

SQL AUTO INCREMENT 字段

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

用于 MySQL 的语法

下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:

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)
)
  • MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务,默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。

要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:

ALTER TABLE Persons AUTO_INCREMENT=100

要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值):

INSERT INTO Persons (FirstName,LastName)
VALUES ('Bill','Gates')

上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 会被赋予一个唯一的值。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。

用于 SQL Server 的语法

下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:

CREATE TABLE Persons
(
P_Id int PRIMARY KEY IDENTITY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
  • MS SQL 使用 IDENTITY 关键字来执行 auto-increment 任务,默认地,IDENTITY 的开始值是 1,每条新记录递增 1
  • 要规定 "P_Id" 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10)

要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值):

INSERT INTO Persons (FirstName,LastName)
VALUES ('Bill','Gates')

上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 会被赋予一个唯一的值。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。

用于 Access 的语法

下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:

CREATE TABLE Persons
(
P_Id int PRIMARY KEY AUTOINCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
  • MS Access 使用 AUTOINCREMENT 关键字来执行 auto-increment 任务,默认地,AUTOINCREMENT 的开始值是 1,每条新记录递增 1。
  • 要规定 "P_Id" 列以 20 起始且递增 10,请把 autoincrement 改为 AUTOINCREMENT(20,10)

要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值):

INSERT INTO Persons (FirstName,LastName)
VALUES ('Bill','Gates')

上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 会被赋予一个唯一的值。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。

用于 Oracle 的语法

在 Oracle 中,代码稍微复杂一点,必须通过 sequence 对创建 auto-increment 字段(该对象生成数字序列)。 请使用下面的 CREATE SEQUENCE 语法:

CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10

上面的代码创建名为 seq_person 的序列对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。CACHE 选项规定了为了提高访问速度要存储多少个序列值。 要在 "Persons" 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值):

INSERT INTO Persons (P_Id,FirstName,LastName)
VALUES (seq_person.nextval,'Lars','Monsen')

上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 的赋值是来自 seq_person 序列的下一个数字。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。

SQL TOP 子句

TOP 子句用于规定要返回的记录的数目,对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。

注释:并非所有的数据库系统都支持 TOP 子句。

SQL Server 的语法:

SELECT TOP number|percent column_name(s)
FROM table_name

MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的

MySQL 语法

SELECT column_name(s)
FROM table_name
LIMIT number

例子

SELECT *
FROM Persons
LIMIT 5

Oracle 语法

SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number

例子

SELECT *
FROM Persons
WHERE ROWNUM <= 5

原始的Persons 表:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
4 Obama Barack Pennsylvania Avenue Washington

SQL TOP 实例

从上面的 "Persons" 表中选取头两条记录,可以使用下面的 SELECT 语句:

SELECT TOP 2 * FROM Persons

结果:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

SQL TOP PERCENT 实例

从上面的 "Persons" 表中选取 50% 的记录,可以使用下面的 SELECT 语句:

SELECT TOP 50 PERCENT * FROM Persons

结果:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

SQL LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式

SQL LIKE 操作符语法

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern

原始的Persons 表:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

LIKE 操作符实例

从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人,可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City LIKE 'N%'

提示:"%" 可用于定义通配符(模式中缺少的字母)。

结果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York

从 "Persons" 表中选取居住在以 "g" 结尾的城市里的人,可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City LIKE '%g'

结果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing

从 "Persons" 表中选取居住在包含 "lon" 的城市里的人,可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City LIKE '%lon%'

结果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London

通过使用 NOT 关键字,从 "Persons" 表中选取居住在不包含 "lon" 的城市里的人,可以使用下面的SELECT 语句:

SELECT * FROM Persons
WHERE City NOT LIKE '%lon%'

结果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

SQL 通配符

  • 在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符
  • SQL 通配符必须与 LIKE 运算符一起使用
通配符 描述
% 代表零个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]或者[!charlist] 不在字符列中的任何单一字符

原始的Persons 表:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

使用 % 通配符

从上面的 "Persons" 表中选取居住在以 "Ne" 开始的城市里的人,可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City LIKE 'Ne%'

结果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York

从 "Persons" 表中选取居住在包含 "lond" 的城市里的人,可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City LIKE '%lond%'

结果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London

使用 _ 通配符

从上面的 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人,可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE FirstName LIKE '_eorge'

结果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York

望从 "Persons" 表中选取的这条记录的姓氏以 "C" 开头,然后是一个任意字符,然后是 "r",然后是一个任意字符,然后是 "er",可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE LastName LIKE 'C_r_er'

结果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing

使用 [charlist] 通配符

从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人,可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City LIKE '[ALN]%'

结果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

从上面的 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人,可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City LIKE '[!ALN]%'

结果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing

SQL IN 操作符

IN 操作符允许我们在 WHERE 子句中规定多个值

SQL IN 语法

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)

原始的Persons 表:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

IN 操作符实例

从上表中选取姓氏为 Adams 和 Carter 的人,可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter')

结果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London
3 Carter Thomas Changan Street Beijing

SQL BETWEEN 操作符

操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期

SQL BETWEEN 语法

SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2

原始的Persons 表:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
4 Gates Bill Xuanwumen 10 Beijing

BETWEEN 操作符实例

如需以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人,请使用下面的 SQL:

SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'

结果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

重要事项:不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。某些数据库会列出介于 "Adams" 和 "Carter" 之间的人,但不包括 "Adams" 和 "Carter" ;某些数据库会列出介于 "Adams" 和 "Carter" 之间并包括 "Adams" 和 "Carter" 的人;而另一些数据库会列出介于 "Adams" 和 "Carter" 之间的人,包括 "Adams" ,但不包括 "Carter"

如需使用上面的例子显示范围之外的人,请使用 NOT 操作符:

SELECT * FROM Persons
WHERE LastName
NOT BETWEEN 'Adams' AND 'Carter'

结果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing
4 Gates Bill Xuanwumen 10 Beijing

SQL SELECT INTO 语句

SQL SELECT INTO 语句可用于创建表的备份复件,从一个表中选取数据,然后把数据插入另一个表中

SQL SELECT INTO 语法

可以把所有的列插入新表:

SELECT *
INTO new_table_name [IN externaldatabase] 
FROM old_tablename

或者只把希望的列插入新表:

SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename

SQL SELECT INTO 实例 - 制作备份复件

下面的例子会制作 "Persons" 表的备份复件:

SELECT *
INTO Persons_backup
FROM Persons

IN 子句可用于向另一个数据库中拷贝表:

SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons

如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域:

SELECT LastName,FirstName
INTO Persons_backup
FROM Persons

SQL SELECT INTO 实例 - 带有 WHERE 子句

下面的例子通过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,创建了一个带有两个列的名为 "Persons_backup" 的表:

SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing'

SQL SELECT INTO 实例 - 被连接的表

从一个以上的表中选取数据也是可以做到的,下面的例子会创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:

SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P

SQL VIEW(视图)

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

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

SQL CREATE VIEW 语法

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

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

SQL CREATE VIEW 实例

可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。通过向视图添加函数、join 等等,我们可以向用户精确地提交我们希望提交的数据。 视图 "Current Product List" 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No

我们可以查询上面这个视图:

SELECT * FROM [Current Product List]

选取 Products 表中所有单位价格高于平均单位价格的产品:

CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products) 

可以像这样查询上面这个视图:

SELECT * FROM [Products Above Average Price]

视图计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 "Product Sales for 1997" 的视图那里选取数据:

CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName 

可以像这样查询上面这个视图:

SELECT * FROM [Category Sales For 1997]

可以向查询添加条件,例如查看 "Beverages" 类的全部销量:

SELECT * FROM [Category Sales For 1997]
WHERE CategoryName='Beverages'

SQL 更新视图

可以使用下面的语法来更新视图:

SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

向 "Current Product List" 视图添加 "Category" 列。我们将通过下列 SQL 更新视图:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No

SQL 撤销视图

可以通过 DROP VIEW 命令来删除视图

SQL DROP VIEW 语法

DROP VIEW view_name

SQL Date 函数

当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。 只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。

MySQL Date 函数

函数 描述
NOW() 返回当前的日期和时间
CURDATE() 返回当前的日期
CURTIME() 返回当前的时间
DATE() 提取日期或日期/时间表达式的日期部分
EXTRACT() 返回日期/时间按的单独部分
DATE_ADD() 给日期添加指定的时间间隔
DATE_SUB() 从日期减去指定的时间间隔
DATEDIFF() 返回两个日期之间的天数
DATE_FORMAT() 用不同的格式显示日期/时间

SQL Server Date 函数

函数 描述
GETDATE() 返回当前日期和时间
DATEPART() 返回日期/时间的单独部分
DATEADD() 在日期中添加或减去指定的时间间隔
DATEDIFF() 返回两个日期之间的时间
CONVERT() 用不同的格式显示日期/时间

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 - 格式: 唯一的数字

SQL 日期处理

如果不涉及时间部分,那么我们可以轻松地比较两个日期! 假设有下面这个 "Orders" 表:

OrderId ProductName OrderDate
1 computer 2008-12-26
2 printer 2008-12-26
3 electrograph 2008-11-12
4 telephone 2008-10-19

从上表中选取 OrderDate 为 "2008-12-26" 的记录,使用如下 SELECT 语句:

SELECT * FROM Orders WHERE OrderDate='2008-12-26'

结果集:

OrderId ProductName OrderDate
1 computer 2008-12-26
2 printer 2008-12-26

如果日期字段有时间部分,则使用该语句是得不到这样的结果的

OrderId ProductName OrderDate
1 computer 2008-12-26 16:23:55
2 printer 2008-12-26 17:23:55
3 electrograph 2008-11-12 18:23:55
4 telephone 2008-10-19 19:23:55

SQL NULL 值

  • 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录,这意味着该字段将以 NULL 值保存
  • NULL 值的处理方式与其他值不同
  • NULL 用作未知的或不适用的值的占位符
  • 无法比较 NULL 和 0;它们是不等价的

SQL 的 NULL 值处理

原始的Persons 表:

Id LastName FirstName Address City
1 Adams John London
2 Bush George Fifth Avenue New York
3 Carter Thomas Beijing
  • 假如 "Persons" 表中的 "Address" 列是可选的。这意味着如果在 "Address" 列插入一条不带值的记录,"Address" 列会使用 NULL 值保存。
  • 如何测试 NULL 值呢?无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>,必须使用 IS NULL 和 IS NOT NULL 操作符。

SQL IS NULL

SELECT Id,LastName,FirstName,Address FROM Persons
WHERE Address IS NULL

结果集:

Id LastName FirstName Address
1 Adams John
3 Carter Thomas

提示:请始终使用 IS NULL 来查找 NULL 值。

SQL IS NOT NULL

SELECT Id,LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL

结果集:

Id LastName FirstName Address
2 Bush George Fifth Avenue

SQL NULL 函数

SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数

请看下面的 "Products" 表:

P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder
1 computer 699 25 15
2 printer 365 36
3 telephone 280 159 57

假如 "UnitsOnOrder" 是可选的,而且可以包含 NULL 值,使用如下 SELECT 语句:

SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products

在上面的例子中,如果有 "UnitsOnOrder" 值是 NULL,那么结果是 NULL,微软的 ISNULL() 函数用于规定如何处理 NULL 值,NVL(), IFNULL() 和 COALESCE() 函数也可以达到相同的结果。 在这里,我们希望 NULL 值为 0。

下面,如果 "UnitsOnOrder" 是 NULL,则不利于计算,因此如果值是 NULL 则 ISNULL() 返回 0。

SQL Server / MS Access

SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products

Oracle

Oracle 没有 ISNULL() 函数。不过,我们可以使用 NVL() 函数达到相同的结果:

SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products

MySQL

MySQL 也拥有类似 ISNULL() 的函数。不过它的工作方式与微软的 ISNULL() 函数有点不同。 在 MySQL 中,我们可以使用 IFNULL() 函数,就像这样:

SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products

或者我们可以使用 COALESCE() 函数,就像这样:

SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products

SQL 数据类型

Microsoft Access 数据类型

在这里插入图片描述

MySQL 数据类型

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

Text 类型:

在这里插入图片描述

Number 类型:

在这里插入图片描述

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

Date 类型:

在这里插入图片描述

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

SQL Server 数据类型

Character 字符串:

在这里插入图片描述

Unicode 字符串:

在这里插入图片描述

Binary 类型:

在这里插入图片描述

Number 类型:

在这里插入图片描述

Date 类型:

在这里插入图片描述

其他数据类型:

在这里插入图片描述

原文地址:https://blog.51cto.com/davieyang/5768365

免责声明:本文来源于互联网,版权归合法拥有者所有,如有侵权请公众号联系管理员

* 本站提供的一些文章、资料是供学习研究之用,如用于商业用途,请购买正版。

Davieyang