SQL
- 简介
- structure query language, 结构化查询语言,用于访问和处理数据库
- 用途
- 查询
- 取数
- 插入新记录
- 更新记录
- 删除记录
- 创建数据库
- 创建新表
- 创建存储过程
- 类似于函数,可接收参数
- 好处:更快,更安全,可复用
- 创建视图
- 类似于虚拟表,由一个或多个基表组成,对表的一种抽象
- 好处
- 可实现应用程序和表之间的解耦,尽量减少一边的变动对另外一边的影响
- 更方便实现权限的控制
- 设置表、存储过程、视图的权限
- 语法
- 说明
- SQL 对大小写不敏感;
- 每条 SQL 语句之间,有些数据库需要使用分号分隔,有些不需要
- SQL 可以分成两部分,DML 和 DDL
- DML,数据操作语言
- SELECT, 从数据库中选择数据
- UPDATE,更新数据库中的数据
- DELETE,删除数据库中的数据
- INSERT INTO,向数据库插入数据
- DDL, 数据定义语言
- CREATE DATABASE,创建新数据库
- ALTER DATABASE, 修改数据库
- CREATE TABLE,创建新表
- ALTER TABLE, 修改表
- DROP TABLE,删除表
- CREATE INDEX,创建索引(搜索键)
- DROP INDEX,删除索引
- DML,数据操作语言
- SQL SELECT 语句
- 用于从表中选取数据,结果被存储在一个结果表中(结果集)
- 语法
- SELECT 列名称 FROM 表名称
- SELECT 列名称1, 列名称2 FROM 表名称
- SELECT * FROM 表名称(注:* 号表示所有列)
- SQL SELECT DISTINCT 语句
- 从表中选择数据后,返回唯一不同的值,即去掉重复项
- 语法
- SELECT DISTINCT 列名称 FROM 表名称
- SQL WHERE 子句
- 从表中有条件的选取数据
- 语法
- SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
- 运算符
- =,等于
- <>,不等于(某些版本可用 !=)
,大于
- <,小于
=,大于等于
- <=,小于等于
- BETWEEN,在某个范围内
- LIKE,搜索某种模式?
- 例子
- SELECT 列名称 FROM 表名称 WHERE city=’Beijing’
- city 是表中某一列的名称
- 由于 Beijing 是字符串,所以使用引号,如果是数值,则不需要用引号
- SELECT 列名称 FROM 表名称 WHERE city=’Beijing’
- SQL AND & OR 运算符
- 用于两个或以上的条件对记录进行过滤
- 条件1 AND 条件2,需要满足两个条件
- 条件1 OR 条件2,只需要满足其中一个条件
- 示例
- SELECT * FROM Persons WHERE FirstName=’Thomas’ AND LastName=’Carter’
- SELECT * FROM Persons WHERE FirstName=’Thomas’ OR LastName=’Carter’
- 也可以将两个运算符结合起来,使用圆括号来组成复杂的表达式
- SELECT * FROM Persons WHERE (FirstName=’Thomas’ OR FirstName=’William’) AND LastName=’Carter’
- 用于两个或以上的条件对记录进行过滤
- SQL ORDER BY 子句
- 用于对结果集进行排序,默认升序(ASC),降序用 DESC
- 示例
- SELECT Company, OrderNumber FROM Orders ORDER BY Company
- SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
- SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
- SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
- SQL INSERT INTO 语句
- 用于向表中插入新行
- 语法
- INSERT INTO 表名称 VALUES (值1,值2,……)
- INSERT INTO 表名称 (列1,列2,……) VALUES (值1, 值2,……)
- 指定要插入数据的列
- 示例
- INSERT INTO Persons VALUES (‘Gates’, ‘Bill’, ‘Xuanwumen 10’, ‘Beijing’)
- INSERT INTO Persons (LastName, Address) VALUES (‘Wison’, ‘Champs-Elysees’)
- SQL UPDATE 语句
- 用于修改表中的数据
- 语法
- UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
- 示例
- UPDATE Persons SET FirstName=’Fred’ WHERE LastName=’Wilson’
- 更新一行中的一个列
- UPDATE Persons SET Address=’Zhongshan 23’, City=’Nanjing’ WHERE LastName=’Wilson’
- 更新一行中的多个列
- UPDATE Persons SET FirstName=’Fred’ WHERE LastName=’Wilson’
- SQL DELETE 语句
- 用于删除表中的行
- 语法
- DELETE FROM 表名称 WHERE 列名称=某值
- 示例
- 删除某行
- DELETE FROM Person WHERE LastName=’Wilson’
- 删除所有行(不删除表的情况下)
- DELETE FROM 表名称
- DELETE * FROM 表名称
- 删除某行
- SQL TOP 子句
- 用于设定要返回的记录的数目(如果表很大,可能只需要返回部分)
- 语法
- SELECT TOP 数字(或百分比) FROM 表名称
- 不同数据库此语法可能略有不同,不是所在数据库都支持 TOP 语法
- 示例
- MySQL
- SELECT * FROM Persons LIMIT 5
- Oracle
- SELECT * FROM Persons WHERE ROWNUM <=5
- SQL
- SELECT TOP 2 * FROM Persons
- SELECT TOP 50 PERCENT * FROM Persons
- MySQL
- SQL LIKE 操作符
- 用于在 WHERE 子句中搜索列中的指定模式
- 语法
- SELECT 列名称 FROM 表名称 WHERE 列名称 LIKE 模式
- 示例
- 选择城市以”N”开头的记录
- SELECT * FROM Persons WHERE City LIKE ‘N%’
- 选择城市以”g”结尾的记录
- SELECT * FROM Persons WHERE City LIKE ‘%g’
- 选择城市包含”lon”的记录
- SELECT * FROM Persons WHERE City LIKE ‘%lon%’
- 选择城市中不包含’lon’的记录(使用 NOT LIKE)
- SELECT * FROM Persons WHERE City NOT LIKE ‘%lon%’
- 选择城市以”N”开头的记录
- SQL 通配符
- 在搜索数据库中的数据时,可以使用 SQL 通配符
- 通配符可以用来代替一个或者多个字符,通配符必须与 LIKE 运算符一起使用
- “%”,替代一个或者多个字符
- “_”,替代一个字符
- [charlist],字符列中的任何单一字符
- [^charlist] 或者 [!charlist] ,不在字符列中的任何单一字符
- 示例
- 以任意一个字符开头,后面接着’eorge’
- SELECT * FROM Persons WHERE FirstName LIKE ‘_eorge’
- 以 C 开头,后面接着 r,再接任意字符,最后以 er 结尾
- SELECT * FROM Persons WHERE FirstName LIKE ‘C_r%er’
- 选取城市以A、L、N 开头
- SELECT * FROM Persons WHERE City LIKE ‘[ALN]%’
- 选取城市不以A、L、N 开头
- SELECT * FROM Persons WHERE City LIKE ‘[!ALN]%’
- 以任意一个字符开头,后面接着’eorge’
- SQL IN 操作符
- 用于在 WHERE 子句中规定多个值
- 语法
- SELECT 列名称 FROM 表名称 WHERE 列名称 IN (值1,值2,……)
- 示例
- SELECT * FROM Persons WHERE LastName IN (‘Adams’, ‘Carter’)
- SQL BETWEEN 操作符
- 用在 WHERE 子句,用于选取两个值之间的数据范围
- 语法
- SELECT 列名称 FROM 表名称 WHERE 列名称 BETWEEN 值1 AND 值2
- 不同的数据库对 BETWEEN…AND… 的理解不同,有些包括前后,有些只前无后,有些不包括前后
- 可以使用 NOT BETWEEN … AND … 来选取范围之外的数据;
- 示例
- SELECT * FROM Persons WHERE LastName BETWEEN ‘Adams’ AND ‘Carter’
- SQL Alias 别名
- AS 可以用来为列名称或表名称指定别名,目的是让 SQL 容易阅读和书写(通过将语句重复出现的单词用简称来替代)
- 语法
- SELECT 列名称 FROM 表名称 AS 表别名
- SELECT 列名称 AS 列别名 FROM 表名称
- 示例
- 表名称别名
- SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Orders AS po WHERE p.LastName=’Adams’ AND p.FirstName=’John’
- 列名称别名
- SELECT FirstName AS FAMILY, LastName AS NAME FROM Persons
- 在出来的结果集中,原列名称 FirstName 和 LastName 会分别显示为别名 FAMILY 和 NAME
- 表名称别名
- SQL JOIN
- 用于从两个或者多个表中查询数据
- 语法
- SELECT 列1,列2,… FROM 表1 INNER JOIN 表2 ON 列1=列2
- 取两个表的交集
- SELECT 列1,列2,…FROM 表1 LEFT JOIN 表2 ON 列1=列2(有些数据库叫 LEFT OUTER JOIN)
- 取表1的完全集,如果表2中没有对应值,则默认NULL
- SELECT 列1,列2,…FROM 表1 RIGHT JOIN 表2 ON 列1=列2 (有些数据库叫 RIGHT OUTER JOIN)
- 取表2的完全集,如果表1中没有对应值,则默认NULL
- SELECT 列1,列2,…FROM 表1 FULL JOIN 表2 ON 列1=列2 (有些数据库叫 FULL OUTER JOIN)
- 取两个表的并集,包括两个表的全部行,不管有没有对应值,没有则默认NULL
- SELECT 列1,列2,…FROM 表1 CROSS JOIN 表2
- 取两个表的笛卡尔乘积,表1*表2的集合,慎用
- SELECT 列1,列2,… FROM 表1 INNER JOIN 表2 ON 列1=列2
- 示例
- INNER JOIN,交集,两个表都需要匹配
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
- LEFT JOIN,左表所有行,右表有匹配行则返回右表值,没有匹配行则返回NULL
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.Id_p ORDER BY Persons.LastName
- RIGHT JOIN, 右表所有行,左表有匹配行则返回左表值,没有匹配行则返回NULL
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
- FULL JOIN,则要其中某个匹配存在,则返回行,没有值默认NULL
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
- INNER JOIN,交集,两个表都需要匹配
- 说明
- 可以通过增加条件,如 WHERE 列名称=某值 来对结果集进一步筛选
- SQL UNION
- 合并两个或多个 SELECT 语句的结果集
- UNION,会去除重复的行
- UNION ALL,不会去重,展示所有
- 两个 SELECT 语句必须有相同数量的列,列的数据类型相同,列的顺序相同
- 语法
- SELECT 列名称 FROM 表1 UNION SELECT 列名称 FROM 表2
- 示例
- SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA
- 合并两个或多个 SELECT 语句的结果集
- SQL SELECT INTO
- 用于从一个表中选取数据,插入到另外一个表中(可以是在另外的数据库)
- 语法
- 复制一个列或者多个列
- SELECT 列名称 INTO 表名称2 FROM 表名称1
- 示例:SELECT * INTO new_table_name FROM old_table_name
- 插入到另外数据库
- SELECT 列名称 INTO 表名称2 IN 数据库2 FROM 表名称1
- 示例:SELECT * INTO Persons IN ‘Backup.mdb’ FROM Persons
- 可以增加 WHERE 子句
- 示例:SELECT LastName, FirstName INTO Persons_Backup FROM Persons WHERE City=’Beijing’
- 可以使用 JOIN 连接多个表
- 示例:SELECT Persons.LastName, Orders.OrderNo INTO Persons_Order_Backup FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P
- 复制一个列或者多个列
- CREATE DATABASE
- 创建数据库
- 语法
- CREATE DATABASE 数据库名
- 示例
- CREATE DATABASE my_db
- CREATE TABLE
- 创建表
- 语法
- CREATEA TABLE 表名称
- (
- 列名称1 数据类型1,
- 列名称2 数据类型2,
- 列名称3 数据类型3,
- )
- (
- CREATEA TABLE 表名称
- 数据类型
- integer(size), int(size), smallint(size), tinyint(size)
- 仅容纳整数,size 用来设定最大位数
- decimal(size, d), numeric(size,d)
- 容纳带有小数的数字,size 用来设定数据的最大位数,d 设置小数点后的最大位数
- char(size)
- 容纳字符串(可容纳字母、数字及特殊字符)
- size 设定字符串的最大长度
- varchar(size)
- 容纳可变长度的字符串
- size 设定字符串的最大长度
- date(yyyymmdd)
- 容纳日期
- integer(size), int(size), smallint(size), tinyint(size)
- 示例
- CREATE TABLE Persons
- (
- Id_P int,
- LastName varchar(255),
- FirstName varchar(255),
- Address varchar(255),
- City varchar(255)
- )
- (
- CREATE TABLE Persons
- SQL Contrains 约束,用来约束限制加入表的数据的类型
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
- DEFAULT
- SQL NOT NULL
- 约束不接受空值,即如果没有值,则无法向表中插入数据
- 示例
- CREATE TABLE Persons
- (
- Id_P int NOT NULL,
- LastName varchar(255) NOT NULL,
- FirstName varchar(255),
- Address varchar(255),
- City varchar(255)
- )
- (
- CREATE TABLE Persons
- SQL UNIQUE
- 约束唯一标识表中的每条记录
- UNIQUE 和 PRIMARY KEY 都可以用来保证唯一性
- 一个表可以有多个 UNIQUE 约束,但只可以有一个PRIMARY KEY
- 示例
- MySQL
- CREATE TABLE Persons
- (
- Id_P int NOT NULL,
- LastName varchar(255) NOT NULL
- FirstName varchar(255),
- Address varchar(255),
- City varchar(255),
- UNIQUE (Id_P)
- )
- (
- CREATE TABLE Persons
- SQL Server / Oracle / MS Access
- CREATE TABLE Persons
- (
- Id_P int NOT NULL UNIQUE,
- LastName varchar(255) NOT NULL
- FirstName varchar(255),
- Address varchar(255),
- City varchar(255)
- )
- (
- CREATE TABLE Persons
- MySQL
- 如果需要约束多个唯一标识
- UNIQUE (Id_P) 更改为 UNIQUE (Id_P, LastName)
- 如果需要给约束命名,
- 语法:
- CONSTRAINT 约束名称 UNIQUE 列名称
- 示例
- CONSTRAINT uc_PersonID UNIQUE (Id_P, LastName)
- 语法:
- 如果想要在表被创建后,再补上约束,可以使用 ALTER
- 语法
- ALTER TABLE 表名
- ADD UNIQUE (列名称)
- 示例
- ALTER TABLE Persons
- ADD UNIQUE (Id_P)
- 语法
- 如果要撤销 UNIQUE
- MySQL
- 语法
- ALTER TABLE 表名
- DROP INDEX 约束名称
- 示例
- ALTER TABLE Persons
- DROP INDEX uc_PersonID
- 语法
- SQL Server / Oracle / MS Access
- 语法
- ALTER TABLE 表名
- DROP CONSTRAINT 约束名称
- 示例
- ALTER TABLE Persons
- DROP CONSTRAINT uc_PersonID
- 语法
- MySQL
- SQL PRIMARY KEY 约束
- PRIMARY KEY 约束唯一标识表的记录,一个表必须有一个 PRIMARY KEY,也只能有一个,PRIMARY KEY 不能为空,且值需要是唯一的
- 创建主键
- MySQL
- 语法
- PRIMARY KEY 列名称
- 示例
- CREATE TABLE Persons
- (
- Id_P int NOT NULL,
- FirstName varchar(255),
- LastName varchar(255),
- PRIMARY KEY (Id_P)
- )
- (
- CREATE TABLE Persons
- 语法
- SQL Server / Oracle / MS Access
- 语法
- 列名称 值类型 PRIMARY KEY
- 示例
- CREATE TABLE Persons
- (
- Id_P int NOT NULL PRIMARY KEY,
- FristName varchar(255)
- )
- (
- CREATE TABLE Persons
- 语法
- MySQL
- 如果需要给主键命名,MySQL / SQL Server / Oracle / MS Access 都一样
- 语法
- CONSTRAINT 约束名称 PRIMARY KEY (列名称)
- 示例
- CREATE TABLE Persons
- (
- Id_P int NOT NULL,
- FristName varchar(255),
- CONTRAINT pk_PersonID PRIMARY KEY (Id_P, LastName)
- )
- (
- CREATE TABLE Persons
- 语法
- 给已存在的表创建主键约束
- 语法
- ALTER TABLE 表名称
- ADD PRIMARY KEY (列名称)
- 示例
- ALTER TABLE Persons
- ADD PRIMARY KEY (Id_P)
- 语法
- 撤销主键
- MySQL
- 语法
- ALTER TABLE 表名称
- DROP PRIMARY KEY
- 示例
- ALTER TABLE Persons
- DROP PRIMARY KEY
- 语法
- SQL Server / Oracle / MS Access
- 语法
- ALTER TABLE Persons
- DROP CONSTRAINT 约束名称
- 示例
- ALTER TABLE Persons
- DROP CONSTRAINT pk_PersonID
- 语法
- MySQL
- SQL FOREIGN KEY
- 外键,一个表的外键指向另外一个表的主键
- 可预防破坏表之间连接的动作
- 也可防止非法数据插入外键列,因为它必须是指向的表中的值之一
- 创建外键
- MySQL
- 示例
- CREATE TABLE Orders
- (
- Id_O int NOT NULL,
- OrderNo int NOT NULL,
- Id_P int,
- PRIMARY KEY (Id_O)
- FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
- )
- (
- CREATE TABLE Orders
- 示例
- SQL Server / Oracle / MS Access
- CREATE TABLE Orders
- (
- Id_O int NOT NULL PRIMARY KEY,
- OrderNo int NOT NULL,
- Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
- )
- (
- CREATE TABLE Orders
- MySQL
- 命名外键
- 语法
- CONTRAINT fk_PerOrders
- 语法
- 为已存在的表添加外键
- 语法
- ALTER TABLE 表1
- ADD FOREIGN KEY (列1)REFERENCES 表2(列2)
- 语法
- 撤销外键
- MySQL
- 语法
- ALTER TABLE 表名称
- DROP FOREIGN KEY 约束名称
- 语法
- SQL Server / Oracle / MS Access
- 语法
- ALTER TABLE 表名称
- DROP CONSTAINT 约束名称
- 语法
- MySQL
- SQL CHECK 约束
- 此约束用来限制表中某列的值范围,比例大于0的整数
- 语法
- CHECK (列名称 表达式)
- CONSTRAINT 约束名称 CHECK (列名称 表达式)
- 示例
- CREATE TABLE Persons
- (
- Id_P int NOT NULL CHECK (Id_P > 0),
- FirstName varchar(255) NOT NULL,
- LastName varchar(255),
- )
- (
- CONSTRAINT chk_Person CHECK (Id_P>0 AND City=’Sandnes’)
- ALTER TABLE Persons
- ADD CHECK (Id_P>0)
- ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City=’Sanders’)
- ALTER TABLE Persons
- ADD CHECK (Id_P>0)
- ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City=’Sanders’)
- ALTER TABLE Persons
- DROP CHECK chk_Person
- DROP CONSTRAINT chk_Person
- CREATE TABLE Persons
- SQL DEFAULT 约束
- 用于向列中插入默认值
- 语法
- 列名称 数据类型 DEFAULT 默认值(默认值支持系统函数,如GETDATE())
- 示例
- CREATE TABLE Persons
- (
- Id_O int NOT NULL,
- OrderNo int NOT NULL,
- OrderDate date DEFAULT GETDATE(),
- City varchar(255) DEFAULT “Sandnes”,
- )
- (
- ALTER TABLE Persons
- ALTER City SET DEFAULT ‘sandnes’
- ALTER City DROP DEFAULT ‘sandne’
- CREATE TABLE Persons
- SQL CREATE INDEX
- 用于给表创建索引,有索引的表搜索查询会更高效,但表更新会变慢,因为索引也要更新;因此,一般只给高频查询的表加索引
- 语法
- CREATE INDEX 索引名称
- ON TABLE 表名称(列名称)
- CREATE UNIQUE INDEX 索引名称
- 唯一索引,表示表中的两个行不能有相同的索引值
- CREATE INDEX 索引名称
- 示例
- CREATE INDEX PersonIndex
- ON Person(LastName)
- ON Person(LastName DESC),降序
- ON Person(LatsName, FirstName),索引两列
- CREATE INDEX PersonIndex
- SQL DROP 语句
- 用于删除表、索引、数据库等
- 语法
- DROP TABLE 表名称
- ALTER TABLE 表名称
- DROP INDEX 索引名称
- DROP DATABASE 数据库名称
- TRUNCATE TABLE 表名称(只删除数据,不删除表)
- SQL ALTER 语句
- 用于在表中增加、删除、修改列
- 语法
- ALTER TABLE 表名称(增加列)
- ADD 列名称 数值类型
- ALTER TALBE 表名称(删除列)
- DROP COLUMN 列名称
- ALTER TABLE 表名称(修改列的数据类型)
- ALTER COLUMN 表名称 数据类型
- ALTER TABLE 表名称(增加列)
- 疑问
- 如何修改列名称?
- SQL AUTO_INCREMENT 语句
- 用来设定某个列,在每次插入新记录时,自动创建字段的值
- 语法
- MySQL
- CREATE TABLE Persons
- (
- P_Id int NOT NULL AUTO_INCREMENT,
- LastName varchar(255) NOT NULL,
- FirstName varchar(255),
- PRIMARY KEY (P_Id),
- )
- (
- CREATE TABLE Persons
- MySQL
- 说明
- 默认从1开始,每次递增1;如果想从100开始递增,则如下
- ALTER TABLE 表名称 AUTO_INCREMENT=100
- 当在表中插入新记录时,不必为递增的列赋值,它会自动创建值
- 默认从1开始,每次递增1;如果想从100开始递增,则如下
- SQL VIEW 视图
- 视图是基于 SQL 语句的结果集的可视化的表
- 注:视图总是显示最新的数据。每当用户查询视图时,数据库引擎通过 SQL 语句来重建数据
- 语法
- CREATE VIEWE 视图名称
- SELECT 列名称
- FROM 表名称
- WHERE 条件
- CREATE VIEWE 视图名称
- 示例
- 创建
- CREATE VIEW [Current Product List] AS
- SELECT ProductID, ProductName
- FROM Products
- WHERE Discontinued=No
- 查询
- SELECT * FROM [Current Product List]
- 撤消
- DROP VIEW 视图名称
- 创建
- SQL DATE 函数
- 如果数据只包含日期,情况就会很简单;如果包含时间,情况就会比较复杂,且不容易维护,因此若非必要,尽量避免使用时间,如果实在需要,建议拆分成两个字段来存储比较好
- 语法
- MySQL
- NOW():返回当前的日期和时间
- CURDATE():返回当前的日期
- CURTIME():返回当前的时间
- DATE():提取表达式的日期部分
- EXTRACT():返回日期或时间的单独部分
- DATE ADD():给日期添加时间间隔
- DATE SUB():给日期减去时间间隔
- DATEDIFF():返回两个日期之间的间隔
- DATE FORMAT():用不同的格式显示日期
- MySQL
- SQL NULL
- NULL 值表示未知数据,表中的列默认可以存储NULL值
- 使用 IS NULL 和 IS NOT NULL 来判断值是否为 NULL
- NULL 与 0 不等价,它们完全是两个概念
- NULL 不能使用一些运算符,例如 >, <, =
- 示例
- SELECT FirstName, LastName, Address FROM Persons
- WHERE Address IS NOT NULL
- SQL NULL 函数
- ISNULL(), NVL(), IFNULL(), COALESCE(),这四个函数用来将 NULL 值转化为0,不过它们使用在不同的数据库中
- 语法
- ISNULL(列名称,0),微软
- NVA(列名称,0),Oracle
- IFNULL(列名称,0),或者 COALESCE(列名称,0),MySQL
- 示例
- SELECT ProductName, UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder, 0)
- SQL 数据类型
- MySQL
- text 类型
- CHAR(size),固定长度的字符串
- VARCHAR(size),可变长度的字符串
- TINYTEXT,最大长度为255个字符的字符串
- TEXT,最大长度为65,535个字符的字符串
- MEDIUMTEXT,最大长度为16,777,215个字符的字符串
- LONGTEXT,最大长度为4,294,967,295个字符的字符串
- BLOB,用于BLOBs(Binary Large Objects,二进制大对象,常用来存储二进制的大文件,例如一张图片,一个音频等),最多存放65536字节的数据
- MEDIUMBLOB,最多16777215字节的数据
- LONGBLOB,最多4294967295字节的数据
- ENUM(x, y, z, etc.),允许你输入可能值的列表,可以在ENUM列表中列出最大65535个值;如果列表中不存在插入的值,则插入空值;这些值是按照输入的顺序存储的
- SET,与ENUM类似,SET最多只能包含65个列表项,不过SET 可存储一个以上的值;
- number 类型
- TINYINT(size),常规,有正负,-128到+127;无正负符号,0到+128;可用 size 规定最大位数(符号通过添加UNSIGNED属性来标记)
- INT(size),常规-32768到32767,无符号,0到65535
- SMALLINT(size),常规-8388608到+8388607,无符号,0到16777215
- MEDIUMINT(size),常规-2147483648到2147483647,无符号,0到4294967295
- BIGINT(size),常规-9223372036854775808到9223372036854775807;无符号,0到18446744073709551615
- FLOAT(size, d),带有浮动小数点的小数字,size 规定最大位数,d 规定小数点右侧的最大位数
- DOUBLE(size, d),带有浮动小数点的大数字,同上
- DECIMAL(size, d)
- 作为字符串存储的 DOUBLE 类型,小数点右侧位数固定
- size 用来指定最大位数,d 规定小数点右侧的最大位数
- 最多支持28位,最后一位四舍五入
- 好处:不存在精度的损失,常用于银行账目计算
- 说明:数值存储范围越小的精度越高,存储数据范围越大,精度就越不准确
- date 类型
- DATE():日期,格式YYYY-MM-DD,范围从1000-01-01到9999-01-01
- DATETIME():时间,格式YYYY-MM-DD HH-MM-SS
- TIMESTAMP():时间戳,使用Unix 纪元(1970-01-01 00:00:00 UTC)至今的描述来存储,格式:YYYY-MM-DD HH:MM:SS
- TIME():时间,格式HH:MM:SS,支持范围从”-838:59:59”到”838:59:59”
- YEAR():2位或4位格式的年,4位格式所允许的值为1901到2155;2位格式所允许的值:70到69,表示1970到2069
- text 类型
- MySQL
- SQL 服务器 - RDBMS
- DBMS, database management system,数据库管理系统,提供各种函数用来对数据进行增删改查,使我们有能力在数据库中提取、修改或者存贮信息;
- RDBMS, relational database maganement system, 关系数据库管理系统
- SQL 函数
- 语法:SELECT 函数名(列) FROM 表名
- 合计类函数,Aggregate,例如:
- AVG(列名),返回某列的平均值;
- SUM(列名),返回某列的合计值;
- COUNT(列名),返回某列的行数(不含NULL值)
- MAX(列名),返回某列的最大值;
- MIN(列名),返回某列的最小值;
- 单一类函数,Scalar
- UCASE(c),将某个域转化成大写;
- LCASE(c),将某个域转化成小写;
- LEN(c),返回某个域的文本长度;
- ROUND(c,decimals),将某个数值域进行指定小数位数的四舍五入;
- MOD(x, y),返回除法操作的余数;
- NOW(),返回当前的系统日期;
- FORMAT(c, format),改变某个域的显示方式;
- DATEDIFF(d, date1, date2),用于执行日期计算;
- SQL AVG 函数
- 用途:返回表格中“数值”列的平均值,NULL值不列入计算;
- 语法
- SELECT AVG(列名) FROM 表名
- 示例
- SELECT AVG(OrderPrice) AS OrderAverage FROM Orders
- 结果集:OrderAverage, 950
- SELECT Customers FROM Orders
- WHERE OrderPrice > (AVG(OrderPrice) FROM Orders)
- SELECT AVG(OrderPrice) AS OrderAverage FROM Orders
- SQL COUNT 函数
- 用途:返回匹配指定条件的行数
- 语法:
- SELECT COUNT(列名) FROM 表名
- SELECT COUNT (*) FROM 表名,返回表中的记录数(所有行都计算在内);
- SELECT COUNT (DISTINCT 列名),返回指定列不同值的数目(即值相同会被视为忽略,只计算一次)
- 示例
- SELECT COUNT(Customer) AS CustomerNilsen FROM Orders WHERE Customer=”Carter”
- SELECT COUNT(*) AS NumberOfOrders FROM Orders
- 注意
- count 之后有带一个 AS, 用来对结果集进行列标题的命名;
- SQL FIRST 函数
- 用途:返回符合指定条件的查找结果集的指定列的第一个值(注:可以使用ORDER BY 对结果集进行排序)
- 语法:
- SELECT FIRST(列名) FROM 表名
- 示例
- SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders
- SQL LAST 函数
- 用途:返回符合指定条件的查询结果集的指定列的最后一个值(注:可以使用 ORDER BY 结果集进行排序)
- 语法
- SELECT LAST(列名) FROM 表名
- 示例
- SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders
- SQL MAX 函数
- 用途:返回指定列的最大值(注:也可以用于文本列,可获得按字母排序的最大或最小值,NULL 值不计算在内 )
- 语法
- SELECT MAX(列名)AS 新列名 FROM 表名
- 示例
- SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
- SQL MIN 函数
- 用途:返回指定列的最小值(注:可用于文本列,NULL 值不计算在内)
- 语法
- SELECT MIN(列名) AS 新列名 FROM 表名
- 示例
- SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders
- SQL SUM 函数
- 用途:返回指定列的总和(注:只能是数值列)
- 语法
- SELECT SUM(列名) AS 新列名 FROM 表名
- 示例
- SELECT SUM(OrderPrice) AS TotalPrice FROM Orders
- SQL GROUP BY 语句
- 用途:用于对结果集,按指定列(一个或多个)的条件,进行分类统计
- 语法
- 单列
- SELECT 列名1,合计函数(列名2) FROM 表名 GROUP BY 列名1
- 多列
- SELECT 列名1,列名2,合计函数(列名3) FROM 表名 GROUP BY 列名1,列名2
- 单列
- 示例
- 单列
- SELECT Customer, SUM(OrderPrice) FROM Orders GROUP BY Customer
- 多列
- SELECT Customer, Orderdate, SUM(OrderPrice) FROM Orders GROUP BY Customer, Orderdate
- 单列
- SQL HAVING 子句
- 用途:解决合计函数和 WHERE 关键字无法一起使用的问题
- 语法
- SELECT 列名,合计函数(列名)FROM 表名 HAVING 合计函数(列名)条件
- 示例
- SELECT Customer, SUM(OrderPrice) FROM Orders
- GROUP BY Customer HAVING SUM(OrderPrice)<2000
- SELECT Customer, SUM(OrderPrice) FROM Orders
- WHERE Customer=’Bush’ OR Customer=’Carter’
- GROUP BY Customer
- HAVING SUM(OrderPrice)>1500
- SELECT Customer, SUM(OrderPrice) FROM Orders
- SQL UCASE 函数
- 用途:将字段的值转换成大写
- 语法:
- SELECT UCASE(列名) FROM 表名
- 示例
- SELECT UCASE(LastName) as LastName, FirstName FROM Persons
- SQL LCASE 函数
- 用途:将字段的值转换成小写
- 语法
- SELECT LCASE(列名) FROM 表名
- 示例
- SELECT LACASE(FirstName) as FirstName, LastName FROM Persons
- SQL MID 函数
- 用途:用于从字段中提取指定长度的字符
- 语法
- SELECT MID(列名,start(超始值,长度)) FROM 表名
- 长度的参数可选,如果不指定,表示从起始位置往后的所有剩余字符
- 示例
- SELECT MID(City, start(1,3)) AS ShortCity FROM Persons
- SQL LEN 函数
- 用途:用于返回字符串的长度
- 语法
- SELECT LEN(列名) AS 新列名 FROM 表名
- 示例
- SELECT LEN(City) AS CityLength FROM Persons
- SQL ROUND 函数
- 用途:用于将数值进行四舍五入到指定的小数位数
- 语法
- SELECT ROUND(列名,小数位数) FROM 表名
- 示例
- SELECT ProductName, ROUND(UnitPrice, 0) AS UnitPrice FROM Products
- SQL NOW 函数
- 用途:用于获取当前的日期和时间(注:如果使用SQL,则应用 getdate 函数)
- 语法
- SELECT NOW() FROM 表名
- 示例
- SELECT Product, UnitPrice, NOW() as Perdate FROM Products
- SQL FORMAT 函数
- 用途:用于将值按指定格式进行转化
- 语法
- SELECT FORMAT(列名,格式) FROM 表名
- 示例
- SELECT ProductName, UnitPrice, FORMAT(NOW(), ‘YYYY-MM-DD’) as PerDate FROM Products
- 说明
SQL
https://ccw1078.github.io/2014/04/15/SQL/