真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL多表查詢及實(shí)例的概念

創(chuàng)新互聯(lián)公司主營(yíng)龍城網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開(kāi)發(fā),龍城h5微信小程序開(kāi)發(fā)搭建,龍城網(wǎng)站營(yíng)銷推廣歡迎龍城等地區(qū)企業(yè)咨詢

下文主要給大家?guī)?lái)MySQL多表查詢及實(shí)例的概念,希望MySQL多表查詢及實(shí)例的概念能夠帶給大家實(shí)際用處,這也是我編輯這篇文章的主要目的。好了,廢話不多說(shuō),大家直接看下文吧。

1.表與表之間的關(guān)系

一對(duì)一:用戶表和身份信息表,用戶表是主表
例如:男人表 、女人表

  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)
    );

一對(duì)多:最常見(jiàn)的表關(guān)系,用戶表和訂單表
例如:?jiǎn)T工表、部門(mén)表

 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)
        );

多對(duì)多:例如學(xué)生表和課程表,通常情況都是將多對(duì)多的關(guān)系拆分為一對(duì)多或者多對(duì)一的關(guān)系。

MySQL多表查詢及實(shí)例的概念

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 ('語(yǔ)文');    
insert into course (cname) values ('數(shù)學(xué)');    
insert into course (cname) values ('英語(yǔ)');    
insert into course (cname) values ('化學(xué)');
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.為什么要使用多張表

避免出現(xiàn)大量的數(shù)據(jù)的冗余。
并不是表拆的越多就越好,根據(jù)實(shí)際情況進(jìn)行拆分。

3.概念

同時(shí)查詢多張表

4.分類

<1>合并查詢
   union ,union all

   合并結(jié)果集,就是把兩個(gè)select語(yǔ)句的查詢結(jié)果合并到一起。(相當(dāng)于并集)
   合并的兩個(gè)結(jié)果,列數(shù)和列的順序,類需要一致

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;

<2>連接查詢
員工表

  create table emp(
            empno int primary key auto_increment, # 員工編號(hào)
            ename varchar(32),  #員工姓名
            job varchar(32),        #員工職位
            mgr  int,                       #上級(jí)編號(hào)
            hiredate date,          #入職時(shí)間
            sal double,                 #薪水
            comm double,                #獎(jiǎng)金
            deptno int                  #所屬部門(mén)
        );

部門(mén)表

 create table dept(
            deptno int primary key auto_increment,  #部門(mén)編號(hào)
            dname varchar(32),      #部門(mén)名稱
            loc varchar(32)             #部門(mén)地址
        );

內(nèi)連接: inner join....on  、 join 、 ,
       inner join 是比較運(yùn)算符,只返回符合條件的行

例如:

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
           代表查詢,左邊行的全部,右邊沒(méi)有則null

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

右外連接: right join ... on 或者  right outer join .... on
           右連接包含right join 右表所有的行,如果左表中某行在右表沒(méi)有匹配,則結(jié)果中對(duì)應(yīng)的左表的部門(mén)全部為空(null)

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

自連接:
       自連接就是說(shuō),在同一個(gè)數(shù)據(jù)表中,看作是兩個(gè)表,表示查找每個(gè)人的領(lǐng)導(dǎo),如果沒(méi)有領(lǐng)導(dǎo),則顯示無(wú)領(lǐng)導(dǎo)
      把一張表看作成兩張表,一張員工表,一張領(lǐng)導(dǎo)表,都是emp表

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

自然連接:natural join (join)|   natural  left join(同 left join) | natural right join (同 right join)

       自然連接會(huì)自動(dòng)判斷,以兩個(gè)表中相同的字段為連接條件,返回查詢結(jié)果。

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

注意:內(nèi)連接不寫(xiě)連接條件會(huì)出現(xiàn)笛卡爾積的結(jié)果,應(yīng)該避免這種情況,而外連接不寫(xiě)連接條件會(huì)報(bào)錯(cuò)。

<3>子查詢(ANY子查詢、IN子查詢、SOME子查詢、ALL子查詢)
   子查詢解決的問(wèn)題:
       誰(shuí)的薪資比叢浩高???

 select * from emp where sal >(select sal from emp where ename='從浩');

定義:子查詢?cè)试S把一個(gè)查詢嵌套在另一個(gè)查詢當(dāng)中
           子查詢又叫做內(nèi)部查詢,相當(dāng)于內(nèi)部查詢。包含內(nèi)部查詢的就稱為外部查詢。子查詢的結(jié)果被主查詢所使用。
注意的問(wèn)題:

1.括號(hào)

2.可以在主查詢的where select having from 后面,都可以使用子查詢

3.不可以再group by 后面使用子查詢

4.主查詢和子查詢可以不是同一張表;只有子查詢返回的值,主查詢可以使用。

需求:查詢部門(mén)名稱是人力的員工信息
第一種方式:利用子查詢

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

第二種方式:利用關(guān)聯(lián)查詢

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

SQL優(yōu)化:盡量使用多表查詢
               絕大部分的子查詢?cè)僮罱K執(zhí)行的時(shí)候他都是轉(zhuǎn)換成一個(gè)多表查詢來(lái)執(zhí)行的。  通過(guò)SQL執(zhí)行計(jì)劃可以看出來(lái)。
               通過(guò)SQL執(zhí)行計(jì)劃會(huì)發(fā)現(xiàn)兩種方式執(zhí)行的是一樣的。

5.from后面的子查詢
               需求:
                   查詢員工號(hào)   姓名      月薪

select empno,ename,sal from emp;

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

7.一般先執(zhí)行子查詢,再去執(zhí)行主查詢

ANY關(guān)鍵字

假設(shè)any內(nèi)部的查詢返回結(jié)果個(gè)數(shù)是三個(gè),如:result1,result2,result3,那么

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

需求:
   查詢工資比1號(hào)部門(mén)中任意一個(gè)員工高的信息

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

ALL關(guān)鍵字

ALL關(guān)鍵字與any關(guān)鍵字類似,只不過(guò)上面的or改成and :

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

需求:
   查詢工資比1號(hào)部門(mén)中所有員工號(hào)的員工信息

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

SOME關(guān)鍵字

some 關(guān)鍵字和any關(guān)鍵字是一樣的功能。所以:

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

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

IN關(guān)鍵字

IN運(yùn)算符用于where表達(dá)式中,以列表向的形式支持多個(gè)選擇。語(yǔ)法如下:

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

當(dāng)in前面加上not運(yùn)算符時(shí)候,表示與in相反的意思,既不在這寫(xiě)列表項(xiàng)中選擇。

案例:
   查詢部門(mén)名稱是人力和研發(fā)的員工

 select * from emp where deptno in   (select deptno from dept where dname='人力部' or dname='研發(fā)部')
分類: MySQL數(shù)據(jù)庫(kù)

對(duì)于以上關(guān)于MySQL多表查詢及實(shí)例的概念,大家是不是覺(jué)得非常有幫助。如果需要了解更多內(nèi)容,請(qǐng)繼續(xù)關(guān)注我們的行業(yè)資訊,相信你會(huì)喜歡上這些內(nèi)容的。


網(wǎng)頁(yè)名稱:MySQL多表查詢及實(shí)例的概念
網(wǎng)頁(yè)URL:http://weahome.cn/article/ieieic.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部