目錄
多表查詢
多表查詢有如下幾種:
合併結果集
連線查詢
巢狀查詢
合併結果集
連線查詢(非常重要)
內連線外連線(左連線、右連線)
自然連線
巢狀(子)查詢(非常重要)
子查詢出現的位置
當子查詢出現在where後作為條件時,還可以使用如下關鍵字
子查詢結果集的形式
自連線:自己連線自己,起別名
內連線 [inner] join on
外連線 outer join on
左外連線 left [outer] join
右外連線 right [outer] join
全外連線(mysql不支援)full join
自然連線 natural join
作用:合併結果集就是把兩個select語句的查詢結果合併到一起
要求:被合併的兩個結果:列數、列型別必須相同。
union :去除重覆記錄
select * from t1 union select * from t2;
union all :不去除重覆記錄
select * from t1 union all select * from t2;
連線查詢就是求出多個表的乘積,例如t1連線t2,那麼查詢出的結果就是t1*t2。
連線查詢會產生笛卡爾積,假設集合a=,集合b=,則兩個集合的笛卡爾積為。
多表查詢產生這樣的結果並不是我們想要的,那麼怎麼去除重複的,不想要的記錄呢,當然是通過條件過濾。通常要查詢的多個表之間都存在關聯關係,那麼就通過關聯關係去除笛卡爾積。
// 使用主外來鍵關係做為條件來去除無用資訊
select * from emp,dept where emp.deptno=dept.deptno[在多表查詢中,在使用列時必須指定列所從屬的表,例如emp.deptno表示emp表的deptno列。];
// 還可以為表指定別名,然後在引用列時使用別名即可。
select e.ename,e.sal,e.comm,d.dname
from emp as e,dept as d
where e.deptno=d.deptno;[其中as是可以省略的]
上面的連線語句就是內連線,但它不是sql標準中的查詢方式,可以理解為方言!sql標準的內連線為。
內連線的特點:查詢結果必須滿足條件。例如我們向emp表中插入一條記錄。
select *
from emp e
inner[inner可以省略,mysql預設的連線方式就是內連線] join dept d
on[不使用where,而是使用on] e.deptno=d.deptno;
左連線:左連線是先查詢出左表(即以左表為主),然後查詢右表,右表中滿足條件的顯示出來,不滿足條件的顯示null
select * from emp e
left outer[outer可以省略] join dept d
on e.deptno=d.deptno;
右連線:右連線就是先把右表中所有記錄都查詢出來,然後左表滿足條件的顯示,不滿足顯示null
select * from emp e
right outer join dept d
on e.deptno=d.deptno;
連線查詢心得:
連線不限與兩張表,連線查詢也可以是三張、四張,甚至n張表的連線查詢。通常連線查詢不可能需要整個笛卡爾積,而只是需要其中一部分,那麼這時就需要使用條件來去除不需要的記錄。這個條件大多數情況下都是使用主外來鍵關係去除。
大家也都知道,連線查詢會產生無用笛卡爾積,我們通常使用主外來鍵關係等式來去除它。而自然連線無需你去給出主外來鍵等式,它會自動找到這一等式。
兩張連線的表中名稱和型別完全一致的列作為條件,例如emp和dept表都存在deptno列,並且型別一致,所以會被自然連線找到!
當然自然連線還有其他的查詢條件的方式,但其他方式都可能存在問題!
select * from emp natural join dept;[內連線]
select * from emp natural left join dept;[左連線]
select * from emp natural right join dept;[右連線]
乙個select語句中包含另乙個完整的select語句。子查詢就是巢狀查詢,即select中包含select,如果一條語句中存在兩個,或兩個以上select,那麼就是子查詢語句了。
// 子查詢作為條件 子查詢形式為單行單列
// 工資高於jones的員工
select * from emp where sal > (select sal from emp where ename='jones')
// 子查詢作為條件 子查詢形式為多行單列(當子查詢結果集形式為多行單列時可以使用all或any關鍵字)
// 工資高於30號部門所有人的員工資訊
select * from emp where sal > all [大於所有](select sal from emp where deptno=30)
// 子查詢作為條件 子查詢形式為單行多列
// 查詢工作和工資與martin(馬丁)完全相同的員工資訊
select * from emp where (job,sal) in (select job,sal from emp where ename='martin')
// 子查詢作為表 子查詢形式為多行多列
// 查詢員工編號為7788的員工名稱、員工工資、部門名稱、部門位址
select e.ename, e.sal, d.dname, d.loc
from emp e, (select dname,loc,deptno from dept) d
where e.deptno=d.deptno and e.empno=7788
// 求7369員工編號、姓名、經理編號和經理姓名
select e1.empno , e1.ename,e2.mgr,e2.ename
from emp e1, emp e2
where e1.mgr = e2.empno and e1.empno = 7369;
MySQL資料庫基礎快速入門
如果你還不會安裝mysql和連線mysql資料庫,你應該選擇上面部分內容學習之後,再看以下內容 1.登入資料庫 mysql uroot p 引數說明 u 在上面示例中 u引數後面緊跟的是 root 關鍵字,意思就是使用root賬號登入 p 此引數代表使用密碼登入,加上此引數之後,命令行會提示使用者輸...
mysql 資料庫快速入門 MySQL的資料型別
目錄 mysql 資料型別 數值型別 字串 字元 型別 日期 時間型別 mysql支援所有標準sql數值資料型別。資料字段的型別對資料庫的優化是非常重要的,合理的使用資料型別,對資料庫的真來說都是有益的。mysql支援多種型別,大致可以分為三類 型別大小 範圍 有符號 範圍 無符號 用途tinyin...
資料庫快速入門
sqlite 新建乙個資料庫之後需要建立乙個表,否則退出之後,可能找不到這個資料庫檔案。sqlite dev 是乙個exe檔案,預設路徑安裝,自動在桌面生成快捷方式。對於初學者,先把這個工具放一邊,掌握好最基礎的sql語言再去使用它 資料庫管理系統dbms 1.資料定義語言ddl 供使用者定義資料庫...