1. 程式人生 > >mysql資料庫基礎學習總結3(查詢)

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