SQL语句
1.SQL语句
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语句完成的。
下面的语句从表中选取LastName列的数据:
SELECT LastName from Persons
结果集类似这样:
LastName | |||
---|---|---|---|
Adams | |||
Bush | |||
Carter |
注意事项:SQL对大小写不敏感
2. SQL DML和DDL
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
查询和更新指令构成了 SQL 的 DML 部分:
- SELECT - 从数据库表中获取数据
- UPDATE - 更新数据库表中的数据
- DELETE - 从数据库表中删除数据
- INSERT INTO - 向数据库表中插入数据
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
3. SQL SELECT 语句
SELECT 语句用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。
3.1 SQL SELECT 语法
SELECT 列名称 FROM 表名称
以及
SELECT * FROM 表名称
星号(*)是选取所有列的快捷方式。
注释:SQL语句对大小写不敏感。SELECT等效于select。
3.2 SQL SELECT 实例
如需要取名为"LastName"和"FirstName"的列的内容(从名为"Persons"的数据库表),请使用类似这样的SELECT语句:
SELECT LastName,FirstName FROM Persons
"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 |
结果:
LastName | FirstName |
---|---|
Adams | John |
Bush | George |
Carter | Thomas |
3.3 SELECT DISTINCT
在表中,可能会包含重复值。这并不成问题,不过,有时您希望仅仅列出不同(distinct)的值。
关键字 DISTINCT
用于返回唯一不同的值。
语法:
SELECT DISTINCT 列名称 FROM 表名称
4.SQL WHERE 子句
如果有条件地从表中选取数据,可将WHERE子句添加到SELECT语句。
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
下面的运算符可在WHERE子句中使用:
操作符 | 描述 |
---|---|
= | 等于 |
<> 或者 != | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN .. AND .. | 在某个范围内 |
LIKE | 搜索某种模式 |
4.1 使用WHERE子句
如果只希望选取居住在城市"Beijing"中的人,我们需要向SELECT语句添加WHERE子句:
SELECT * FROM Persons
WHERE City='Beijing'
"Persons"表
LastName | FirstName | Address | City | Year |
---|---|---|---|---|
Adams | John | Oxford Street | London | 1970 |
Bush | George | Fifth Avenue | New York | 1975 |
Carter | Thomas | Changan Street | Beijing | 1980 |
Gates | Bill | Xuanwumen 10 | Beijing | 1985 |
结果:
LastName | FirstName | Address | City | Year |
---|---|---|---|---|
Carter | Thomas | Changan Street | Beijing | 1980 |
Gates | Bill | Xuanwumen 10 | Beijing | 1985 |
注: SQL使用单引号来环绕文本值。如果是数值,请不要使用引号.
5. AND 和 OR 运算符
AND 和 OR 可在 WHERE 子句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则OR 运算符显示一条记录。
5.1 AND 运算符实例
假设原始的表:
LastName | FirstName | Address | City |
---|---|---|---|
Adams | John | Oxford Street | London |
Bush | George | Fifth Avenue | New York |
Carter | Thomas | Changan Street | Beijing |
Carter | William | Xuanwumen 10 | Beijing |
使用 AND 来显示所有姓为"Carter"并且名为"Thomas"的人:
SELECT * FROM Persons WHERE FirstName='Thomas'
AND
LastName='Carter'
结果:
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
5.2 OR 运算符实例
使用 OR 来显示所有姓名为"Carter" 或者名为 "Thomas" 的人:
SELECT * FROM Persons WHERE firstname='Thomas'
OR
lastname='Carter'
结果:
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
Carter | William | Xuanwumen 10 | Beijing |
6. ORDER BY 语句
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用DESC 关键字。
原始Orders表:
Company | OrderNumber |
---|---|
IBM | 3532 |
W3School | 2356 |
Apple | 4698 |
W3School | 6953 |
6.1 以字母顺序显示公司名称:
SELECT Company,OrderNumber FROM Orders
ORDER BY Company
结果:
Company | OrderNumber |
---|---|
Apple | 4698 |
IBM | 3532 |
W3School | 6953 |
W3School | 2356 |
6.2 以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):
SELECT Company,OrderNumber FROM Orders
ORDER BY Company,OrderNumber
Company | OrderNumber |
---|---|
Apple | 4698 |
IBM | 3532 |
W3School | 2356 |
W3School | 6953 |
6.3 以逆字母顺序显示公司名称:
SELECT Company,OrderNumber FROM Orders
ORDER BY Company DESC
Company | OrderNumber |
---|---|
W3School | 6953 |
W3School | 2356 |
IBM | 3532 |
Apple | 4698 |
7. INSERT INTO 语句
INSERT INTO 语句用于向表格中插入新的行。
语法
INSERT INTO 表名称 VALUES (值1,值2,....)
我们也可以指定所要插入数据的列:
INSERT INTO table_name (列1,列2 , ...) VALUES (值1,值2,....)
插入新的行:
"Persons"表:
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
SQL 语句:
INSERT INTO Persons VALUES ('Gates','Bill','Xuanwumen 10','Beijing')
结果:
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
Gates | Bill | Xuanwumen 10 | Beijing |
8. SQL UPDATE 语句
Update 语句用于修改表中的数据。
语法:
UPDATE 表名称 SET 列名称= 新值 WHERE 列名称= 某值
9. DELETE 语句
DELETE语句用于删除表中的行。
DELETE FROM 表名称 WHERE 列名称=值
删除所有行:
可以在不删除表的情况下删除所有行。这意味着表的结构,属性和索引都是完整的:
DELETE FROM table_name
或者:
DELETE * FROM table_name
10. SQL 通配符
在搜索数据库中的数据时,SQL通配符可以替代一个或多个字符。
SQL通配符必须与LIKE
运算符一起使用。
在SQL中,可以使用以下通配符:
通配符 | 描述 |
---|---|
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist]或者[!charlist] | 不在字符列中的任何单一字符 |
11. SQL BETWEEN 操作符
BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围。
SELECT colume_name FROM table_name WHERE colume_name
BETWEEN
values1AND
value2
11.1 BETWEEN 操作符实例
如需以字母顺序显示介于"Adams"(包括) 和"Carter"(不包括)之间的人,请使用下面的SQL:
SELECT * FROM Persons WHERE LastName
BETWEEN
'Adams'AND
'Carter'
注意事项:
不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。某些数据库会列出介于 "Adams" 和 "Carter" 之间的人,但不包括 "Adams" 和 "Carter" ;某些数据库会列出介于 "Adams" 和 "Carter" 之间并包括 "Adams" 和 "Carter" 的人;而另一些数据库会列出介于 "Adams" 和 "Carter" 之间的人,包括 "Adams" ,但不包括 "Carter" 。
11.2 如需使用上面的列子显示范围之外的人,请使用NOT 操作符:
SELECT * FROM Persons WHERE LastName
NOT
BETWEEN
'Adams'AND
'Carter'
12. SQL INNER JOIN 关键字
在表中存在至少一个匹配时,INNER JOIN 关键字 返回行。
INNER JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
INNER JOIN
table_name2
ON
table_name1.column_name=table_name2.column_name
注释:INNER JOIN 与JOIN 是相同的。
原始表:"Persons"表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders"表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
内连接(INNER JOIN) 实例
现在,我们希望列出所有人的订购。您可以使用下面的SELECT语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN
Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
结果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
13. SQL LEFT JOIN 关键字
LEFT JOIN 关键字会从左表(table_name1)那里返回所有的行,即使在右表(table_name2)中没有匹配的行。
LEFT JOIN 关键字语法
SELECT column_name FROM table_name1
LEFT JOIN
table_name2ON
table_name1.column_name=table_name2.column_name
”Persons"表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders"表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
左连接(LEFT JOIN) 实例
我们列出所有人,以及它们的订购,如果有的话。
可以使用下面的SELECT 语句:
SELECT Persons.LastName,Persons.FirstName,Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.id_P=Orders.ID_P ORDER BY Persons.LastName
结果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
Bush | George |
LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。
14.SQL RIGHT JOIN 关键字
RIGHT JOIN 关键字会右表(table_name2)那里返回所有的行,即使左边(table_name1)中没有匹配的行。
RIGHT JOIN 关键字语法
SELECT column_name FROM table_name1
RIGHT JOIN
table_name2ON
table_name1.column_name=table_name2.column_name
原始的表:
"Persons"表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders"表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
右连接(RIGHT JOIN) 实例
我们希望列出所有的订单,以及订购它们的人-如果有的话。
可以使用下面的SELECT 语句:
SELECT Persons.LastName,Persons.FirstName,Orders.OrderNo
FROM PersonsRIGHT JOIN
OrdersON
Persons.Id_P=Orders.ID_P ORDER BY Persons.LastName
结果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
34764 |
RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。