MYSQL の基本操作 - select クエリ ステートメント [続き]


序文

内容:MYSQL基本操作-select 查询语句【续】

集計関数

最大値 (最大)

select max(bookprice) as '最贵的书' from book;

最小値 (最小)

select min(borrowsum) as '最受嫌弃的书...' from book;

数量 (カウント)

select count(bookid) from book;

select sum(borrowsum) from book;

平均値 (平均)

select avg(bookprice) from book;

グループ クエリ

  • キーワードでグループ化すると、1 つ以上のフィールドに従ってクエリ結果をグループ化できます
  • group by は通常、Mysql 集計関数と組み合わせて使用​​されます
  • グループ化された結果セットをフィルタリングする条件を指定する必要がある場合は、having キーワードを組み合わせる必要があります。理由: where は集計関数と組み合わせて使用​​できず、where は group by の前に実行されます。
 GROUP BY  <字段名>[,<字段名>,<字段名>]

単純なグループ化

select borrowsum, count(bookid) from book group by borrowsum;

where をサポートするすべての演算子と構文を使用して、
グループ別にグループ化されたデータをフィルター処理するためのキーワードを持つグループ化結果をフィルター処理します。

select borrowsum, count(bookid) from book group by borrowsum having count(bookid) = 1;

グループソート

select borrowsum, count(bookid) from book group by borrowsum order by count(bookid) desc;

統計関数群クエリ

select 
	borrowsum,group_concat(bookname) 
from book 
group by borrowsum 
order by borrowsum desc;

– group_concat は、group by によって生成された同じグループ内の値を結合して文字列の結果を返し、グループ化後に各グループ内の値を表示します. 複数グループの
クエリ、テーブル
作成ステートメント、およびデータの挿入

-- ----------------------------
-- Table structure for choose_course
-- ----------------------------
DROP TABLE IF EXISTS `choose_course`;
CREATE TABLE `choose_course` (
  `course_name` char(10) DEFAULT NULL,
  `semester_number` int(11) DEFAULT NULL,
  `student_name` char(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of choose_course

INSERT INTO `choose_course` VALUES ('语文', '1', '李雷');
INSERT INTO `choose_course` VALUES ('语文', '1', '韩梅梅');
INSERT INTO `choose_course` VALUES ('语文', '1', '露西');
INSERT INTO `choose_course` VALUES ('语文', '2', '莉莉');
INSERT INTO `choose_course` VALUES ('语文', '2', '格林');
INSERT INTO `choose_course` VALUES ('数学', '1', '李雷');
INSERT INTO `choose_course` VALUES ('数学', '1', '名字真难起...');
SELECT
	course_name,
	semester_number,
	count('hello')
FROM
	choose_course
GROUP BY
	course_name,
	semester_number;
  • 複数のフィールドをグループ化してクエリを実行する場合は、まず最初のフィールドでグループ化し、最初のフィールドの値が同じ場合は、グループ化された結果を 2 番目のフィールドでグループ化し、以下同様です。
  • 最初のフィールドの各値が一意である場合、2 番目のフィールドによってグループ化されません

group by 句は、where 条件ステートメントと組み合わせて使用​​することもできます。組み合わせると、where が最初で group by が続きます。つまり、まず select xx from xx のレコードセットを where でフィルタリングし、次に group by でフィルタリングした結果をグループ化し、having 句でグループ化した結果をフィルタリングするという使い方の違いに注意が必要です。持つとどこに

  • having は、group by の後でのみ、グループ化された結果をフィルター処理するために使用できます (つまり、having を使用するための前提条件はグループ化です)。

  • group by の前にある必要がある場所

  • where の後の条件式では集計関数は使用できませんが、having は使用できます。
    where、group by、having、order by が同時にクエリ文に現れる場合、実行順序と書き込み順序は次のようになります。

  • where xx を実行して、テーブル全体のデータをフィルタリングし、最初の結果セットを返します。

  • 最初の結果セットに group by grouping を使用し、2 番目の結果セットを返します。

  • 2 番目の結果セットのデータ セットごとに select xx を実行し、セットの数だけ複数回実行して、3 番目の結果セットを返します。

  • 3 番目のセットに xx を指定して実行し、フィルタリングして 4 番目の結果セットを返します。

  • 4 番目の結果セットを並べ替えます。
    マルチテーブルクエリ
    マルチテーブルクエリの違い

  • 交差結合: 交差接続

  • 内部結合: 内部接続

  • 左結合: 左外側接続

  • 右結合: 右外部結合

  • ユニオン、ユニオンオール:フルコネクション

ここに画像の説明を挿入

内部結合

例のテーブル: 本
ここに画像の説明を挿入

テーブルの例: リーダータイプ

retypeid typename 借入数量 借入日
1 生徒 10 30
2 教師 20 60
3 管理者 15 30
4 スタッフ 15 20
from 句を使用
SELECT * FROM book, reader;
– 2 つのテーブルを 1 つの return
select book.bookid,book.bookname ,reader に結合します。 readerid,reader.readername from book,reader;
– 2 つのテーブルの指定されたフィールドを結合して返す
接続条件を指定します where
SELECT * FROM readertype, reader
WHERE reader.retypeid = readertype.retypeid;
join キーワードを使用して接続— inner join
SELECT <field name> FROM <table 1> INNER JOIN <table 2> [ON句]
– inner joinは条件式の設定にonを使用 onを付けない場合はinner joinとcross joinは同じ
– cross join ... on と内部結合 ... on は実際には同じ効果があります (ただし、標準の SQL ではクロス結合はサポートされておらず、Mysql のみがサポートしています)
– 内部結合は 2 つ以上のテーブルを接続できます
– 内部結合も接続条件を指定するためにwhereを使用できますが、内部結合... onは公式の標準的な記述方法であり、クエリのパフォーマンスに影響を与える可能性があります – 内部結合も内部を追加せずに結合のみを記述でき
ます

select * from readertype join reader on reader.retypeid = readertype.retypeid;
select * from readertype inner join reader on reader.retypeid = readertype.retypeid;

データ テーブルのエイリアスを使用する

select readertype.retypeid,readertype.borrowquantity,reader.readerstatus
from readertype join reader on reader.retypeid = readertype.retypeid;
select a.retypeid,a.borrowquantity,b.readerstatus 
from readertype as a join reader as b on b.retypeid = a.retypeid;

外部結合

テーブルの例: ユーザー

user_id user_name user_sex
1 Zhang San 1
2 Li Si 1
3 Wang Wu 1 4 Zhao Liu 1
5
Qian Qi 1
6 Sun Ba 1
7 Zhou Lao Jiu 1
8 Wu Lao Shi 1
表の例: user_detail

user_detail_id user_detail_address user_detail_phone user_detail_uid
1 河南平顶山15639279531 1
2 河南平顶山15639279532 2
3 河南平顶山15639279533 3
4 河南平顶山15639279534 4
11 河南平顶山15639279521 11
12 河南平顶山15639279522 12
13 河南平顶山15639279523 13
14 河南平顶山15639279524 14
外连接分为两种: 左結合, 右結合.
外部結合は内部結合よりも多くの内容を示します. これは内部結合の補足です.
左結合のメインテーブルは左テーブルであり, スレーブテーブルは
右テーブルです. 右結合はメイン テーブルであり、スレーブ テーブルは左側のテーブルです。
外部結合は、スレーブ テーブルに一致するデータがあるかどうかに関係なく、メイン テーブルのすべてのデータを返します。スレーブ テーブルに一致するデータがない場合は、デフォルトではNULL値(NULL)になります. 外部結合はスレーブテーブルの一致するデータのみを返します. 重要なポイント
:
外部結合を使用する場合, クエリの結果をすべてのレコードを表示するかどうか区別する必要があります.左のテーブルまたは右のテーブルのすべてのレコード

SELECT <字段名> FROM <1> LEFT OUTER JOIN <2> <ON子句>
SELECT <字段名> FROM <1> RIGHT OUTER JOIN <2> <ON子句>

アウターは省略可能、左ジョイン、右ジョインと書くだけで
左ジョインの接続条件を設定、
左ジョインのクリは省略不可

select * from user left join user_detail on user.user_id = user_detail.user_detail_uid;

左結合後の検索結果は、ユーザーのすべてのデータと、user_detail の where 条件を満たすデータを表示することになります。

右ジョインクリ

select * from user right join user_detail on user.user_id = user_detail.user_detail_uid;
右连接后的检索结果是user_detail的所有数据和user中满足where 条件的数据。

クロス コネクション クロス
ジョイン デカルト積

2 つの集合 A と B があるとします。

A = {1,2}B = {3,4}
セット A とセット B のデカルト積 = セット A * セット B; つまり、2 つのテーブルは次のように乗算されます。

AxB = {(1,3),(1,4),(2,3),(2,4)}
Mysql では、テーブル間のデカルト積は推奨されません。大量の不合理なデータが生成されます;
SELECT <フィールド名> FROM <テーブル 1> CROSS JOIN <テーブル 2>
[WHERE] SELECT <フィールド名> FROM <テーブル 1>, <テーブル 2> [WHERE 句] 次の
2 つの文は同じ効果があります。

select * from user cross join user_detail ;
select * from user,user_detail;

次の 2 つの文は同じ効果があります

select * from user cross join user_detail on user_detail.user_detail_uid = user.user_id;
select * from user,user_detail where user.user_id = user_detail.user_detail_uid;

自己結合

テーブルを 2 つの同一のテーブルと見なし、2 つのテーブル (同じ 2 つのテーブル) を結合してデカルト積を取得し、デカルト積の結果を where に従ってフィルター処理します。
自己結合は、同じテーブルの異なるインスタンスの結合操作です.
異なるインスタンスを区別するために、自己結合ではエイリアス (aliasName) を指定する必要があります.

SELECT	b2.bookname,b2.borrowsum 
FROM	book AS b2,book AS b1 
WHERE	b2.borrowsum > b1.borrowsum AND b1.bookname = '中医的故事' 
ORDER BY b2.borrowsum DESC,b2.bookname;
SELECT	b2.bookname,b2.borrowsum 
FROM book AS b2 join book AS b1 on b2.borrowsum > b1.borrowsum 	
where b1.bookname = '中医的故事' 
ORDER BY b2.borrowsum DESC,b2.bookname;

最初に 2 つの同一のテーブルをコピーし、最初のテーブルのどこをフィルター処理し
、漢方薬の物語の借用額に等しい書籍名を取得します. テーブル
1 とテーブル 2 を結合して、漢方薬の物語の借用額よりも大きい借用額を取得します。
テーブル 2 のブックネームとボローサムを結合 ボローサム情報が表示されます
. エイリアス: このクエリの 2 つのテーブルは実際には同じテーブルです. DBMS は参照しているテーブルを認識しないため、これを解決するにはエイリアスを使用する必要があります問題。

共同クエリ

実はMysqlにはフル結合がなく、Oracleにはフル結合(フル結合)しかありません
が、MySQLではユニオンキーワードで同じ効果が得られるので、ここでもユニオンを導入したいと思います。

[sql1]UNION [ALL | DISTINCT][sql2]UNION [ALL | DISTINCT][sql3]....

sql1, sql2, sql3: 通常書かれたクエリ sql, あなたは多くの sql を接続することができます
ALL: オプションのパラメータ, 重複データを含むすべての結果セットを返します. distinct:
オプションのパラメータ, 結果セット内の重複データを削除します.追加しなくても大丈夫です)

select * from user left join user_detail on user.user_id = user_detail.user_detail_uid 
union 
select * from user right join user_detail on user.user_id = user_detail.user_detail_uid;

ユニオンによって接続された複数の sql の場合、各 sql クエリからの結果セットのフィールド名は一貫している必要があります**[名前のみが同じである必要があり、順序は異なっていてもかまいませんが、推奨事項は同じです]**、あなたは次の栗の最終
結合を見ることができます 接続クエリの結果セットのフィールド順序は、最初の sql で見つかった結果セットのフィールド順序に基づきます. サブクエリ サブクエリは、クエリ メソッドで一般的に使用されます. サブクエリを介して、マルチ
-
サブクエリ
とは: 別のクエリ ステートメントにクエリ ステートメントをネストする サブクエリは、
select、update、delete ステートメント、および複数レベルのネストで使用できます
WHERE <式> <演算子> (サブクエリ)
演算子は、比較演算子 in、not in、exists、not exists
notはもちろん否定
比較演算子のサブクエリを使って、
書籍番号、書籍名、書籍単価、価格を高い順に問い合わせる

SELECT	bookid,	bookname,bookprice
FROM	book 
WHERE	bookprice > ( SELECT bookprice FROM book WHERE bookname = '机械设计手册' ) 
ORDER BY bookprice DESC;
查询类别是学生的读者信息, 包括读者编号, 读者姓名, 发证日期
SELECT	readerid,readername,readerdate 
FROM	reader 
WHERE	retypeid = ( SELECT retypeid FROM readertype WHERE typename = '学生' );

リンクされたテーブルを使用してクエリを実行することもできます...

SELECT	readerid,readername,readerdate 
FROM	reader	JOIN readertype ON readertype.retypeid = reader.retypeid 	AND typename = '学生';

実際、サブクエリの機能は、テーブル ジョイン (結合) によっても完了することができます
. 一般的に言えば、テーブル ジョイン (内部結合、外部結合など) はサブクエリでクエリできますが、その逆は必ずしもそうではありません. 一部のサブクエリテーブルの結合には使用できません
サブクエリに置き換えると、より柔軟になり、クエリのフィルタ条件として適していますテーブル接続は、接続
後のデータセットを表示するのに適しています貸した

SELECT	bookid,	bookname 
FROM	book 
WHERE	bookid IN ( SELECT bookid FROM bookstorage WHERE bookstatus = '借出' );
查询没有借出(在馆)的书籍id, 书籍名称
SELECT	booki,	bookname 
FROM	book
WHERE	bookid NOT IN ( SELECT bookid FROM bookstorage WHERE bookstatus = '借出' );
SELECT	bookid,	bookname 
FROM	book 
WHERE	bookid IN ( SELECT bookid FROM bookstorage WHERE bookstatus != '借出' );
any 子查询

最小値より大きい < 最大値より小さい = any は in() と同等です。

書籍表(書籍ID、書籍名、出版社、価格)で機械工業出版の最安価格よりも価格が高い書籍を選択

SELECT	booki,	bookname,bookpublisher,	bookprice 
FROM	book 
WHERE	bookprice > ANY ( SELECT bookprice FROM book WHERE bookpublisher = '机械工业出版社' );

すべてのサブクエリ

すべてが最大のものよりも大きい

< すべて最小より小さい

書籍表(書籍ID、書籍名、出版社、価格)で機械工業プレスの最高額よりも価格が高い書籍を選択

SELECT	bookid,	bookname,bookpublisher,	bookprice 
FROM	book 
WHERE	bookprice > all ( SELECT bookprice FROM book WHERE bookpublisher = '机械工业出版社' );
[not] exists子查询

書籍カテゴリ テーブルにない書籍のカテゴリ ID とカテゴリ名を表示する

SELECT	typeid,	typename 
FROM	booktype 
WHERE	NOT EXISTS ( SELECT * FROM book WHERE booktype.typeid = book.typeid );

書籍カテゴリ テーブルで書籍のカテゴリ ID とカテゴリ名を表示する

SELECT	typeid,	typename 
FROM	booktype 
WHERE	EXISTS ( SELECT * FROM book WHERE booktype.typeid = book.typeid );


in と exists in existsの比較では
、式がサブクエリによって返された結果セットの値と等しい場合に TRUE が返され、そうでない場合は FALSE が返されます。副問合せの集合が空ならTRUE、そうでなければFALSEを返す;
外表が大きく内表が小さい場合に適しており、内表が大きい場合に適している外側のテーブルが小さい.
どのテーブルが大きくても、not exists を使用すると、not in
1 より高速です. A は式、B はサブクエリの結果セットです 2. A が B にある場合、True
Summary
Subquery ステートメントを返しますSQL ステートメントの任意の式にネストできます

フィールド、テーブル名、およびクエリ条件はすべて、サブクエリでネストできます!

select <子查询> from <表名> where <查询条件>
select <字段> from <子查询> as <别名> where <查询条件>
select <字段> from <表名> where <子查询>

よくある間違い

select * from (select * from emp);
サブクエリにエイリアスが指定されていないため、これはエラーを報告します

正しいつづり

select * from (select * from emp) as t;

<テーブル名> がサブクエリをネストする場合、テーブルのエイリアスを指定する必要があります. 通常、複数の行と列を含む結果セットは、新しい一時テーブルとして返されます.

サブクエリのみに表示され、親クエリには表示されないテーブルは、出力列に含めることはできません


多層ネストされたサブクエリの最終的な結果セットには、親クエリ (最も外側のクエリ) の select ステートメントに表示されるフィールドのみが含まれます。通常、サブクエリの結果セットは、その外側のクエリのデータ ソースとして使用されるか、または条件判断

おすすめ

転載: blog.csdn.net/m0_51607907/article/details/127128868