本文包括对数据表数据的增删改的高级操作,包括
文章目录
TOP --显示条数
用于规定要返回的记录的数目。
注释:并非所有的数据库系统都支持 TOP 子句。
SQL SERVER语法:SELECT TOP number|percent column_name(s) FROM table_name
mysql语法:SELECT column_name(s) FROM table_name LIMIT number
orcle: SELECT * FROM Persons WHERE ROWNUM <= 5
SQL:SELECT TOP 5 * FROM Persons
SELECT TOP 50 PERCENT * FROM Persons
mysql: SEKECT * FROM Person LIMIT 5
orcle: SELECT * FROM Person ROWNUM <=5
like —匹配符匹配
用于在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
# 筛选出城市以N开头的人,%是通配符,
SELECT * FROM Persons WHERE City LIKE 'N%'
# 不含lon的人
SELECT * FROM Persons WHERE City NOT LIKE '%lon%'
# 以 "A" 或 "L" 或 "N" 开头的人:
SELECT * FROM Persons WHERE City NOT LIKE '[ALN]%'
通配符
% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]或者[!charlist] 不在字符列中的任何单一字符
IN —二者之一
允许我们在 WHERE 子句中规定多个值。
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
选取所有姓氏为 Adams 和 Carter 的人:
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
BETWEEN —大小筛选
BETWEEN … AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人
SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'
# 不在之间的
SELECT * FROM Persons
WHERE LastName
NOT BETWEEN 'Adams' AND 'Carter'
Alias —别名
为列名称和表名称指定别名(Alias)。
表的别名SELECT column_name(s) FROM table_name AS alias_name
列的别名: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'
不使用
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName
FROM Persons, Product_Orders
WHERE Persons.LastName='Adams' AND Persons.FirstName='John'
列的别名
SELECT LastName AS Family, FirstName AS Name FROM Persons
JOIN —多个表一起选
join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
从两个或更多的表中获取结果。我们就需要执行 join。
两个表选,不用join:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
列出所有人的定购
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
INNER JOIN:内连接,如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
以full join为例,假如初始表格:
全连接返回:
UNION
用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
默认取并集,去掉重复的,想要保留重复的,用NION ALL
。
SELECT INTO 语句
从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
备份到另一个数据库
SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons
SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing'
SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
VIEE —视图
视图是基于 SQL 语句的结果集的可视化的表。
如何创建、更新和删除视图。
CREATE VIEW
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
这个视图使用下列 SQL 创建:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
我们可以查询上面这个视图:
SELECT * FROM [Current Product List]
Northwind 样本数据库的另一个视图会选取 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]
另一个来自 Northwind 数据库的视图实例会计算在 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'
更新
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No
删除
SQL DROP VIEW Syntax
DROP VIEW view_name
日期(不同)—日期函数
处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。
只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。
在讨论日期查询的复杂性之前,我们先来看看最重要的内建日期处理函数。
内建日期函数
SQL server:
GETDATE() 返回当前日期和时间
DATEPART() 返回日期/时间的单独部分
DATEADD() 在日期中添加或减去指定的时间间隔
DATEDIFF() 返回两个日期之间的时间
CONVERT() 用不同的格式显示日期/时间
只包含日期的表中,筛选特定日期:
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
NULL
默认地,表的列可以存放 NULL 值。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。
注释:无法比较 NULL 和 0;它们是不等价的。
查找null值
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
查找非null的数据
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
isnull() (不同)
当要计算时,我们希望把null值设置为0,可以用函数:isnull(col_name, value)
SQL Server / MS Access:
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
数据类型(不同)
太多了,不一一列举
怎么测试用的是那个sql语言?isnull()?