マルチテーブル・クエリー、サブクエリー、集約関数

16388 ワード

一、マルチテーブルクエリー


単一のselect文を使用して、複数のテーブルから関連するクエリー結果を取り出します.マルチテーブル接続は、通常、相互関係のある親子テーブルに構築されます.
notice:次のコードは、前のブログユーザーと身分証明書の関連付け(一対一)を参照します.
1、クロスコネクション
1番目のテーブルのすべてのローに2番目のテーブルのすべてのロー、すなわちデカルト積を乗算
--  	

--  

select * from card,users;

--  

select * from card cross join users;

notice:クロスコネクションで得られた結果はエラーです
2、内部接続
クロスコネクションで得られた結果セットが間違っているためです.したがって、内部ジョインは、相互ジョインに基づいてジョインテーブルのジョイン条件に一致するデータ行のみをリストし、一致しないレコードはリストされません.
--  

--  
select * from card,users where users.id = card.user_id;

--  
select * from card as c INNER JOIN users as u ON u.id = c.user_id;

3、外部接続
(内接続はすべての対応する情報のみをリストし、ない情報はリストしません)外リンクは1枚のテーブルをベースとし、他のテーブル情報はつなぎ合わせ、ある場合はつなぎ合わせ、nullが表示されていない場合はつなぎ合わせます.外部リンクは左外部接続と右下接続に分かれています.
左外部ジョイン:キーワードの左にあるテーブルをベースにしたジョイン
--  

--  
select * from card as c LEFT JOIN users as u on c.user_id = u.id;

右外部ジョイン:キーワードの右側のテーブルをベースにしたテーブル
--  
select * from users as u right join card as c on c.user_id = u.id;

二、サブクエリ


場合によっては、クエリーを行う場合、必要な条件は別のselect文の結果であり、この場合サブクエリーが使用され、メインクエリー(外部クエリー)にデータを提供するために最初に実行されるクエリー(内部クエリー)をサブクエリーと呼ぶ.サブクエリは、ネストされたサブクエリと関連するサブクエリに分けられます.
ネストされたサブクエリー:内部クエリーの実行は外部クエリーとは独立しており、内部クエリーは一度のみ実行され、実行が完了すると結果が外部クエリーの条件として使用されます(ネストされたサブクエリー文は単独で実行できます).
関連サブクエリー:内部クエリーの実行は外部クエリーのデータに依存し、外部クエリーは実行されるたびに内部クエリーも実行されます.毎回、外部クエリーが先に実行され、外部クエリーテーブルのメタグループが取り出され、現在のメタグループのデータが内部クエリーに渡され、内部クエリーが実行されます.内部クエリーの実行結果に基づいて、現在のメタグループが外部クエリーのwhere条件を満たしているかどうかを判断し、満たされている場合は現在のメタグループが要求に合致するレコードであり、そうでない場合は要求に合致しない.その後、外部クエリーは次のメタグループデータを取り出し続け、すべてのメタグループが処理されるまで上記の操作を実行します.(notice:ネストループで九九乗算表を印刷できる思想:内部ループ条件は外部の変数を使用する必要があり、外部ループが1回行われるたびに、内部ループもそれに応じて1回実行される(内部ループの完全な実行が完了することを示す))
--  

select student_id from tch_std where teacher_id = 1;--  tch_std  id 1 id
select * from student where id in (1,2);	--  id 

--  
select * from student where id in (select student_id from tch_std where teacher_id = 1);

--  

--  

select * from tch_std as a where a.score>(select AVG(b.score) from tch_std as b WHERE a.teacher_id = b.teacher_id);

三、常用関数における集約関数


1.count():列条件を満たす合計行数を求める.
-- COUNT(DISTINCT expr,[expr...])

--  

select count(*) as count from score;

--  python 80 
select count(*) as count  from score where python >= 80;

--  240 
select count(*) as count from score where (python+mysql+web)>240;

2.sum():総和を求める.
-- SUM([DISTINCT] expr)

--  python 
select sum(python) as sum from score ;


--  
SELECT
	sum(python) AS python,
	sum(mysql) AS mysql,
	sum(web) AS web
FROM
	score;


--  python 
select sum(python)/count(python) as pythpn_avg from score;

3.avg():平均数を求める.
-- AVG([DISTINCT] expr)  


--  python 
select avg(python) as python_avg from score;

--  
select avg(python+mysql+web) as avg from score;

4.min()とmax()は最大値と最小値を求める.
-- MIN([DISTINCT] expr)
-- MAX([DISTINCT] expr)

--  web 

select min(web) as web_min from score;
select max(web) as web_max from score;

5.groupbyグループ化.GROUP BY句の真の役割は,様々な集約関数と組み合わせて使用することである.クエリーされたデータをグループ化するために使用されます.パケットの意味は、この列に同じ値を有する複数のレコードを1組のレコード処理とし、最後に1つのレコードのみを出力することである.グループ化関数は空の値を無視します.
--  

create table t_order(id int primary key,product varchar(20),price float(8,2));

insert into t_order values(1,'xiaomi', 1000);
insert into t_order values(2,'xiaomi',1100);
insert into t_order values(3,'huawei',2200);
insert into t_order values(4,'apple',8200);


-- 1. , 
SELECT product,SUM(price) FROM t_order GROUP BY product;

-- 2. 3000 
SELECT product,SUM(price) as sum FROM t_order GROUP BY product HAVING sum>2100;

--  

select id,name,python+mysql+web as total from score;

notice:(1)、パケット関数の重要なルールパケット関数を使用する場合、またはGROUP BYを使用するクエリー:SELECTリストに表示されるフィールドは、集約関数に表示されるか、GROUP BY句に表示されます.(上のproductはgroupbyに、priceは集約関数に)GROUP BY句のフィールドはSELECTリストに表示されなくてもよい.
(2)、having whereの違い①、whereとhavingはいずれも条件限定として用いられ、②、WHEREはグループ化(group by)前に条件フィルタリングを行い、③、HAVING句はグループ化(group by)後に条件フィルタリングを行い、④、WHERE句では重合関数数を用いることができず、HAVING句では重合関数を用いることができる.