mysql資料庫基礎學習總結3(查詢)
012.多表查詢 013.多表連線
1.多表查詢
語法:
select * from table1,table2;
使用這種語法可以查詢出兩個表中的記錄的組合(列相加,行相乘,這就是笛卡爾乘積);
如果兩個表中有重複的列名,可以通過 表名.列名進行區分
為了方便重複使用表名,可以為表設定一個別名
多個表進行連線查詢;
select empno,e.deptno,dname,sal,gradeName from emp e,dept d,sal_grade s
where e.deptno=d.deptno and sal BETWEEN s.lowsal
and s.hignsal
2.內連線和外連線
內連線:完全滿足連線條件;
外連線:就算不滿足連線條件,其中一個表中的資料也一定會查到;
3.標準sql-99的多表查詢語法
select * from t1 連線方式 t2
on 連線條件
select * from t1 inner join t2
on t1.xxx=t2.xxx;
外連線的語法
左外:left [outer] join
右外:right [outer] join
示例:
select * from emp left join dept
on emp.deptno=dept.deptno;
三表相聯的示例
select * from emp e left join dept d
on e.deptno=d.deptno inner join sal_grade s
on sal BETWEEN s.lowsal and s.hignsal
自連線
表中的一個列的取值範圍來源於當前的其它欄位(主鍵)
思路:將一個表查兩次(把一張表當成兩個表來看待)
示例
select e1.empno,e1.ename,e2.ename leader from emp e1,emp e2
where e1.leader=e2.empno and e1.empno=7878
014.子查詢
1.子查詢
子查詢就是在一個查詢語句中同時包含了更外一個查詢語句,這樣的語名就是子查詢;
一個子查詢可以放在另外一個查詢的三個位置,分別是
where 子句
having 子句
from 子句;
使用where或having時,子查詢的結果可以返回單行記錄,也可以返回多行記錄;返回單行記錄時可以使用> ,< ,=,!=等操作符,返回多行記錄時,可以使用in,any,all操作符;
2.any,all的區別
any與all必須與>,< ,<=,<=一起結合著使用;
>any():大於any集合中任意一個,其實就是大於最小的那個
>all():大於all集合中所有的,其實就是大於最大的那個;
3.練習;
查詢出比james的工資高的所有員工;
查詢出比平均工資高的所有員工;
查詢出james的同事
查詢出比james工資高,並且與james職位相同的員工;
查詢出平均工資高於20部門的平均工資的職位;並從高到低進行排序;
查詢出沒有員工的部門;
015.exists子句
1.exists語句
exists語法;
select * from 表名
where exists(sql語句)
2.說明:
exists中包含一條查詢語句 ,如果查詢語句有結果,那麼這個表示式為true,如果子查詢中沒有結果,則表示式的值為false;
使用exists時,先執行外部查詢,再執行子查詢;在子查詢中可以使用外部的查詢表;
016.常用函式
常用函式
數值:
abs:絕對值
Truncate():截斷
Round():四捨五入
RAND():隨機數
POW():次方
字元:
length():位元組數
char_length():字元數
trim():去除前後的空格
concat():連線字串
upper():轉成大寫
lower():轉成小寫
substring():擷取子串
日期:
now():當前日期和時間
current_date:當前日期
current_time:當前日期
select now()- INTERVAL 2 WEEK
時間 +,-操作符 INTERVAL 增量(1,2,4) 單位(DAY,YEAR,MONTH)
轉換:
select DATE_FORMAT(now(),'%Y-%m-%d')
select STR_TO_DATE('2015-6-23','%Y-%m-%d')
case語句,可以做分支判斷 ;(行變列時可以使用)
select ename,job,sal,
case
when sal>15000 then '高薪'
when sal>8000 then '中等'
else '低薪'
end salary
from emp;
select ename,job,sal,
case job
when 'manager' then '經理'
when 'programmer' then '攻城獅'
else '其他'
end job
from emp