第VII章、高度なデータベースクエリ
要約:
1。一般的なマスターデータのクエリ機能拡張
2。マスタークエリ、交差点、差分演算
3。サブクエリの使用をマスター
4。いくつかの他のクエリを知っています
セクションI一般的なデータクエリ機能拡張
1.1。SELECTステートメント
//SQL的一般查询语句
SELECT [DISTINCT] [TOP n] select_list
//将查询的结果插入到了一个表中
[INTO new_table]
//需要查询的表
[FROM table_source]
//查询的条件
[WHERE search_conditition]
//对查询的结果进行分组
[GROUP BY group_by_expression]
//指定组或聚合函数的查找条件
[HAVING search_condition]
//对查询的结果进行排序
[ORDER BY order_expression [ASC|DESC]]
//对查询结果结果后面生成汇总数据行
[COMPUTE expression]
1.2。TOPは、結果セットの使用を制限します
【タイで】TOP N [パーセント]
•トップN Nフロントライン
•上位N [パーセント] N%フロントロー
•[TIES WITH]:縛られた値の最後の行の結果を含みます。
例:
【例1】查询单价最高的前三种商品的商品名、商品类别和单价,包括并列情况。
SELECT TOP 3 WITH TIES GoodsName, GoodsClassName,SaleUnitPrice,FORM Table_Goods a JOIN Table_GoodsClass b
ON a.GoodsClassID=b.GoodsClassID ORDER BY SaleUnitPrice DESC
1.3。ユースケースの機能
ポイントは、異なるタイプのデータを表示します。CASE機能は、多分岐式です。
二つのタイプ:
- 単純なケース機能
- CASE検索機能
構文:
CASE
WHEN 布尔表达式1 then 结果表达式1
WHEN 布尔表达式2 then 结果表达式2
……
WHEN 布尔表达式n then 结果表达式n
[ELSE 结果表达式n+1]
END
ケース:
次の文の役割の解析(P110)
SELECT a.GoodsID,商品销售类别=CASE
WHEN COUNT(b.GoodsID)>10 THEN ‘热门商品’
WHEN COUNT(b.GoodsID)BETWEEN 5 AND 10 THEN ‘一般商品’
WHEN COUNT(b.GoodsID)BETWEEN 1 AND 4 THEN ‘难销商品’
ELSE ‘滞销商品’
END
FROM Table_Goods a LEFT JOIN Table_SaleBillDetail b
ON a.GoodsID=b.GoodsID GROUP BY a.GoodsID
1.4。新しいテーブルにクエリ結果を保存します
SELECTクエリリストシーケンスINTO <新しいテーブル名>
......データソース(別のラインフィルタ、文のグルーピング)FROM
注:ローカル・テンポラリ・テーブルにテーブル名プラス#は、グローバル一時テーブルは##、唯一のテーブルには、永続的なテーブルと呼ばれます。
一時表は、現在入手可能な照会することができます
例子:WHERE Table_Customer SELECT * FROM INTO #HD_Customer ......
クエリ結果のセクションII、交差点、差分演算
2.1。そして、操作
そして操作(UNION):結合された結果セットとしてクエリ結果の複数。。
構文:
SELECT 语句1
UNION [ALL]
SELECT 语句2
UNION [ALL]
……
使用UNION注:
マージクエリに、同じセマンティクス、同じでなければならない列の数を選択します。
各データに対応する列は、CHAR(20)とvarchar(40)として、暗黙の互換性のある型。
SELECT文を使用して最初の列見出しを組み合わせた結果。
発注の場合は、最後のSELECTの後に書かれた文で、GROUP BY、および文の並べ替えは、最初のSELECTの列名です。
2.2。交差点操作
デポジット操作:両方のセットの同時発生で返されたレコード。
構文:
SELECT 语句1
INTERSECT
SELECT 语句2
INTERSECT ……
SELECT 语句n
2.3。差分演算
差分計算は:最初のセットを返し、第2のセットはレコードがありません。
構文:
SELECT 语句1
EXCEPT
SELECT 语句2
EXCEPT……
SELECT 语句n
第相関サブクエリ
サブクエリは、SELECT文で別の中に含まれているSELECT文です。外側層は外側のクエリSELECT文、内部クエリ(またはサブクエリ)と呼ばれる内層のSELECT文と呼ばれています。
サブクエリは、常に括弧の中に書かれています。
SELECT文では、主に以下のいずれかの形式を使用してサブクエリが含まれています。
(1)式[NOT] IN(サブクエリ)
(2)式comparison_operator [ANY | すべて]
(3)ここで、[NOT] EXISTS(サブクエリ)
ケース:
1、
テスト・セットに基づいて使用サブクエリ
王に加えて、クエリや地域との王の人々、
SELECT Cname,Address
FROM Table_Customer
WHERE Address IN(
SELECT Address
FROM Table_Customer
WHERE Cname=‘王晓’)
AND Cname!= ‘王晓’
2、
サブクエリ比較テストの使用
コモディティクエリ名と単価の最高単価
SELECT Goodname,SaleUnitPrice
FROM Table_Goods a
WHERE SaleUnitPrice=
(
SELECT MAX(SaleUnitPrice)
FROM Table_Goods
)
3、
サブクエリのテストの存在を使用します
価格お問い合わせ購入のお客様の商品の売上高の2000元以上の会員数が高いです。
SELECT DISTINCT CardID
FROM Table_SaleBill
WHERE EXISTS(
SELECT *
FROM Table_SaleBillDetail
WHERE SaleBillID=Table_SaleBill.SaleBillID
AND UnitPrice>2000
)
サブクエリのセクションIV他の形態
4.1。サブクエリの代替表現
サブクエリが返すSELECTの選択リスト内の唯一のスカラー値に埋め込まれました。
例:
SELECT Cname,Address,(
SELECT COUNT(*)
FROM Table_Customer b ON a.CardID=b. CardID
WHERE CustomerID=‘C001’
)AS TotalTimes
FROM Table_Custmer
Where CustomerID=‘C001’
4.2。派生テーブル
- 呼ばれるインラインビューサブクエリをテーブルとして扱われ、生成された新たなテーブルは、「テーブルを導出した。」であります
例:
発見G001とG002は、少なくとも二つのコモディティ顧客番号と顧客名を購入します。
SELECT CustomerID,CName
FROM (
SELECT *
FROM Table_SaleBill a JOIN Table_SaleBillDetail b
ON a.SaleBillID=b. SaleBillID
WHERE GoodsID=‘G001’
) AS T1 JOIN (
SELECT *
FROM Table_SaleBill a
JOIN Table_SaleBillDetail b ON a.SaleBillID=b. SaleBillID
WHERE GoodsID=‘G002’
) AS T2
ON T1.CardID=T2.CardID
JOIN Table_Customer c ON c.CardID=T1. CardID
セクションVその他のクエリ
5.1。窓関数
SQL Serverでは、行のセットは、ウィンドウと呼ばれています。
重合の関数として、ウィンドウ関数は、行セット重合計算に設定されているが、それは、共通の集約関数が返すように窓関数を実行するので、ウィンドウ関数は、グループごとに複数の値を返すことができグループごとに1つの値ではありません行セット重合性基は、ウィンドウを計算しています。
重合機能は、重合後に機能を窓掛けするキーワードOVER機能を追加し、異なっています。
- 関数呼び出しの形式を窓掛けすることである:
関数名(列)OVER(オプション)- OVERキーワード:関数の代わりに、集計関数として窓関数を示します。
- SQL標準では、これらの2つの用途を区別するためにオーバーキーワードを使用して、機能を窓掛け使用されるすべての集約関数を可能にします。
例1:
高分子機能と組み合わせて使用OVER単語
カリキュラムコースのある(CNO、CNAME、クレジット、セメスター)CNO、CNAME、学期、信用情報や全体の学期のコース、最高、平均、最小クレジットのクエリフルコース。
SELECT Cno,CName,Semester ,Credit
SUM(Credit) OVER(PARTITION BY Semester) AS ‘Total’,
AVG(Credit) OVER(PARTITION BY Semester) AS ‘Avg’,
MIN(Credit) OVER(PARTITION BY Semester) AS ‘Min’,
MAX(Credit) OVER(PARTITION BY Semester) AS ‘Max’,
FROM Course
例2:
OVER句は、ランキング機能と組み合わせて使用されます
- ランキング関数RANK()
RANK() OVER([<partition_by_clause>,…[n]]<order_by_clause>)
- 注:ランキング機能は不明です。
1初め、必ずしも連続した整数からランク付け。
SELECT OrderID, ProductID, OrderQty
RANK() OVER(PARTITION BY OrderID ORDER BY OrderQty DESC )
AS RANK
FROM OrderDetail
ORDER BY OrderID
その他のランキング関数
- DENSE_RANK()
これは、連続した整数位にランク
- NTILE()
グループの指定された数、1から始まる番号に行を分割順序付けられたパーティションは、関数は、行のグループ所属の数を返します。
- ROW_NUMBER()
戻り結果は、各パーティションの先頭から最初の行の各パーティションのシリアル番号を設定します。
5.2。共通テーブル式
- 共通テーブル式(CommonTableExpression、CTE):
一時的な名前を指定するには、クエリ結果セットは、結果セットの名前は、共通テーブル式です。
- フォーマット:
WITH <common_table_expression>[,…n]
<common_table_expression>::=
Expression_name[(column_name [,…n])]
AS
(SELECT语句)
例:
商品の総数、およびCTEクエリ会員番号と購入したアイテム数の使用のCTEを購入するために、各メンバーの統計情報を定義します。
定義:
WITH BuyCount(CardID,Counts)
AS(SELECT CardID,Count(*)
FROM Table_SaleBill
GROUP BY CardID
)
使用します。
AS(
SELECT CardID,Counts
FROM BuyCount
ORDER BY Counts
)
例:
1、
1.设某数据库中有旅客表A(旅客编号,城市)和旅客表B(旅客编号,城市),现将所有旅客的数据存储这两张表中。请补全如下查询语句,使得该查询语句能查询所有旅客所在的全部的不重复的城市。
SELECT 城市 FROM 旅客表A
( )
SELECT 城市 FROM 旅客表B
答案: UNION
2、
2.设有购买表(顾客号,商品号,购买时间)。现要查询顾客A与顾客B购买的相同商品。有下列查询语句:
Ⅰ.
SELECT 商品号 FROM 购买表 WHERE 顾客号 = 'A'
AND 商品号 IN (SELECT 商品号 FROM 购买表 WHERE 顾客号 = 'B')
Ⅱ.
SELECT 商品号 FROM 购买表 WHERE 顾客号 = 'A'
EXCEPT
SELECT 商品号 FROM 购买表 WHERE 顾客号 = 'B‘
Ⅲ.
SELECT 商品号 FROM 购买表 WHERE 顾客号 = 'A'
INTERSECT
SELECT 商品号 FROM 购买表 WHERE 顾客号 = 'B'
Ⅳ.
SELECT 商品号 FROM 购买表 WHERE 顾客号 = 'A'
UNION
SELECT 商品号 FROM 购买表 WHERE 顾客号 = 'B'
上述语句中,能够实现该查询要求的是( )。
A.仅Ⅰ和Ⅱ
B.仅Ⅰ和Ⅲ
C.仅Ⅰ和Ⅳ
D.仅Ⅲ
答案:B
3、
3.设有选课表(学号,课程号,成绩),现要统计每门课程的选课人数,并将结果保存到新表:选课情况表。下列语句中正确的是( )。
A.
SELECT 课程号, COUNT(*) 选课人数 FROM 选课表 INTO 选课情况表GROUP BY 课程号
B.
SELECT 课程号, COUNT(*) 选课人数 INTO 选课情况表 FROM 选课表 GROUP BY 课程号
C.
SELECT 课程号, COUNT(*) FROM 选课表 INTO 选课情况表(课程号,选课人数)GROUP BY 课程号
D.
SELECT 课程号, COUNT(*) INTO 选课情况表(课程号, 选课人数)
FROM 选课表 GROUP BY 课程号
答案:B
4、
4.设某数据库中有学生表(学号,姓名,所在系)和选课表(学号,课程号,成绩)。现要查询没选课的学生姓名和所在系。下列语句中能够实现该查询要求的是( )。
A.SELECT姓名,所在系FROM学生表a LEFT JOIN选课表b
ON a.学号=b.学号WHERE a.学号IS NULL
B.SELECT姓名,所在系FROM学生表a LEFT JOIN选课表b
ON a.学号=b.学号WHERE b.学号IS NULL
C.SELECT姓名,所在系FROM学生表a RIGHT JOIN选课表b
ON a.学号=b.学号WHERE a.学号IS NULL
D.SELECT姓名,所在系FROM学生表a RIGHT JOIN选课表b
ON a.学号=b.学号WHERE b.学号IS NULL
答案:B
5、
5.设在SQL Server2008中,用户U1在DB1数据库中创建了#Temp表。下列关于#Temp表的说法中,正确的是( )。
A.在所有用户U1发起的连接中,都可以查询#Temp表数据
B.只有在创建#Temp表的连接中才可以查询#Temp表数据
C.在创建#Temp表的连接未断开时,DB1数据库的所有用户都可以查询#Temp表数据
D. 在创建#Temp表的连接断开时,DB1数据库的所有用户仍可以查询#Temp表数据
答案:B
6、
SQL Server 2008のデータベースとライブラリアプリケーションでは三つの基本的なテーブル、テーブル構造を以下に示した、SQL文の中で次の2つのクエリを完了してください。
借り手:
図書館カード番号 | フルネーム | 部署名 | クラス |
---|---|---|---|
12011106 | 江Huiwen | コンピュータサイエンス専攻 | 12-1 |
12011107 | 王李 | コンピュータサイエンス専攻 | 12-1 |
12012113 | ファンYuanyuan | 情報部 | 12-2 |
...... | ...... | ...... | ...... |
ローン:
図書館カード番号 | ライブラリの登録番号 | 借入日 |
---|---|---|
12011106 | T001001 | 2012年1月2日 |
12012113 | T001026 | 2013年2月6日 |
...... | ...... | ...... |
BOOKS:
コール数 | タイトル | 著者 | ブック登録番号 | プレス | 価格 |
---|---|---|---|---|---|
TP311.1 | データベースシステム | 李明 | T001001 | 科学 | 19.00 |
TP311.2 | C言語 | 王シャン | T001026 | 人々 | 32.00 |
...... | ...... | ...... | ...... | ...... | ...... |
学生、名、部署名、およびライブラリの数の少なくとも5冊の本を借りるために図書館カードを取得する(1)。
借入のいずれかの本(2)検索ライブラリと借り王李同級生、部門名、タイトル、日付の学生と同じ名前。
1、
SELECT LOANS.借书证号,姓名,系名,COUNT(*)
AS 借书数量
FROM BORROWER,LOANS
WHERE BORROWER.借书证号=LOANS.借书证号
GROUP BY LOANS.借书证号
HAVING COUNT(*)>=5;
2、
SELECT 姓名,系名,书名,借书日期
FROM BORROWER,LOANS , BOOKS
WHERE
BORROWER.借书证号=LOANS.借书证号
AND LOANS.图书登记号=BOOKS.图书登记号
AND 索书号 IN
(
SELECT 索书号 FROM BORROWER,LOANS,BOOKS
WHERE BORROW.借书证号=LOANS.借书证号
AND LOANS.图书馆登记号=BOOKS.图书登记号
AND 姓名="王丽"
)