查找
-- 语法 Select 列名 from 表名; -- 示例 Select * from table;
查找并返回唯一的不同值
-- 语法 SELECT DISTINCT 列名称 FROM 表名称 -- 示例 SELECT DISTINCT name FROM Person;
加条件
-- 语法 SELECT 列名称 FROM 表名称 WHERE 列 运算符 值 -- 示例 SELECT * FROM Persons WHERE City='Beijing'
and:第一个条件和第二个条件都成立,则 AND 运算符显示一条记录,表示并且
or:第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录,表示或者
-- 语法 -- 示例 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'
用于根据指定的列对结果集进行排序,默认按照升序对记录进行排序(升序ASC,降序DESC)
-- 语法 -- 示例 SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
向表格中插入新的行
-- 语法 INSERT INTO 表名称 VALUES (值1, 值2,....) -- 示例 INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing') -- 语法 INSERT INTO 表名称 (列1, 列2,...) VALUES (值1, 值2,....) -- 示例 INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
用于修改表中的数据
-- 语法 UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 -- 示例 UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
用于删除表中的行
-- 语法 DELETE FROM 表名称 WHERE 列名称 = 值 -- 示例 DELETE FROM Person WHERE LastName = 'Wilson' -- 删除所有行,保留表的结构、属性和索引 DELETE FROM table_name DELETE * FROM table_name
用于规定要返回的记录的数目,也是web数据分页的具体实现
-- 语法 SELECT column_name(s) FROM table_name LIMIT number -- 示例 SELECT * FROM Persons LIMIT 5 -- 分页 SELECT * FROM Persons LIMIT 0,5 -- limit 起始索引 一页显示几条
模糊查询
-- 语法 SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern -- 示例 SELECT * FROM Persons WHERE City LIKE 'N%'
% _ []
-- 示例:从 "Persons" 表中选取居住在以 "Ne" 开始的城市里的人 SELECT * FROM Persons WHERE City LIKE 'Ne%' -- 示例:从 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人 SELECT * FROM Persons WHERE FirstName LIKE '_eorge' -- 示例:从 "Persons" 表中选取的这条记录的姓氏以 "C" 开头,然后是一个任意字符,然后是 "r",然后是一个任意字符,然后是 "er" SELECT * FROM Persons WHERE LastName LIKE 'C_r_er' -- 示例:从 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人 SELECT * FROM Persons WHERE City LIKE '[ALN]%' -- 示例:从 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人 SELECT * FROM Persons WHERE City LIKE '[!ALN]%'
规定多个值
-- 语法 SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...) -- 示例 SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
作用是选取介于两个值之间的数据范围
-- 语法 SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2 -- 示例 SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter' -- 示例 SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'
可以为列名称和表名称指定别名
-- 语法:表的 SQL Alias 语法 SELECT column_name(s) FROM table_name AS alias_name -- 语法:列的 SQL Alias 语法 SELECT column_name AS alias_name FROM table_name -- 示例 SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Orders AS po WHERE p.LastName='Adams' AND p.FirstName='John'
用于根据两个或多个表中的列之间的关系,从这些表中查询数据
join区别:
-- 语法 -- 示例 SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P
如果表1中的行在表2中没有匹配,就不会列出这些行
也就是说,以多个表为标准,必须同时满足条件
-- 语法 SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name -- 示例 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 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行
也就是说,以左表为标准
-- 语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name -- 示例 SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行
也就是说,以右表为标准
-- 语法 SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name -- 示例 SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。
只要其中某个表存在匹配,FULL JOIN 关键字就会返回行
不是指定的以左或右为标准,而是以二者为标准
-- 语法 SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name -- 示例 SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 “Persons” 中的行在表 “Orders” 中没有匹配,或者如果 “Orders” 中的行在表 “Persons” 中没有匹配,这些行同样会列出。
用于合并两个或多个 SELECT 语句的结果集
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同
区别:
union all是展示所有的结果,union会在union all的基础上去重
-- 语法:union SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2 -- 示例 SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA -- 语法:union all SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2 -- 示例 SELECT E_Name FROM Employees_China UNION ALL SELECT E_Name FROM Employees_USA
用于创建表的备份复件,从一个表中选取数据,然后把数据插入另一个表中
-- 语法 SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename -- 示例 SELECT * INTO Persons_backup FROM Persons -- 示例:IN 子句可用于向另一个数据库中拷贝表 SELECT * INTO Persons IN 'Backup.mdb' FROM Persons
用于创建数据库
-- 语法 CREATE DATABASE database_name -- 示例 CREATE DATABASE my_db
用于创建数据库中的表
-- 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... ) -- 示例 CREATE TABLE Persons ( Id_P int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) )
约束用于限制加入表的数据的类型。
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
我们将主要探讨以下几种约束:
NOT NULL 约束强制列不接受 NULL 值
-- 示例 CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) )
UNIQUE 约束唯一标识数据库表中的每条记录
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
-------------------- 创建时设置约束 -------------------- -- 示例:单一字段 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 ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName) ) -------------------- 创建后设置约束 -------------------- -- 示例:单一字段 ALTER TABLE Persons ADD UNIQUE (Id_P) -- 示例:多字段 ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName) -- 示例:撤销约束 ALTER TABLE Persons DROP INDEX uc_PersonID
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
-------------------- 创建时设置约束 -------------------- -- 示例:单一字段 CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), PRIMARY KEY (Id_P) ) -- 示例:多字段 CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName) ) -------------------- 创建后设置约束 -------------------- -- 示例:单一字段 ALTER TABLE Persons ADD PRIMARY KEY (Id_P) -- 示例:多字段 ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName) -- 示例:撤销约束 ALTER TABLE Persons DROP PRIMARY KEY
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
-------------------- 创建时设置约束 -------------------- -- 示例:单一字段 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 ( Id_O int NOT NULL, OrderNo int NOT NULL, Id_P int, PRIMARY KEY (Id_O), CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) ) -------------------- 创建后设置约束 -------------------- -- 示例:单一字段 ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) -- 示例:多字段 ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) -- 示例:撤销约束 ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
-------------------- 创建时设置约束 -------------------- -- 示例:单一字段 CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CHECK (Id_P>0) ) -- 示例:多字段 CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes') ) -------------------- 创建后设置约束 -------------------- -- 示例:单一字段 ALTER TABLE Persons ADD CHECK (Id_P>0) -- 示例:多字段 ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes') -- 示例:撤销约束 ALTER TABLE Persons DROP CHECK chk_Person
DEFAULT 约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
-------------------- 创建时设置约束 -------------------- -- 示例:单一字段 CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) DEFAULT 'Sandnes' ) -------------------- 创建后设置约束 -------------------- -- 示例:单一字段 ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES' -- 示例:撤销约束 ALTER TABLE Persons ALTER City DROP DEFAULT
CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
-- 语法:在表上创建一个简单的索引。允许使用重复的值 CREATE INDEX index_name ON table_name (column_name) -- 语法:在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值 CREATE UNIQUE INDEX index_name ON table_name (column_name) -- 示例 CREATE INDEX PersonIndex ON Person (LastName) -- 示例:组合索引 CREATE INDEX PersonIndex ON Person (LastName, FirstName)
使用drop删除
-- 语法:删除索引 ALTER TABLE table_name DROP INDEX index_name -- 语法:删除表 DROP TABLE 表名称 -- 语法:删除数据库 DROP DATABASE 数据库名称 -- 语法:删除数据,不删除表结构 TRUNCATE TABLE 表名称
用于在已有的表中添加、修改或删除列
-- 语法:添加列 ALTER TABLE table_name ADD column_name datatype -- 语法:删除列 ALTER TABLE table_name DROP COLUMN column_name -- 语法:修改列数据类型 ALTER TABLE table_name ALTER COLUMN column_name type
在新记录插入表中时生成一个唯一、自增的数字
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1
-- 示例 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
视图是基于 SQL 语句的结果集的可视化的表
-- 语法:创建视图 CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition -- 示例:创建视图 CREATE VIEW [Current Product List] AS SELECT ProductID,ProductName FROM Products WHERE Discontinued=No -- 示例:查询 SELECT * FROM [Current Product List] -- 语法:更新视图 SQL CREATE OR REPLACE VIEW Syntax CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition -- 示例:更新视图 CREATE VIEW [Current Product List] AS SELECT ProductID,ProductName,Category FROM Products WHERE Discontinued=No -- 语法:撤销视图 SQL DROP VIEW Syntax DROP VIEW view_name
日期
数据库提供函数可以实现提取日期中的任意信息,也有时间格式相关的函数
NOW() 返回当前的日期和时间
CURDATE() 返回当前的日期
CURTIME() 返回当前的时间
DATE() 提取日期或日期/时间表达式的日期部分
EXTRACT() 返回日期/时间按的单独部分
DATE_ADD() 给日期添加指定的时间间隔
DATE_SUB() 从日期减去指定的时间间隔
DATEDIFF() 返回两个日期之间的天数
DATE_FORMAT() 用不同的格式显示日期/时间
-- 示例 SELECT * FROM Orders WHERE OrderDate='2008-12-26'
详细查看Date相关函数
NULL 值是遗漏的未知数据。
默认地,表的列可以存放 NULL 值。
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。
注释:无法比较 NULL 和 0;它们是不等价的。
-- 示例:使用is null查找null值 SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NULL -- 示例 SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NOT NULL -- 示例:如果是null值,设置指定值,使用IFNULL()函数 SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products -- 示例:如果是null值,设置指定值,使用COALESCE()函数 SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0)) FROM Products
在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。
Text 类型
Number 类型
Date 类型
SQL 拥有很多可用于计数和计算的内建函数。
自定义函数语法
SELECT function(列) FROM 表
函数分为两类
AVG 函数返回数值列的平均值。NULL 值不包括在计算中。
-- 语法 SELECT AVG(column_name) FROM table_name -- 示例 SELECT Customer FROM Orders WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
返回匹配指定条件的行数,NULL 不计入
-- 语法 SELECT COUNT(column_name) FROM table_name SELECT COUNT(*) FROM table_name SELECT COUNT(DISTINCT column_name) FROM table_name -- 示例 SELECT COUNT(Customer) AS CustomerNilsen FROM Orders WHERE Customer='Carter' SELECT COUNT(*) AS NumberOfOrders FROM Orders SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders
返回指定的字段中第一个记录的值
-- 语法 SELECT FIRST(column_name) FROM table_name -- 示例 SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM OrdersOrders
LAST() 函数返回指定的字段中最后一个记录的值。
-- 语法 SELECT LAST(column_name) FROM table_name -- 示例 SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders
MAX 函数返回一列中的最大值。NULL 值不包括在计算中。
-- 语法 SELECT MAX(column_name) FROM table_name -- 示例 SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
MIN 函数返回一列中的最小值。NULL 值不包括在计算中。
-- 语法 SELECT MIN(column_name) FROM table_name -- 示例 SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders
SUM 函数返回数值列的总数。
-- 语法 SELECT SUM(column_name) FROM table_name -- 示例 SELECT SUM(OrderPrice) AS OrderTotal FROM Orders
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
-- 语法 SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name -- 示例 SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders GROUP BY Customer,OrderDate
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
-- 语法 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 -- 示例 SELECT Customer,SUM(OrderPrice) FROM Orders WHERE Customer='Bush' OR Customer='Adams' GROUP BY Customer HAVING SUM(OrderPrice)>1500
https://www.w3school.com.cn/sql/sql_syntax.asp