ホームページ  >  記事  >  データベース  >  詳しい理解 ---MySQL マルチテーブル クエリ

詳しい理解 ---MySQL マルチテーブル クエリ

花姐姐
花姐姐転載
2020-05-06 10:59:222706ブラウズ

詳しい理解 ---MySQL マルチテーブル クエリ

#1. 複数テーブルのクエリには SELECT 句を使用します

SELECT フィールド名 FROM テーブル 1、テーブル 2 ... WHERE テーブル 1. フィールド = テーブル 2. フィールド AND その他のクエリ条件

SELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a.id=b.id

注: 上記のコードでは、条件は 2 つの ID フィールド情報が一致していることです。テーブルが同じである 2 つのテーブル間の関連付けを確立しますが、これは実際の開発では使用しないでください。


2. テーブル エイリアスを使用するために、主キー制約と外部キー制約を使用するのが最善です。複数テーブルのクエリの場合例:

SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065  a,tb_demo065_tel  b WHERE a.id=b.id AND b.id='$_POST[textid]'

SQL 言語では、テーブルの別名を 2 つの方法で指定できます。

1 つ目は、キーワード AS を使用して指定することです。

SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065 AS a,tb_demo065_tel AS b WHERE a.id=b.id

2 つ目 1 つ目の方法は、テーブル名の直後にテーブルのエイリアスを追加することです。テーブルの別名の使用

(1)別名は通常、短縮されたテーブル名で、接続内のテーブル内の特定の列を参照するときに、接続内の複数のテーブルに同じ名前の列が存在する場合に使用されます。 name はテーブル名またはテーブルの別名で修飾する必要があります
(2) テーブルの別名が定義されている場合は、テーブル名を使用できません



3. 複数の結果セットをマージします

SQL 言語では、複数の SELECT ステートメントのクエリ結果を UNION または ALL で結合して出力できます。この 2 つのキーワードの使用手順は次のとおりです。

UNION: このキーワードを使用してクエリを結合します。 ALL: 複数の SELECT ステートメントの結果を結合するには、このキーワードを使用します。クエリ結果はマージされて出力されますが、重複行は削除されません。 UNION またはALL キーワードを使用して複数のテーブルをマージして出力するには、クエリ結果が同じ構造を持ち、データ型に互換性がなければなりません。また、UNION を使用する場合は、2 つのテーブルのフィールド数も同じでなければなりません。そうでない場合は、エラーが発生します。 SQL ステートメントでプロンプトが表示されます。

SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065  a,tb_demo065_tel  b WHERE a.id=b.id


4. 単純なネストされたクエリ

サブクエリ: サブクエリは、単一の値を返す SELECT クエリであり、SELECT、INSERT、UPDATE、および DELETE ステートメントにネストされています。

e.x:SELECT id,name,pwd FROM tb_demo067 UNION SELECT  uid,price,date FROM tb_demo067_tel
内部結合: クエリ結果を WHERE 句のクエリ条件として使用することは、内部結合と呼ばれます

5. 複雑なネストされたクエリ

複数のテーブル間のネストされたクエリは、述語 IN を通じて実装できます。構文形式は次のとおりです:

test_expression[NOT] IN{ subquery
}
パラメータの説明: test_expression は SQL 式を指し、subquery には特定の結果セットのサブクエリが含まれます<br>マルチテーブルのネストされたクエリの原則: テーブルの数に関係なくネストを使用する場合、テーブル間には何らかの関連付けが必要です。この関連付けは、クエリを実装するための WHERE 句を通じて確立されます。<br>
6. クエリ統計におけるネストされたクエリの適用

複数テーブルのクエリを実装する場合、述語 ANY、SOME、および ALL を同時に使用できます。これらの述語は定量的比較述語と呼ばれ、比較演算子と組み合わせて使用​​して、すべての戻り値が検索を満たすかどうかを判断できます。条件。SOME 述語と ANY 述語は存在量です。検索条件を満たす戻り値があるかどうかのみに焦点を当てます。2 つの述語は同じ意味を持ち、同じ意味で使用できます。ALL 述語はユニバーサル述語と呼ばれます。検索要件を満たす述語があるかどうかのみを考慮します。

SELECT id,name,sex,date FROM tb_demo068 WHERE id in(SELECT id FROM tb_demo068 WHERE id=&#39;$_POST[test]&#39;)

>ANY はサブクエリ内の特定の値より大きいです
>=ANY は大きいですサブクエリの特定の値以上

48fb186c97d4acff48ef922e15cab975ANY はサブクエリ内の値と等しくない
>ALL はサブクエリ内のすべての値より大きい
>= ALL はサブクエリ内のすべての値以上である
7f25eedce6e54878d144d73cd714525cALL はサブクエリ内のすべての値と等しくない




7. サブクエリを派生テーブルとして使用する実際のプロジェクト開発プロセスでは、よく使用されます1 つの情報からより完全な情報を取得する 少数のキー フィールドのみを含む情報テーブルがテーブルから導出されます。この目標は、

SELECT * FROM tb_demo069_people WHERE uid IN(SELECT deptID FROM tb_demo069_dept WHERE deptName=&#39;$_POST[select]&#39;)
SELECT a.id,a.name FROM tb_demo067 AS a WHERE id<3)
などのサブクエリを通じて達成できます。 注: サブクエリは次のルールに従う必要があります。 :
(1) 比較演算子によって導入された内部サブクエリには、式または列名が 1 つだけ含まれます。外部ステートメントの WHERE 句で指定された列は、内部サブクエリで指定された列と互換性がある必要があります
(2 ) 不変の比較演算子 (キーワード ANY または ALL が後に続かない比較演算子) によって導入されたサブクエリには、グループまたは個々の値が事前に定義されていない限り、GROUP BY または HAVING 句は含まれません

(3) SELECT リストEXISTS で導入されるクエリは一般に * で構成され、カラム名を指定する必要はありません

(4) サブクエリは内部で結果を処理できません



8. サブクエリを式として使用します

SELECT people.name,people.chinese,people.math,people.english FROM (SELECT name,chinese,math,english FROM tb_demo071) AS people
注: サブクエリを使用する場合は、リスト項目にエイリアスを付けることが最善です。これにより、ユーザーが mysql_fetch_array() を使用するときにテーブル項目に値を割り当てることが容易になります。
SELECT (SELECT AVG(chinese)FROM tb_demo071),(SELECT AVG(english)FROM tb_demo071),(SELECT AVG(math)FROM tb_demo071) FROM tb_demo071

9 のような関数。

SELECT (SELECT AVG(chinese) FROM tb_demo071) AS yuwen ,(SELECT AVG(english) FROM tb_demo071) AS yingyu,(SELECT AVG(math) FROM tb_demo071) AS shuxue FROM tb_demo071

9. サブクエリを使用してデータを関連付ける

#
SELECT * FROM tb_demo072_student WHERE id=(SELECT id FROM tb_demo072_class WHERE className = &#39;$_POST[text]&#39;)

10. 複数テーブルの結合クエリ
SQL ステートメントで UNION を使用すると、異なるテーブルの修飾されたデータ情報を同じ列に表示できます。

e.x:SELECT * FROM tb_demo074_student UNION SELECT * FROM tb_demo074_fasten

注:使用UNION时应注意以下两点:
(1)在使用UNION运算符组合的语句中,所有选择列表的表达式数目必须相同,如列名、算术表达式及聚合函数等
(2)在每个查询表中,对应列的数据结构必须一样。

十一、对联合后的结果进行排序
为了UNION的运算兼容,要求所有SELECT语句都不能有ORDER BY语句,但有一种情况例外,那就是在最后一个SELECT语句中放置ORDER BY 子句实现结果的最终排序输出。

e.x:SELECT * FROM tb_demo074_student UNION SELECT * FROM tb_demo074_fasten ORDER BY id

使用UNION条件上相对比较苛刻,所以使用此语句时一定要注意两个表项数目和字段类型是否相同

十二、条件联合语句

SELECT * FROM tb_demo076_BEIJING GROUP BY name HAVING name=&#39;人民邮电出版社&#39; OR name=&#39;机械工业出版社&#39; UNION SELECT * FROM tb_demo076_BEIJING GROUP BY name HAVING name <>&#39;人民邮电出版社&#39; AND name <>&#39;机械工业再版社&#39; ORDER BY id

上面语句应用了GROUP BY分组语句和HAVING语句实现条件联合查询。其实现目的是先保证将'人民邮电出版社'和'机械工业出版社'始终位于名单最前列,然后再输出其它的出版社

十三、简单内连接查询

SELECT filedlist FROM table1 [INNER] JOIN table2 ON table1.column1 = table2.column1

其中,filedlist是要显示的字段,INNER表示表之间的连接方式为内连接,table1.column1=table2.column1用于指明两表间的连接条件,如:

SELECT a.name,a.address,a.date,b.chinese,b.math,b.english FROM tb_demo065 AS a INNER JOIN tb_demo065_tel AS b on a.id=b.id

十四、复杂内连接查询
复杂的内连接查询是在基本的内连接查询的基础上再附加一些查询条件,如:

SELECT a.name,a.address,a.date,b.chinese,b.math,b.english FROM tb_demo065 AS a INNER JOIN tb_demo065_tel AS b on a.id=b.id WHERE b.id=(SELECT id FROM  tb_demo065 WHERE tb_demo065.name=&#39;$_POST[text]&#39;)

总之,实现表与表之间的关联的本质是两表之间存在共同的数据项或者相同的数据项,通过WHERE 子句或内连接INNER JOIN … ON 语句将两表连接起来,实现查询

十五、使用外连接实现多表联合查询
(1)LEFT OUTER JOIN表示表之间通过左连接方式相互连接,也可简写成LEFT JOIN,它是以左侧的表为基准故称左连接,左侧表中所有信息将被全部输出,而右侧表信息则只会输出符合条件的信息,对不符合条件的信息则返回NULL

e.x:SELECT a.name,a.address,b.math,b.english FROM tb_demo065 AS A LEFT OUTER JOIN tb_demo065_tel AS b ON a.id=b.id

(2)RIGHT OUTER JOIN表示表之间通过右连接方式相互连接,也可简写成RIGHT JOIN,它是以右侧的表为基准故称右连接,右侧表中所有信息将被全部输出,而左侧表信息则只会输出符合条件的信息,对不符合条件的信息则返回NULL

E.X:SELECT a.name,a.address,b.math,b.english FROM tb_demo065 AS A RIGHT OUTER JOIN tb_demo065_tel AS b ON a.id=b.id

十六、利用IN或NOTIN关键字限定范围

e.x:SELECT * FROM tb_demo083 WHERE code IN(SELECT code FROM tb_demo083 WHERE code BETWEEN &#39;$_POST[text1]&#39; AND &#39;$_POST[text2]&#39;)

利用IN可指定在范围内查询,若要求在某范围外查询可以用NOT IN代替它

十七、由IN引入的关联子查询

e.x:SELECT * FROM tb_demo083 WHERE code IN(SELECT code FROM tb_demo083 WHERE code = &#39;$_POST[text]&#39;)

十八、利用HAVING语句过滤分组数据
HAVING子句用于指定组或聚合的搜索条件,HAVING通常与GROUP BY 语句一起使用,如果SQL语句中不含GROUP BY子句,则HAVING的行为与WHERE子句一样.

e.x:SELECT name,math FROM tb_demo083 GROUP BY id HAVING math > &#39;95&#39;

推荐学习:mysql教程

以上が詳しい理解 ---MySQL マルチテーブル クエリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsina.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。