1. 程式人生 > >mysql資料庫基礎(二)

mysql資料庫基礎(二)

一、條件過濾

  • not 條件和() 條件
1.() 的用法
2.not 的用法
where end is null and not (title = 'hello');
  • 子查詢作為臨時表
dept_id = (select dept_id from department where name = 'loans')
  • 不相等條件 <> / !=
  • 範圍條件 between
where date between '2005-01-01' and '2005-12-31';
1.between 條件包含前後值,例如上面包含2005
-01-01 當天和2005-12-31 當天。 2.如果between 前面的值比後面的值大,查詢時不會報錯而是返回空集。 3.字串也可以當作範圍來使用。
  • 成員條件(類似於列舉): in
比如:select * from account where product_cd = 'A' or product_cd = 'B' or product_cd = 'D';
可以採用:
where product_cd in ('A','B','C'); 
  • 匹配條件 left() / right();
處理部分字串匹配問題:比如可以找到以T開頭的字串或者以B結尾的字串
...
where left(lname,1) = 'T' or right(lname,1) = 'B';
  • 萬用字元的使用
_ : 一個字元
% : 任意數目的字元(包含0個字元)
  • 正則表示式匹配 regexp
where lname regexp '^[FG]';以字元F或者G開頭。
  • null
1.null 表示值的缺失
沒有合適的值、值為確定、值為定義。
2.表示式的值可以為null,但是不能等於null。一般採用 is null/ is not null;
3.兩個null值不能彼此判斷為相等。

二、多表查詢

  • 內查詢 inner join … on …
1.select e.lname,d.name  from  employee e join department d;
多表連線如果沒有明確指出如何連線,預設採用內連結。
沒有明確指出連線條件,結果返回笛卡爾積。也就是說兩張表所有置換,若employee 有5條資訊,department 表有3條資訊,那麼結果會返回 5 * 3 = 15 條結果。
  • inner join 連線失敗
select e.fname,e.lname,d.name from employee e inner join department d on e.dept_id = d.dept_id;
如果一個表中的dept_id 列中存在某個值,但是該值在另一個表中的dept_id中不存在,那麼相關行就會連線失敗。在結果集中值存在兩表相互存在的行資料。

內連結是查詢交叉部分的資料,假如連線條件為a.bid = b.id 那麼結果中只會出現,a.bid 的值既存在a表中也存在b表中的資料。

如果想要顯示在a.bid 存在於a表中的值,但是不存在b表中的值的行,可以採用外連線 outer join ... on...
  • 連線條件和過濾條件
1.連線條件 on 後面的條件

2.過濾條件 where 後面的條件

select a.account_id,a.cust_id,a.open_date,a.product_cd from account a inner join employee e on a.open_emp_id = e.emp_id inner join branch b on e.assigned_branch_id = b.branch_id where e.start_date < '2007-01-01' and (e.title = 'Taller' or e.title = 'Head Teller') and b.name = 'Woburn Branch';
  • 連線順序
SQL 是一種非過程化的語言,也就是說只需要描述要獲取的資料物件,而如何以最好的方式執行查詢則由資料庫伺服器負責,伺服器根據所收集的資料庫物件資訊,在多表中選擇一個作為開始點(驅動表),然後確定連線其它表的順序。、
from字句各表出現的順序不重要。
  • 自連線 同一張表相互連線
select e.fname,e.lname,e_mgr.fname,e_mgr.lname from employee e inner join employee e_mgr on e.superior_emp_id = e_mgr.emp_id;