server sql之数据查询。数据库学习中最为重要一篇

选择列
例1:从数据库sales的产品表Product中查询出产品ID(ProductID)、产品名称(ProductName)和单价(Price)的数据信息
即:USE sales
GO
SELECT ProductID, ProductName, Price
FROM Product
选择所有列
例2:显示Orders表中所有信息
即:SELECT*
FROM Orders
改变列标题
例3:显示销售员的姓名,性别,出生日期和地址信息
即:SELECT SaleName AS’姓名’,Sex AS’性别’,Birthday AS出生日期”,Address AS’地址’
FROM Seller
其中AS可以省略
选择行
例4:查询Product表中价格低于5元的产品信息
即:SELECT ProductID,ProductName,Price
FROM Product
WHERE Price<5.0
例5:查询销售员Seller在男销售员的信息
即:SELECT SaleID,SaleName,Address,Telephone
FROM Seller
WHERE Sex=’男’
例6:查询订单表Orders,显示不是c02,或c03客户所下订单的信息
即:SELECT*
FROM Ordes
WHERE NOT(CustomerID=’c02’ OR CustomerID=’c03’)
使用字符串模糊匹配
匹配符的含义
匹配符 描述
% 包含零个或多个字符的任意字符串
_ 代表一个任意字符
[] 表示指定范围内的任意单个字符
[^] 表示不再指定范围内的任意单个字符
匹配符的应用实例
LIKE’RA%’ 搜索一字母RA开头的所有字符串
LIKE’%ion’ 搜索以字母ion结尾的所有字符串
LIKE’%ir%’ 搜索任意位置中包含字母ir的所有字符串
LIKE’_mt’ 搜索以字母mt结尾的所有三个字母组成的字符串
LIKE’[BC]%’ 搜索以字母B或C开头的所有字符串
LIKE’[B-K]air’ 搜索以字母B到K中任意一个字母开头,以air结尾的字符串
LIKE’B[^a]%’ 搜索以字母B开头,第二个字母不是a的所有字符串
例7:查询销售员表Seller中所有性张王李的销售人员信息
即:SELECT*FROM Seller WHERE SaleName LIKE’[张王李]%’
使用查询列表
例8:查询Seller表中SaleID为s01,s05,s07的销售人员的信息
即:SELECT SaleID,SaleName,Sex,Birthday,HireDate,Address
FROM Seller
WHERE SaleID=’S01’ OR SaleID=’S05’ OR SaleID=’S07’
注意:与IN相对的谓词是NOT IN,用于查询字段值不属于指定集合的记录
空值的判定
在SQL中,用NULL表示空值,它仅仅是一个符号,不等于空格,也不是0
检索销售员表Seller中雇用日期字段HireDate的值为空的销售人员的资料
即:SELECT*FROM Seller WHERE HireDate IS NULL
排序
单例排序
例9:按出生日期列的降序排列Seller表
即:SELECT SaleID,SaleName,Sex,Birthday,Address
FROM Seller
ORDER BY Birthday DESC
注意:关键字ASC表示升序,可省略,关键字DESC表示降序
还可以这样表示
即:
SELECT SaleID,SaleName,Sex,Birthday,Address
FROM Seller
ORDER BY 3
字段Birthday在SELECT字句中处于第3的位置,一次ORDER BY 3子句表示要按照Birthday字段升序显示销售员。因为没表示ASC和DESC,所以默认升序。
多列排序
例10:查询Orders表中的数据,先按CustomerId升序排列,当CustomerID相同时再按照SaleID降序排列
即:SELECT*
FROM Orders
ORDER BY CustomerID,SaleID DESC
TOP关键字
在SELECT子句中利用TOP关键字限制返回到结果集中的行数
其中TOP integer:表示返回结果集中最前面的几行,用integer表示返回的行数。
TOP integer PERCENT:用百分比表示返回的行数
例11:分别从Customer表中检索出前5行及前20%的顾客信息
即:SELECT TOP 5*
FROM Customer
SELECT TOP 20 PERCENT*
FROM Customer
例12:查询Product表中价格最高的6种商品
即:SELECT TOP 6*
FROM Product
ORDER BY Price DESC
DISTINCT关键字
其中:ALL:运行重复数据行的出现,是默认的关键字
例13: 查询订单详细信息表OrderDetail,显示订购的产品编号,如果多张订单订购了同一产品,则只需显示一次产品编号
即:SELECT ProductID
FROM OrderDetail
SELECT DISTINCT ProductID
FROM OrderDetail
内连接
内连接是多个表通过连接条件中共享列的值进行的比较连接。
例14:
显示OrderID为“10249”的ProductID,ProductName。Quantity及Price。由于OrderID、ProductID以及Quantity这三列来自于OrderDetail表,而ProductName、Price来自于Product表,因此该查询涉及多表查询。
即方法一,在from部分写多个表名,where部分写连接条件
SELECT OrderID,OrderDetail,ProductID,ProductName,Price,Quantiy
FROM OrderDetail,Product
WHERE OrderID=’10249’ AND OrderDetail.ProductID=Product.ProductID
即方法二,在FROM在用JOIN ON实现连接
SELECT OrderID,O.ProductID,ProductName,Price,Quantiy
FROM OrderDetail O INNER JOIN Product P ON O.ProductID=P.ProductID
WHERE OrderID=’10249’
例15:三个表的连接查询,
即:SELECT OrderID,O.CustomerID,ConnectName,O.SaleID,SaleName
FROM Orders O INNER JOIN Customer C ON O.CustomerID=C.CustomerID
INNER JOIN Seller S ON O.SaleID=S.SaleID
WHERE OrderID=’10248’
左外连接
外连接显示包含一个表中所有行和另一个表中匹配行的结果集
左外连接返回LEFT OUTER JOIN关键字左侧指定表(坐标)的所有行和与右侧指定表(右表)匹配的行。
:16:显示所有产品的ProductID,ProductName,Price,以及被客户订购的OrderID,Quantity
即:SELECT P.ProductID,ProductName,Price,OrderID,Quantity
FROM Product P LEFT OUTER JOIN OrderDetail O
ON P.ProductID=O.ProductID
结果是左表中的所有行都显示出来而不管右表中是否订购了这种产品
右外连接
与左外连接相反
例子与上面一样,把左外连接改成右外连接
即:SELECT OrderID,Quantity,P.ProductID,ProductName,Price
FROM OrderDetail O RIGHT OUTER JOIN Product P
ON O.ProductID=P.ProductID
完全外连接
完全外连接是左外连接和右外连接的组合,这个连接返回来自两个表的所有匹配和非匹配行,其中匹配记录仅被显示一次,在非匹配行的情况下,对于数据不可以的列将显示NULL值
例17:向Category表添加新类别–服装,然后查询
即:INSERT INTO Category VALUES(4,’服装’,NULL)
SELECT ProductID,ProductName,Price,Stocks,C.CategoryID,CategoryName
FROM Product P FULL OUTER JOIN Category C
ON P.CategoryID=C.CategoryID
交叉连接
两个表之间的交叉连接,是用左表中的每一行与右表中的每一行进行连接。因此,结果集中的行数是左表的行数乘以右表的行数,该乘积也称为笛卡尔乘积,关键字CROSS JOIN
即:SELECT CustomerID,CompanyName,ConnectName,SaleID,SaleName
FROM Customer CROSS JOIN Seller
查询结果集中包含81条记录,较为庞大,实际上交叉连接没有实际意义,通常用于测试所有可能的情况
聚合函数
专门用于数值统计的函数。
例18:求Product表中所有产品的评价价格,最高价,最低价,以及总库存
即:SELECT AVG(Price) AS ‘平均价格’ FROM Product
SELECT MAX(Price) AS ‘最高价格’ FROM Product
SELECT MIN(Price) AS ‘最低价格’ FROM Product
SELECT SUM(Stocks) AS ‘总库存’ FROM Product
例19:统计Customer表中留有移动电话的客户数量
即:SELECT COUNT(MobilePhone) AS 留有移动电话的客户数量
FROM Customer
例20:统计Product标准,库存量>200的产品数量
即:SELECT COUNT(ProductID)
FROM Product
WHERE Stocks>200
分组汇总字句
使用聚合函数只能返回单个的汇总结果,如果需要显示分组的汇总数据,就必须使用GROUP BY字句,该字句的功能是根据指定的列将表中数据分成多个组后进行汇总
例21:将Product表中的数据按CategoryID进行分组,然后分别统计每一组产品的平均价格及总库存
即:SELECT CategoryID,AVG(Price) AS ‘平均价格’,SUM(Stocks) AS ‘总库存’
FROM Product
GROUP BY CategoryID
HAVING字句可进一步排除不满足条件的组
例22:在上一个例子的基础上只显示平均价格低于10元的分组汇总信息
即:SELECT CategoryID,AVG(Price) AS ‘平均价格’,SUM(Stocks) AS ‘总库存’
FROM Product
GROUP BY CategoryID
HAVING AVG(Price)<10
注意,当同时存在GROUP BY字句,HAVING字句和WHERE字句时,其执行顺序先WHERE字句后GROUP BY字句再HAVING字句
例23:列出所有价格高于5元且组平均价格高于15元的产品的类型、平均价格及总库存
即:SELECT CategoryID,AVG(Price) AS ‘平均价格’,SUM(Stocks) AS ‘总库存’
FROM Product
WHERE Price>5
GROUP BY CategoryID
HAVING AVG(Price)>15
先按照where机组设置的条件过滤价格低于5元的产品,这可能会改变汇总的结果从而影响HAVING字句中基于这些过滤掉的分组
嵌套查询
前面的查询都是单层查询,嵌套查询是指在一个SELECT查询内再嵌入一个SELECT查询。外层的SELECT语句叫外部查询,内部的SELECT语句叫子查询
使用子查询时需注意:
子查询可以嵌套多层
子查询需要圆括号()括起来
子查询中不能使用INTO子句
子查询中的SELECT语句中不能使用image,text或ntext数据类型
子查询返回值的类型为单列单值
例24:查询OrderID为“10222”的顾客信息,查询OrderID为“10222”的顾客信息的具体步骤
1.检索Orders表,查找OrderID为“10222”的CustomerID
即:SELECT CustomerID
FROM Orders
WHERE OrderID=’10222’
执行结果为“02”,即订单编号为“10222”的订单是客户编号为“02”的客户订购的
2.查询Customer表,找到CustomerID为“02”的客户的详细信息
例25:查询 Customer表,找到CustomerID为“02”的客户的详细信息
即:SELECT CustomerID,CompanyName,ConnectName,Address,ZipCode,Telephone
FROM Customer
WHERE CustomerID=’02’
3.可以把第一个查询变为子查询组合两个查询语句,即为嵌套查询:
即:SELECT CusomerID,CompanyName,ConnectName,Address,ZipCode,Telephone
FROM Customer
WHERE CustomerID=(
SELECT CustomerID
FROM Orders
WHERE OrderID=’10222’
)
该嵌套查询的执行过程为:首先对子查询求值(仅一次),求出OrderID为’10222’,CustomerID为’02’,然后进行外部查询,外部查询依赖于子查询的结果
子查询的返回值类型为单列多值
在之前的例子中,子查询的结果是用于比较的单列单值数据,如果子查询中返回的是单列多值,则必须在子查询前使用关键字ALL或ANY或IN
关键字 含义
ALL 比较子查询的所有值
ANY 比较子查询的任一值
IN 属于关系
NOT IN 不属于集合或不是集合中的成员
例25:查询订单ID为“10248”的所订购的产品信息
即:SELECT*
FROM Product
WHERE ProductID=ANY(
SELECT ProductID
FROM OrderDetail
WHERE OrderID=’10248’
例26:修改上面例子,使用关键字IN
SELECT*
FROM Product
WHERE ProductID IN(
SELECT ProductID
FROM OrderDetail
WHERE OrderID=’10248’
)
查询过程还是分两步,首先内部子查询返回订单ID为“10248”的所订购的产品ID(P01003,P01005,P02002)。然后这些值被带入外部查询中,在Product中查找上述ID相匹配的产品信息。
子查询的查询条件依赖于外部查询
例27:显示Customer表中每个客户的订单总数
即:SELECT CustomerID,CompanyName,Address,(
SELECT COUNT(*)
FROM Orders o
WHERE c.CustomerID=o.CustomerIN
GROUP BY CustomerID
)AS 订单数量
FROM Customer c
相关里查询的求解过程一般包含4个步骤
1)外部查询获得一行记录,然后将该记录传递到内部查询。
2)内部查询根据传递的值执行
3)内部查询将结果传回外部查询,外部查询利用这些值完成处理过程
4)重复。。直至外部查询中所有记录行全部检查完毕
带关键字[NOT]EXISTS的子查询
在WHERE子句中使用EXISTS关键字,表示判断子查询的结果集是否为空
例28:使用关键字EXISTS查找下过订单的客户的详细信息
即:SELECT*
FROM Customer
WHERE EXISTS(
SELECT*
FROM Orders
WHERE Customer.CustomerID=Orders.CustomerID
)
合并数据集
例29:用UNION子句将Customer表中CustomerID、ConnectName及Seller表中的SaleID、SaleName组合在一个结果集中
即:SELECT CustomerID,ConnectName FROM Customer
UNION
SELECT SaleID,SaleName FROM Seller
在查询的基础上创建新表
其中新表的列为SELECT子句指定的列,原表中列的数据类型和允许为空属性不变,但其他所有信息如默认值、约束等被忽略
例30:将例10中的查询结果保存到新表temp_orders
即:SELECT*
INTO temp_orders
FROM Orders
ORDER BY CustomerID,SaleID,DESC

猜你喜欢

转载自blog.csdn.net/weixin_42746744/article/details/82114169