8、DQL
以下はダークホースプログラマーが試験問題データベースのデータを表示するページです
ページに表示されるデータはデータベース内のテスト問題バンク テーブルに保存する必要があり、データベース内のデータをクエリして、ユーザーが確認できるようにページに表示する必要があります。上の図は最も基本的なクエリ効果を示しているため、実際には多くのデータベースがあり、すべてのデータを 1 ページに表示することは不可能ですが、ページには次のようなページ表示効果があります。
もちろん、上の図の難易度フィールドをクリックすると、並べ替えとクエリ操作を実装することもできます。この例から、データベースのクエリは柔軟であり、特定のニーズに応じて実装する必要があることがわかります。また、データベース クエリ操作は最も重要な操作でもあるため、この部分は全員が習得する必要があります。
次に、クエリの完全な構文を紹介します。
SELECT フィールド リスト FROM テーブル名リスト WHERE 条件リスト GROUP BY グループ化フィールド HAVING グループ化条件 ORDER BY ソート フィールド LIMIT ページング制限
クエリ ステートメントを説明するには、まずテーブルといくつかのデータを準備する必要があります。
-- stu テーブルを削除します( 存在する場合はテーブルを削除します) stu; -- stu テーブルを作成します CREATE TABLE stu ( id int, --number name varchar(20), --name age int, --age sex varchar(5), - - 性別 アドレス varchar(100), -- アドレス math double(5,2), -- 数学スコア 英語 double(5,2), -- 英語スコア 採用日 日付 -- 登録時刻 ); -- データを追加 INSERT INTO stu(id,NAME,年齢,性別,住所,数学,英語,入社日) VALUES (1,'馬雲',55,'男性','杭州',66,78,'1995-09-01'), (2,'馬華痛',45,'女性','深セン',98,87,'1998-09-01'), (3,'ムスク',55,'男性' ,'香港', 56,77,'1999-09-02'), (4,'劉白',20,'女性','湖南',76,65,'1997-09-05')、 (5,'劉青',20,'男性','湖南',86,NULL,'1998-09-01'), (6,'劉徳華',57,'男性','香港' , 99, 99,'1998-09-01'), (7,'張学友',22,'女性','香港',99,99,'1998-09-01'), ( 8,'デマーシア',18,'男性','南京',56,65,'1994-09-02');
次に、最も基本的なクエリ ステートメントから学びましょう。
8.1 基本的なクエリ
8.1.1 構文
-
複数のフィールドをクエリする
SELECT フィールド リスト FROM テーブル名; SELECT * FROM テーブル名; -- すべてのデータをクエリします
-
重複したレコードを削除する
SELECT DISTINCT フィールド リスト FROM テーブル名;
-
エイリアス
AS:ASも省略可能
8.1.2 演習
-
名前と年齢の 2 つの列をクエリします
STUから名前、年齢を選択します。
-
すべての列のデータをクエリします。列名のリストは * に置き換えることができます。
stu から * を選択します。
上記のステートメントの * は、SQL ステートメントを読むのに不便であるため、すべての人に推奨されるわけではありません。フィールドのリストを作成する場合、各フィールドを説明するコメントを追加できます。
授業時間短縮のため、先生が随所に※を記載させていただきます。
-
アドレス情報を問い合わせる
stu からアドレスを選択します。
上記のステートメントを実行した結果は次のようになります。
上記の結果から、重複データがあることがわかり、
distinct
キーワードを使用して重複データを削除することもできます。 -
重複したレコードを削除する
stu から別のアドレスを選択します。
-
クエリ名、数学のスコア、英語のスコア。math と english の別名として as を使用します (キーワードは省略可能)
名前、数学の成績として数学、stu から英語の成績として英語を選択; stu から名前、数学数学の成績、英語英語の成績を選択;
8.2 条件クエリ
8.2.1 構文
SELECT フィールド リスト FROM テーブル名 WHERE 条件リスト;
-
状態
条件リストでは次の演算子を使用できます。
8.2.2 条件クエリの演習
-
20歳以上の学生の情報を照会する
select * from stu where age > 20;
-
年齢が20歳以上の学生の情報を照会します
select * from stu where age >= 20;
-
年齢が20歳以上30歳以下の学生の情報を照会します
select * from stu where age >= 20 && age <= 30; select * from stu where age >= 20 and age <= 30;
上記のステートメントの && と and は両方とも and を意味します。と使用することをお勧めします。
... と 上記の要件を達成するために、 between ... を使用することもできます。
* 年齢が 20 ~ 30 歳の大学から選択します。
-
入学日が「1998-09-01」から「1999-09-01」までの学生情報を照会します
select * from stu where hire_date BETWEEN '1998-09-01' と '1999-09-01';
-
18 歳以上の学生の情報を照会する
select * from stu where age = 18;
-
年齢が 18 歳未満の学生の情報を照会する
select * from stu where age != 18; select * from stu where age <> 18;
-
年齢が 18 歳以上、または年齢が 20 歳以上、または年齢が 22 歳以上の学生の情報を照会します。
select * from stu where age = 18 or age = 20 or age = 22; select * from stu where age in (18,20,22);
-
英語スコアがnullの生徒情報を問い合わせる
= または != を使用して Null 値を比較することはできません。使用する必要があるかどうか
select * from stu where english = null; -- このステートメントは受け入れられません select * from stu where english is null; select * from stu where english is not null;
8.2.3 ファジークエリの実践
ファジー クエリでは like キーワードが使用され、プレースホルダーにはワイルドカードを使用できます。
(1) _ : 任意の単一文字を表します
(2)% : 任意の数の文字を表します
-
姓「Ma」の学生情報を照会します。
select * from stu where name like '马%';
-
2文字目が「花」の生徒の情報を問い合わせる
select * from stu where name like '_花%';
-
名前に「德」が含まれる生徒に関する情報を照会します
select * from stu where name like '%德%';
8.3 クエリの並べ替え
8.3.1 構文
SELECT フィールド一覧 FROM テーブル名 ORDER BY ソートフィールド名 1 [ソートモード 1]、ソートフィールド名 2 [ソートモード 2] ...;
上記のステートメントには、次の 2 つの並べ替え方法があります。
-
ASC : 昇順に並べ替えます(デフォルト)
-
DESC : 降順に並べ替えます
注: ソート条件が複数ある場合、現在の側の条件値が同じ場合のみ 2 番目の条件に従ってソートされます
8.3.2 演習
-
年齢によって昇順に並べ替えられた学生情報を照会します
年齢別に * stu の順序から選択します。
-
数学のスコアの降順に並べ替えられた生徒の情報を照会します。
select * from stu order by math desc ;
-
生徒の情報を照会し、数学の得点の降順に並べ替え、数学の得点が同じ場合は英語の得点の昇順に並べ替えます
select * from stu order by math desc , english asc ;
8.4 集計関数
8.4.1 概念
==垂直方向の計算のために、データの列全体を取得します。==
どのように理解すればよいでしょうか?次の表を仮定すると、
既存の要件があります。テーブル内のすべてのデータの数学スコアの合計を求めてみましょう。これは数学分野の垂直方向の合計です。
8.4.2 集合関数の分類
関数名 | 関数 |
---|---|
count(列名) | 統計量 (通常は NULL ではない列を選択します) |
max(列名) | 最大値 |
min(列名) | 最小値 |
sum(列名) | 合計する |
avg(列名) | 平均値 |
8.4.3 集計関数の構文
SELECT 集計関数名 (列名) FROM テーブル;
注: null 値は、すべての集計関数の操作に参加するわけではありません。
8.4.4 演習
-
クラスに何人の生徒がいるかを数えます
stu から count(id) を選択します。 stu から count(english) を選択します。
上記のステートメントは、特定のフィールドに従ってカウントします。このフィールドの行の値が null の場合、その行はカウントされません。したがって、count(*)で実装できます。* すべてのフィールド データを示します。行内のすべてのデータが null になることは不可能なので、count(*) を使用することをお勧めします。
stu から count(*) を選択します。
-
数学スコアの最高スコアを問い合わせる
stu から max(math) を選択します。
-
数学スコアの最小スコアを問い合わせる
stu から min(math) を選択します。
-
数学のスコアの合計スコアを問い合わせる
stu から sum(math) を選択します。
-
数学の得点の平均点を問い合わせる
stu から avg(math) を選択します。
-
英語スコアの最低スコアを問い合わせる
stu から min(english) を選択します。
8.5 グループクエリ
8.5.1 構文
SELECT フィールドリスト FROM テーブル名 [グループ化前の WHERE 条件制限] GROUP BY グループフィールド名 [グループ化後の HAVING 条件フィルタ];
注: グループ化後、クエリ対象となるフィールドは集計関数とグループ化フィールドであり、他のフィールドをクエリしても意味がありません。
8.5.2 演習
-
男子生徒と女子生徒の数学の平均点を照会します。
性別ごとに stu グループから性別、平均 (数学) を選択します。
注: グループ化後、クエリ対象となるフィールドは集計関数とグループ化フィールドであり、他のフィールドをクエリしても意味がありません。
select name, sex, avg(math) from stu group by sex; -- ここで名前フィールドをクエリしても意味がありません
-
男子生徒と女子生徒の数学の平均点とそれぞれの数値をクエリします。
性別ごとに stu グループから性別、avg(数学)、カウント(*) を選択します。
-
男子生徒と女子生徒の数学の平均点とそれぞれの数値をクエリします。条件: スコアが 70 未満の生徒はグループに参加しません。
select sex, avg(math),count(*) from stu where math > 70 性別ごとにグループ化します。
-
男子学生と女子学生の数学の平均点とそれぞれの数値をクエリします。要件: スコアが 70 未満の生徒はグループに参加せず、グループ化後の数値が 2 より大きい生徒はグループに参加しません。
select sex, avg(math),count(*) from stu where math > 70 count(*) > 2 を持つ性別でグループ化します。
where と have の違いは次のとおりです。
-
where はグループ化する前に制限し、where の条件が満たされない場合はグループ化に参加しません。have はグループ化した後に結果をフィルタリングします。
-
集計関数は判定できないが、集計関数がある場合は判定できるなど、判定できる条件が異なります。
8.6 ページネーションクエリ
下の図に示すように、京東、百度、淘宝などの多くの Web サイトで同様の効果が見られます。ページング クエリは、データをページごとにユーザーに表示するもので、ユーザーはクリックして次のページのデータを表示することもできます。
次に、ページネーション クエリの構文について説明します。
8.6.1 構文
SELECT フィールド リスト FROM テーブル名 LIMIT 開始インデックス、クエリ エントリの数。
注: 上記のステートメントの開始インデックスは 0 から始まります。
8.6.2 演習
-
0からクエリを開始し、3つのデータをクエリします
select * from stu 制限 0 、 3;
-
1 ページに 3 つのデータを表示し、最初のページのデータをクエリします
select * from stu 制限 0 、 3;
-
1 ページに 3 つのデータを表示し、2 ページ目のデータをクエリします
select * from stu limit 3 , 3;
-
1 ページに 3 つのデータを表示し、3 ページ目のデータをクエリします
select * from stu limit 6 , 3;
開始インデックスの計算式は、上記の演習から導出されます。
開始インデックス = (現在のページ番号 - 1) * 各ページに表示されるアイテムの数