ホームページ  >  記事  >  データベース  >  MySQL - マルチテーブルクエリの詳細な紹介と例

MySQL - マルチテーブルクエリの詳細な紹介と例

王林
王林転載
2019-08-28 11:59:232611ブラウズ

1. テーブル間の関係

1 対 1: ユーザー テーブルと ID 情報テーブル、ユーザー テーブルがメイン テーブルです
例: man テーブル、女性テーブル

  create table man( 
   mid int primary key  auto_increment,
        mname varchar(32),
        wid int unique
    );
 create table woman(
        wid  int primary key  auto_increment,
        wname varchar(32)
    );

1 対多: 最も一般的なテーブル リレーションシップ、ユーザー テーブル、注文テーブル
例: 従業員テーブル、部門テーブル

 create table emp(
            empno int primary key  auto_increment,
            ename varchar(32),
            deptno int
        );
 create table dept(
            deptno int primary key  auto_increment,
            dname varchar(32)
        );

多対多: たとえば、学生テーブルやコース スケジュールでは、通常、多対多の関係は 1 対多または多対 1 の関係に分割されます。

create table student(            sid  int primary key  auto_increment,
            sname varchar(32)
        );
insert into student (sname) values ('大拿');     
insert into student (sname) values ('唐嫣');
insert into student (sname) values ('王健林');
 create table course(
            cid int primary key  auto_increment,
            cname varchar(32)
        );
insert into course (cname) values ('语文');    
insert into course (cname) values ('数学');    
insert into course (cname) values ('英语');    
insert into course (cname) values ('化学');
create table s_c(
       cid int,        sid int
   );
 insert into s_c (sid,cid) values (1,1);    
 insert into s_c (sid,cid) values (1,2);    
 insert into s_c (sid,cid) values (1,3);    
 insert into s_c (sid,cid) values (1,4);    
 insert into s_c (sid,cid) values (2,2);    
 insert into s_c (sid,cid) values (2,4);    
 insert into s_c (sid,cid) values (3,1);    
 insert into s_c (sid,cid) values (3,3);

2. 複数のテーブルを使用する理由

大量のデータの冗長性を避けるため。
分割できるテーブルは多ければ多いほど良いというわけではなく、実情に応じて分割してください。

#3. コンセプト

複数のテーブルを同時にクエリする


4.分類

f35d6e602fd7d0f0edfa6f7d103c1b57クエリのマージ

Union、Union all

結果セットのマージとは、2 つの select ステートメントのクエリ結果を結合することを意味します。 (ユニオンと同等)
2 つのマージ結果、列の数、列の順序、クラスは一貫している必要があります

create table emp(
       empno int primary key  auto_increment,
       ename varchar(32)
   );
create table dept(
        deptno int primary key  auto_increment,
        dname varchar(32)
    );
select * from emp  union select * from dept;    
select * from emp  union all select * from dept;

2cc198a1d5eb0d3eb508d858c9f5cbdb接続クエリ

従業員テーブル

  create table emp(
            empno int primary key auto_increment, # 员工编号
            ename varchar(32),  #员工姓名
            job varchar(32),        #员工职位
            mgr  int,                       #上级编号
            hiredate date,          #入职时间
            sal double,                 #薪水
            comm double,                #奖金
            deptno int                  #所属部门
        );

部門テーブル


 create table dept(
            deptno int primary key auto_increment,  #部门编号
            dname varchar(32),      #部门名称
            loc varchar(32)             #部门地址
        );

内部結合: 内部結合....on , join , ,

内部結合は比較演算子であり、条件を満たす行のみを返します。条件
#例:

select * from emp inner join  dept  on emp.deptno=dept.deptno;        
select * from emp e ,dept d where e.deptno = d.deptno;        
select * from emp e join dept d where e.deptno = d.deptno;

外部結合:

左外部結合: LEFT OUTER JOIN | left join ... on

クエリ、クエリ上のすべての行を表します。 left、右側に行がない場合は null

select * from emp e LEFT OUTER JOIN  dept d ON e.deptno = d.deptno;

右外部結合: 右外部結合 ... on または右外部結合 .... on

右外部結合には、すべての右結合の右テーブルの行。左テーブルの行が右テーブルと一致しない場合、結果の左テーブルの対応する部門はすべて空 (null)


 select * from emp e right OUTER JOIN  dept d ON e.deptno = d.deptno;
## になります。 #Self-join:
Self-joinとは、同じデータテーブル内で2つのテーブルとしてみなし、それぞれの人のリーダーを見つけることを意味し、リーダーがいない場合はリーダーも表示されません

1 つのテーブルを、従業員テーブルとリーダー テーブルの 2 つのテーブルとして考えます。両方とも emp テーブルです。


select e.ename,el.ename from emp e left join emp el on e.mgr = el.empno;

自然結合: 自然結合 (結合) | 自然左結合 (左結合と同じ) | ナチュラル右結合 (右結合と同じ)

自然結合は、2 つのテーブルの同じフィールドを自動的に判断して接続条件として使用し、クエリ結果を返します。


select * from emp natural join dept;       
select * from emp NATURAL left join dept;        
select * from emp NATURAL right join dept;


注: 内部接続が接続条件を書き込まない場合、デカルト積の結果が表示されます。この状況は回避する必要があり、外部接続が接続条件を書き込まない場合は、接続状態ではエラーが報告されます。

##5bdf4c78156c7953567bb5a0aef2fc53サブクエリ (ANY サブクエリ、IN サブクエリ、SOME サブクエリ、ALL サブクエリ) サブクエリによって解決される問題:
Cong Hao よりも背が高いのは誰の給料ですか? ? ?



 select * from emp where sal >(select sal from emp where ename='从浩');
定義: サブクエリを使用すると、1 つのクエリを別のクエリにネストできます
サブクエリは内部クエリとも呼ばれ、内部クエリと同等です。内部クエリを含むクエリは外部クエリと呼ばれます。サブクエリの結果はメイン クエリで使用されます。

注意事項

:

1. 括弧 2. メインクエリの where select の from の後にサブクエリを使用できます

3.サブクエリは

4 でグループ化した後には使用できません。メイン クエリとサブクエリは同じテーブル内にある必要はありません。メイン クエリで使用できるのは、サブクエリから返された値のみです。

要件: 部門名が人事である従業員情報をクエリする

最初の方法: サブクエリを使用する

select * from emp where deptno=(select deptno from dept where dname='人力部');

2 番目の方法: 関連クエリを使用する

 select * from emp e,dept d where e.deptno = d.deptno and d.dname='人力部';

SQL 最適化: 複数テーブル クエリを使用してみてください


#

select empno,ename,sal from emp;

SQL 最適化: 複数テーブルのクエリを使用してみる

SQL 実行プランを通じてそれを確認できます。
SQL 実行プランを見ると、2 つのメソッドの実行が同じであることがわかります。

5.from后面的子查询
               需求:
                   查询员工号   姓名      月薪

select empno,ename,sal from emp;

6.一般不在子查询中排序        

7.一般先执行子查询,再去执行主查询

ANY关键字

假设any内部的查询返回结果个数是三个,如:result1,result2,result3,那么

select .... from .. where a > any(...);
->select ..... from ... where a > result1 or a >result2  or a >result3;

需求:
   查询工资比1号部门中任意一个员工高的信息

select * from emp where sal > any(select sal from emp where deptno = 1);

ALL关键字

ALL关键字与any关键字类似,只不过上面的or改成and :

select .... from .. where a > all(...);
->select ..... from ... where a > result1 and a >result2  and a >result3;

需求:
   查询工资比1号部门中所有员工号的员工信息

   select * from emp where sal > all(select sal from emp where deptno = 1);

SOME关键字

some 关键字和any关键字是一样的功能。所以:

select .... from .. where a > any(...);

->select ..... from ... where a > result1 or a >result2  or a >result3;

IN关键字

IN运算符用于where表达式中,以列表向的形式支持多个选择。语法如下:

where column in (v1,v2,v3,.....);        
where column not in (v1,v2,v3,.....);

当in前面加上not运算符时候,表示与in相反的意思,既不在这写列表项中选择。

案例:
   查询部门名称是人力和研发的员工

 select * from emp where deptno in   (select deptno from dept where dname='人力部' or dname='研发部')
分类: MySQL数据库

想了解更多相关问题请访问PHP中文网:MySQL视频教程

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

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