MySQLのjoin-はは(上)クエリに参加します

理解

マルチテーブル、クエリに参加し、私はより多くの何にまとめたデータベースの役割、と思います。それは最高のそれの価値と柔軟性を反映したローカル・リレーショナル・データベースであるべきと感じストレージとクエリを

一言で言えば、データベース、ストレージ上のデータを格納および照会するための柔軟性だけでなく、文書が保存されている方法であり、(ビューのLinuxの点、すべてがファイルである)、ファイルは、データキャリアに格納され、データベースファイルは、他のデータファイルの差でありますそれは定期的に。制約や規範があり、いじりの多くの場所としての仕事とは異なり、それがあるからである事前の合意は、データベースは、データが非常に高速に取得します。

もちろん、ストレージは、私は通常、一般的にされ、同社の言葉に、独自のスタンドアローン預金に言葉を使うストレージを分散し、データが実際には、各マシン、どのようなマスター・スレーブ構成などに分散している。私は通常で学びますストレージはあまり注目を落ちたため、当然のことながら、マスター・スレーブ構成の下で練習します。

もちろん、今は本当にデータベースクエリとの時間を費やすしていないために私たちの部署アップのほとんどは、すべてのシステム間の本はいくつかの小さな問題を抱えている、毎日の仕事は、様々なシステムからのクエリセットをエクスポートすることで、ExcelはVLOOKUPを行った後に手動で実行純粋なマニュアルを数は、出発のための主な理由になるだろう。結局、VLOOKUPの+を効率にSUMIFS / contifs / pivote表は、選択SQL、参加、の集合よりもはるかに少ないですが、行われる作業の両方が同じであるが、効率違い。

表は、一般的にも(外側の)コネクタ、通常使用権(外側の)コネクタ、コネクタ、デカルト積、等左使用実際左接続をVLOOKUPを。テーブルとテーブルの間に接続することができ、接続のための基礎が存在しなければなりません、それは共通であるフィールド(キー)、または他の接続ではなく、直接にスプライス。

  • 内部ジョイン2つのテーブル、「共通接地」左テーブルと右テーブルを介して、その共通の結合モードを結ぶ、総記録を
  • 左の参加:VLOOKUP、レコードはすべて左の表は、左表の右のテーブルに一致するがNullとして示されているが存在しない「一致」、上のレコードのみ右の表が表示さを示しています
  • 右の加入:左と同じ、ちょうど右の視点で

私は今年の事業、接続VLOOKUP残され、内部結合の基本的な必要性、なぜ、ビジネスの要件は、番号の左に、基本的なテーブルを行う、または(右)他のテーブルからのデータと一致し続けることである、鉛プログラムの手続きに難しい。ここではまだ学生、クラステーブルプレゼンテーションの前にあります。

単純な結合問合せ(内部、左、右)

-- 登录mysql客户端, 查看下使用的数据集
mysql> use student_db;
Database changed
mysql> show tables;
+----------------------+
| Tables_in_student_db |
+----------------------+
| classes              |
| clock_in             |
| students             |
+----------------------+
3 rows in set (0.04 sec)

mysql> select * from classes;
+----+------+
| id | name |
+----+------+
|  1 | 科学 |
|  2 | 艺术 |
+----+------+
2 rows in set (0.09 sec)

mysql> select * from students;
+----+----------+-----+--------+--------+----------+-----------+
| id | name     | age | height | gender | class_id | is_delete |
+----+----------+-----+--------+--------+----------+-----------+
|  1 | 爱因斯坦 |  18 | 180.00 | 男     |        1 | 0         |
|  2 | 居里夫人 |  18 | 180.00 | 女     |        2 | 1         |
|  3 | 小王子   |  14 | 185.00 | 男     |        1 | 0         |
|  4 | 李银河   |  59 | 175.00 | 男     |        2 | 1         |
|  5 | 黄蓉     |  38 | 160.00 | 女     |        1 | 0         |
|  6 | 冰心     |  28 | 150.00 | 女     |        2 | 1         |
|  7 | 王祖贤   |  18 | 172.00 | 女     |        1 | 1         |
|  8 | 周杰伦   |  36 | NULL   | 男     |        1 | 0         |
|  9 | 王小波   |  57 | 181.00 | 男     |        2 | 0         |
| 10 | 林徽因   |  25 | 166.00 | 女     |        2 | 0         |
| 11 | 小星     |  33 | 162.00 | 未填写 |        3 | 1         |
| 12 | 张爱玲   |  12 | 180.00 | 女     |        4 | 0         |
| 13 | 冯唐     |  12 | 170.00 | 男     |        4 | 0         |
| 14 | 胡适     |  34 | 176.00 | 男     |        5 | 0         |
+----+----------+-----+--------+--------+----------+-----------+
14 rows in set (0.25 sec)

何の試験データが存在しない場合はその)(、)(データベース/テーブルを作成し、テーブルを作成...、次にtb_name値に挿入され、...うん。

関連根拠:IDの学生やクラスはCLASS_IDテーブルテーブルが同じことを示します(クラスID)

補足SQLのスキルを書く(約コンピュータシミュレーションの実行されているため)

  • Bのようにtb_name1、tb_name2から書き込む(別名)
  • そして、接続条件は、(別名を過ごす)....に参加します
  • そして、どこ書き......
  • 最後に、選択書き込み....

ブロックに終わった書き込み、照会を選択し、(、組合に加入...)スプライス、瞬間は私の心のテーブルのイメージがあります

-- 检索出学生和班级能对应上的信息
select s.*, c.*
from students s, classes c  -- as可省略
where s.class_id = c.id;

-- 这种默认的where等值连接, 其实就跟 inner join 是一样的
-- out
+----+----------+-----+--------+--------+----------+-----------+----+------+
| id | name     | age | height | gender | class_id | is_delete | id | name |
+----+----------+-----+--------+--------+----------+-----------+----+------+
|  1 | 爱因斯坦 |  18 | 180.00 | 男     |        1 | 0         |  1 | 科学 |
|  2 | 居里夫人 |  18 | 180.00 | 女     |        2 | 1         |  2 | 艺术 |
|  3 | 小王子   |  14 | 185.00 | 男     |        1 | 0         |  1 | 科学 |
|  4 | 李银河   |  59 | 175.00 | 男     |        2 | 1         |  2 | 艺术 |
|  5 | 黄蓉     |  38 | 160.00 | 女     |        1 | 0         |  1 | 科学 |
|  6 | 冰心     |  28 | 150.00 | 女     |        2 | 1         |  2 | 艺术 |
|  7 | 王祖贤   |  18 | 172.00 | 女     |        1 | 1         |  1 | 科学 |
|  8 | 周杰伦   |  36 | NULL   | 男     |        1 | 0         |  1 | 科学 |
|  9 | 王小波   |  57 | 181.00 | 男     |        2 | 0         |  2 | 艺术 |
| 10 | 林徽因   |  25 | 166.00 | 女     |        2 | 0         |  2 | 艺术 |
+----+----------+-----+--------+--------+----------+-----------+----+------+

-- inner join on 
select s.*, c.*
from students s
inner join classes c
on s.class_id = c.id;

-- out
+----+----------+-----+--------+--------+----------+-----------+----+------+
| id | name     | age | height | gender | class_id | is_delete | id | name |
+----+----------+-----+--------+--------+----------+-----------+----+------+
|  1 | 爱因斯坦 |  18 | 180.00 | 男     |        1 | 0         |  1 | 科学 |
|  2 | 居里夫人 |  18 | 180.00 | 女     |        2 | 1         |  2 | 艺术 |
|  3 | 小王子   |  14 | 185.00 | 男     |        1 | 0         |  1 | 科学 |
|  4 | 李银河   |  59 | 175.00 | 男     |        2 | 1         |  2 | 艺术 |
|  5 | 黄蓉     |  38 | 160.00 | 女     |        1 | 0         |  1 | 科学 |
|  6 | 冰心     |  28 | 150.00 | 女     |        2 | 1         |  2 | 艺术 |
|  7 | 王祖贤   |  18 | 172.00 | 女     |        1 | 1         |  1 | 科学 |
|  8 | 周杰伦   |  36 | NULL   | 男     |        1 | 0         |  1 | 科学 |
|  9 | 王小波   |  57 | 181.00 | 男     |        2 | 0         |  2 | 艺术 |
| 10 | 林徽因   |  25 | 166.00 | 女     |        2 | 0         |  2 | 艺术 |
+----+----------+-----+--------+--------+----------+-----------+----+------+

テーブルに、フィールドとしてエイリアス

-- 查询前3个艺术班女生的姓名和班级
select s.name as "姓名", c.name as "班级"
from students s
inner join classes c
on s.class_id = c.id
where (s.gender = "女") and (c.name = "艺术")
limit 3;

-- out
+----------+------+
| 姓名     | 班级 |
+----------+------+
| 居里夫人 | 艺术 |
| 冰心     | 艺术 |
| 林徽因   | 艺术 |
+----------+------+
3 rows in set (0.15 sec)

見つけるのは難しいことではない、実際には、SQLは、限り、あなたのロジックが明確であるように、少しずつチェックし、非常に簡単です。実際には、それは二つの形式、マルチテーブルの結合+ + ...かと以外の何ものでもありません、サブクエリ、その後には、連合の、ルーチンは同じです。

-- 查询能对应上班级的学生和班级信息, 并按照班级名称降序
select * 
from students s, classes c
where s.class_id = c.id
order by c.name desc
limit 3;

-- out
+----+--------+-----+--------+--------+----------+-----------+----+------+
| id | name   | age | height | gender | class_id | is_delete | id | name |
+----+--------+-----+--------+--------+----------+-----------+----+------+
|  4 | 李银河 |  59 | 175.00 | 男     |        2 | 1         |  2 | 艺术 |
|  6 | 冰心   |  28 | 150.00 | 女     |        2 | 1         |  2 | 艺术 |
| 10 | 林徽因 |  25 | 166.00 | 女     |        2 | 0         |  2 | 艺术 |
+----+--------+-----+--------+--------+----------+-----------+----+------+
3 rows in set (0.07 sec)

-- 先按班级名降序, 如果班级名相同, 则按身高降序, 再则按学生id升序
select s.name, s.height, c.name
from students s, classes c
where s.class_id = c.id
order by c.name desc, s.height desc, s.id asc
limit 6;

-- out
+----------+--------+------+
| name     | height | name |
+----------+--------+------+
| 王小波   | 181.00 | 艺术 |
| 居里夫人 | 180.00 | 艺术 |
| 李银河   | 175.00 | 艺术 |
| 林徽因   | 166.00 | 艺术 |
| 冰心     | 150.00 | 艺术 |
| 小王子   | 185.00 | 科学 |
+----------+--------+------+
6 rows in set (0.09 sec)

ヌルが一致しなかったと私は同じのVLOOKUP Excelの機能で、仕事で一日に参加左、左の表を表示に基づいて照合されています

-- 从classes表中, 匹配出student的姓名和班级
select s.name as "姓名", c.name as "班级"
from students s 
left join classes c
on s.class_id = c.id;

-- out
+----------+------+
| 姓名     | 班级 |
+----------+------+
| 爱因斯坦 | 科学 |
| 小王子   | 科学 |
| 黄蓉     | 科学 |
| 王祖贤   | 科学 |
| 周杰伦   | 科学 |
| 居里夫人 | 艺术 |
| 李银河   | 艺术 |
| 冰心     | 艺术 |
| 王小波   | 艺术 |
| 林徽因   | 艺术 |
| 小星     | NULL |
| 张爱玲   | NULL |
| 冯唐     | NULL |
| 胡适     | NULL |
+----------+------+
14 rows in set (0.18 sec)

-- 查询出没有对应班级的学生姓名
select s.name, c.name
from students s
left join classes c
on s.class_id = c.id
having c.name is null;

+--------+------+
| name   | name |
+--------+------+
| 小星   | NULL |
| 张爱玲 | NULL |
| 冯唐   | NULL |
| 胡适   | NULL |
+--------+------+
4 rows in set (0.05 sec)

-- 过滤条件用where也是可以的
select s.name, c.name 
from students s 
left join classes c 
on s.class_id = c.id
where c.name is null;

どこで差​​を有します

  • データパケットの前に濾過される場合、集約関数は、ここでの背後に使用することができません
  • hvaingはされグループ化された関数は、重合が続くことができる有する、フィルタにデータを
  • クエリ実行順序:> WHERE>グループからとアグリゲーション機能により、>>順序を持つ>を選択

  • 有する場合、すなわち、として>集計関数によってグループを構成するためにここでは不十分

サブクエリ

サブクエリいわゆるがすることができませんネストされたSELECTうんを、限り、これは少しずつプログラミングパートナーがプログラミングされていなくても、すぐに取得することができます学んがあるとして、私は私の同僚を見てExcelをネスト策定、また、SUMIFSの外側の層は非常に強力ですVLOOKUPの内側に....とにかく原則は同じです。

  • スカラーのクエリ:クエリ結果の値
  • 列子クエリ:結果が返される列です
  • 行サブクエリ:結果は戻りラインであります
-- 标量: 查询出高于平均身高的学生姓名, 身高, 所在班级

-- step 1: 先查出身高均值(标量)
select avg(height) from students;
+-------------+
| avg(height) |
+-------------+
| 172.076923  |
+-------------+
1 row in set (0.07 sec)

-- step2: 嵌套进来呀
select s.name, s.height, c.name
from students s
left join classes c
on class_id = c.id
where s.height > (select avg(height) from students);

+----------+--------+------+
| name     | height | name |
+----------+--------+------+
| 爱因斯坦 | 180.00 | 科学 |
| 小王子   | 185.00 | 科学 |
| 居里夫人 | 180.00 | 艺术 |
| 李银河   | 175.00 | 艺术 |
| 王小波   | 181.00 | 艺术 |
| 张爱玲   | 180.00 | NULL |
| 胡适     | 176.00 | NULL |
+----------+--------+------+
7 rows in set (0.11 sec)

列子問い合わせ:つまりマチャド、キーワード:

-- 查询出, 根据班级id, 所对应的学生名字

-- 分析,一个班级ID -> 多个名字, 是一查多(列子查询)
select s.name
from students s
where s.class_id in (select id from classes)

-- out
| name    |
+----------+
| 爱因斯坦 |
| 居里夫人 |
| 小王子   |
| 李银河   |
| 黄蓉     |
| 冰心     |
| 王祖贤   |
| 周杰伦   |
| 王小波   |
| 林徽因   |
+----------+

サブクエリの行(合成素子の複数のフィールドを行)

-- 查询出 年龄最大, 且身高最高的的学生信息
select * 
from students s
where (s.age, s.height) = (select max(age), max(height) from students);

-- out: 可能不存在这样牛逼的记录
Empty set

概要

  • するために、2つのコアデータベース機能データを格納および取得

  • クエリの効率的なデータファイルを整理、ので、ストレージタイプがある定期的な大会
  • 実行順序は、>順序を有する>>> GROUP BYおよび凝集関数から>選択します

  • インナーに接続された共通のテーブルの参加は、右の参加、参加左 ... 私は通常の最も使用ExcelのVLOOKUPの理由のため、左結合を
  • サブクエリが実際にSQLをネストされ、それによって返される結果に基づいて、スカラー、列、行

話は自己結合、高度なマルチテーブル共同問い合わせ、テーブルに接続されているサブクエリ、ユニオンこれらを取った....

おすすめ

転載: www.cnblogs.com/chenjieyouge/p/11789332.html