データクエリ。
データクエリは、データベースで最も一般的に使用される操作です。SELECT
ステートメントはSQLで提供され、必要な情報はクエリ操作で取得できます。SELECT
ステートメントの一般的な形式は次のとおりで、一時的にスキップできます。例を通じてクエリ操作を直感的に理解すると、一般的な形式をよりよく理解できるようになります。
SELECT [ALL|DISTINCT][TOP N [PERCENT]|[WITH TIES]]
Col_1 AS Nickname_1,Col_2 AS Nickname_2,...,Col_n AS Nickname_n
FROM NAME_OF_TABLE AS Table_Nickname
WHERE CONDITION
GROUP BY Col_x [HAVING CONDITION]
ORDER BY Col_y [ASC|DESC]
クエリの結果は依然としてリレーションシップ、つまりデータテーブルであることに注意する必要があります。SELECT
文の実行プロセスは、句WHERE
の検索条件に従ってFROM
、句で指定された基本テーブルから条件を満たすタプルを選択し、句で指定されたSELECT
列に従ってこれらの列に結果を投影することです。GROUP BY Col_x
句がある場合、クエリの結果は、クエリ内Col_x
の同じ値に従ってグループ化されます。句のGROUP
後にHAVING CONDITON
句がある場合、条件式を満たすタプルのみが出力されます。ORDER BY Col_y
最後に句がある場合、クエリ結果は、ORDER
句のCol_yの値と[ASC]|[DESC]
次のに従って昇順または降順でソートされます。
単一のリレーショナルデータクエリ。
無条件クエリ。
無条件クエリとはSELECT...FROM...
、のみを含むクエリを指します。この種類のクエリは最も単純で、関係を投影することだけに相当します。
[例]すべての学生の学生ID、名前、年齢を照会します。
SELECT SNo,SN,Age
FROM S
[例]すべての学生情報を照会します。
SELECT *
FROM S
SELECT
ステートメントで[*] を使用して、1つずつ書き込むのではなく、すべての列を示します。
[例]コースを受講した学生の学生IDを照会します。
学生が複数のコースを選択する状況が発生するため、学生選択テーブルに学生IDレコードが重複します。重複する学生IDを除外したいと考えています。
SELECT DISTINCT SNo
FROM SC
上記のクエリはすべて、WHERE
句のない無条件クエリであり、射影クエリとも呼ばれます。ただし、リレーショナル代数の定義では、射影操作によって重複行が自動的に削除され、SQLのクエリステートメントでDISTINCT
はキーワードが使用されている場合にのみ重複行が削除されることに注意してください。さらに、クエリステートメントを使用して、列名が結果にAS
表示される順序を制御したり、キーワードを使用して表示を読みやすくするためのエイリアスを指定したりできます。
[例]すべての学生の名前、年齢、学生番号を照会します。
SELECT SN AS Name,Age,SNo
FROM S
どのName
ようにSN
エイリアスクエリ結果に表示されます。
条件クエリ。
テーブル内の特定の条件を満たす行を検索する場合は、WHERE
句を使用してクエリ条件を指定する必要があります。WHERE
句のクエリ条件は、多くの場合3つの部分で説明されます。
- 列名
- 比較演算子
- 列名、定数
一般的に使用される比較演算子は次のとおりです。
条件付きクエリのコードを示すいくつかの例を示します。
[例]選択科目番号がC1である学生の学生番号と学年を照会します。
SELECT SNo,Score
FROM SC
WHERE CNo='C1'
【例】85点以上の学生番号、コース番号、成績を問い合わせる。
SELECT SNo,CNo,Score
FROM SC
WHERE Score>85
[例] C1またはC2を受験し、スコアが85ポイント以上の学生の学生番号、コース番号、および成績をクエリします。
SELECT SNo,CNo,Score
FROM SC
WHERE (CNo='C1' OR CNo='C2') AND Score>=85
[例]給与が1,000元から1,500元の教師のID、名前、役職を照会します。
SELECT TNo,TN,Prof
FROM T
WHERE Salary BETWEEN 1000 AND 1500
注意!SQL ServerではBETWEEN...AND...
クローズドインターバルですが、一部のDBMSではオープンインターバルです。
[例]給与が1,000元から1,500元の範囲にない教師の教師ID、名前、役職を照会します。
SELECT TNo,TN,Prof
FROM T
WHERE Salary NOT BETWEEN 1000 AND 1500
[例] C1またはC2またはC3を受講した学生の学生番号、コース番号、および成績を照会します。
SELECT SNo,CNo,Score
FROM SC
WHERE CNo IN ('C1','C2','C3')
[例]テストのスコアがない学生の学生IDと対応するコースIDをクエリします。
SELECT SNo,CNo
FROM SC
WHERE Score IS NULL
[例]部分一致クエリ。上記のクエリはすべて完全一致クエリですが、正確な値がわからない場合は、あいまいクエリ、つまり部分一致クエリを使用LIKE
またはNOT LIKE
実行することもできます。LIKE
一般的な形式は次のとおりです。
NAME_OF_ATTRIBUTE LIKE STRING
このうちNAME_OF_ATTRIBUTR
、文字数である必要があり、次の文字列定数にSTRING
はワイルドカードを含めることができ、それらをあいまい一致に使用できます。一般的に使用されるいくつかのワイルドカード文字とその意味は次のとおりです。
- [%]は0個以上の文字を
ab%
表しab
ます。たとえば、任意の文字列の後に代表が続くことができます。 - [_]は1文字を
a_b
表します。たとえば、代表a
とのb
間に1文字が存在する場合があります。 - [[]]は、特定の範囲の
[0-9]
文字を表します。たとえば、0〜9の文字を表します。 - [[^]]特定の範囲に
[^0-9]
ない文字を表します。たとえば、0〜9の範囲外の文字を表します。
[例] Zhangが姓であるすべての教師の教師IDと名前を照会します。
SELECT TNo,TN
FROM T
WHERE TN LIKE '张%'
[例] 2番目の単語が「力」である教師の教師IDと名前を照会します。
SELECT TNo,TN
FROM T
WHERE TN LIKE '_力%'
ライブラリ関数。
SQLには、基本的な検索機能を強化するための多数のライブラリ関数が用意されています。よく使用されるライブラリ関数は次のとおりです。
[例]学校番号がS1の生徒の合計スコアと平均スコア。
SELECT SUM(Score) AS TotalScore,AVG(Score) AS AverageScore
FROM SC
WHERE SNo='S1'
上記のコードでas
は、キーワードが列のエイリアスの後に、エイリアスがクエリ結果に表示されるため、ユーザーはより快適に操作できます。クエリでライブラリ関数を使用する場合、通常は各アイテムにエイリアスを追加する必要があります。そうしないと、クエリ結果に列名が表示されません。ノート:ライブラリ関数SUM()
とAVG()
数値データのみに使用することができます。
[例]オプションのC1コースの最高得点、最低得点、極端な違いを見つけます。
SELECT MAX(Score) AS MaxScore,MIN(Score) AS MinScore,
MAX(Score)-MIN(Score) AS Difference
FROM SC
WHERE CNo='C1'
[例]コンピュータサイエンス学部の学生の総数を調べます。
SELECT COUNT(SNo) AS TotalStudents
FROM S
WHERE Dept='计算机'
【例】学校にはいくつの学科がありますか?
SELECT COUNT(DISTINCT Dept) AS DeptNumber
FROM S
キーワードが使用されたDISTINCT
後は、重複する行を排除することを意味しDept
、フィールドの異なる値の数を数えることができます。
【例】コンピュータサイエンス専攻の学生総数を数え、COUNT(*)
関数を利用する。
SELECT COUNT(*) AS TotalStudents
FROM S
WHERE Dept='计算机'
COUNT(*)
関数がするために使用されるすべてのタプルの数をカウントし、重複する行を排除していない、キーワードの使用を許可していませんDISTINCT
。
グループクエリ。
GROUP BY
この句は、属性列または属性列の組み合わせ(つまり、グループ化基準)に従ってクエリ結果を行方向にグループ化でき、各グループ化は、グループ化基準の属性列組み合わせで同じ値を持ちます。
[例]各教師の教師IDとコース数を問い合わせる。
SELECT TNo,COUNT(*) AS TeachNumber
FROM TC
GROUP BY TNo
GROUP BY
句TNo
は値に従ってグループ化され、同じTNo
タプルはすべてグループにグループ化されます。その後、COUNT(*)
関数計算がグループごとに実行され、各教師のコース数をカウントできます。
[例] 2つ以上のコースを受講している学生の学生IDと選択コースの数を照会します。
SELECT SNo,COUNT(*) AS ClassNumber
FROM SC
GROUP BY SNo
HAVING COUNT(*)>=2
GROUP BY
句SNo
は値に従ってグループ化され、同じSNo
タプルはすべて1つのグループにグループ化され、COUNT(*)
関数は各グループで計算され、HAVING
句は結果が2以上のグループを選択します。
SQLクエリが含まれている要約ではWEHER
、GROUP BY
だけでなく、HAVING
句、順番は私たちのリストの順です。
ソート。
クエリ結果をソートする必要がある場合は、ORDER BY
句を使用するORDER BY
必要があります。句は、他のすべての句の後に表示される必要があります。また、並べ替え方法を指定できます。ASC
昇順、DESC
降順、デフォルトでは昇順が使用されます。
[例]選択したC1コースの学生の学生番号と成績を、成績の降順でクエリします。
SELECT SNo,Score
FROM SC
WHERE CNo='C1'
ORDER BY Score DESC
[例]選択科目C2、C3、またはC4を履修している学生の学生番号、コース番号、成績を照会すると、結果は学生番号の昇順でソートされます。学生番号が同じ場合、同じ学生の情報は成績の降順でソートされます。
SELECT SNo,CNo,Score
FROM SC
WHERE CNo IN ('C2','C3','C4')
ORDER BY SNo ASC,Score DESC
デフォルトでは昇順ORDER BY SNo ASC,Score DESC
で記述することもできORDER BY SNo,Score DESC
ます。