ORACLE基礎知識(2--5)章節

ORACLE知識總結

第二章——過濾與排序

一、SQL 的分類
1.DQL語句 (data quary language) select
2.DML語句 (數據操作語句)insert update delete
3.DDL語句 (數據定義語句)對數據庫對象進行操作create alter drop truncate
4.DCL語句 (數據控制語句)對權限進行操作 grant revoke
5.TCL語句 (事物控制語句)commit rollback savepoint

二、簡單的select語句
1、語法
select {*|列名|表達式} from 表名; *代表表中的所有列
注:Oracle中所有對象的名字都是不區分大小寫的
例:查詢employees表中所有列的數據

select * from employees;

例:查詢employees表中員工的姓名和工資

select last_name||first_name,salary from employees;

例:查詢emp表中員工姓名,工資以及年薪

select last_name,salary,salary*12  from employees;

注:遇到空值,先進行空值轉換在進行計算,Oracle中的空值爲null,是一個比較特殊的值,既不是空格也不是0,所有的數據類型都支持null。
1.如果null出現在算數表達式中,其結果一定爲null
2.如果一個字符串連接一個null的話,其結果還是原來的字符串

2、列別名
寫法有:列名 列別名 《==》 列名 as 列別名如果你的列別名中出現了空格等特殊字符的時候,需要寫在雙引號中如果要限制別名的大小寫,也需要寫在雙引號中字符串使用“||”來連接字符串常量寫在單引號中用單引號給單引號進行轉義,也就是說在字符串中兩個連續的單引號顯示爲一個單引號
練習:查詢emp表的員工姓名和職位,
以 – XXX’s job is XXX

select last_name||'''s job_id is' ||job_id||null from employees;

3、去重複
distinct:去掉結果集中的重負記錄
例:查詢employees表中員工在那幾個部門中工作,列出這些部門的編號

select distinct department_id from employees;

4、限制條件和給記錄排序
1.格式:select 列名 from 表名 [where條件] [order by 列名|表達式|序號]
例:查詢employees表中10號部門的員工信息

select * from employees where department_id = 10;

2.比較運算法有 “=”,“>”,“>=”,“<”,“<=”,“<>” 比較運算法兩端的數據類型要一致
例:查詢employees表中工資高於3000的員工信息

select *  from employees where  salary > 3000;

在表中存儲的字符類型的數據是嚴格區分大小寫的
例:查詢employees表中姓名爲Scott的員工信息

select * from employees where last_name = 'SCOTT';

3.日期類型的常量一定要寫在單引號中
且Oracle中默認的日期格式是’DD-MON-YYYY’.
例:查詢employees表中在1994年6月7日入職的員工信息

select * from employees where hire_date = '7-6月-94';

5、特殊的比較運算符
1.between and運算符
列名 between 值1 and 值2 <==> 列名>=值1 and 列名 <= 值2;
包括區間的端點,小得端點寫在between後面,大的端點寫在and後面
例:查詢employees表中工資在5000到8000之間的員工信息(包括5000和8000)

select * from employees where salary between 5000 and 8000; 
<==>
select *  from employees where salary>=5000 and salary <=8000;

2.in運算符列名 in (值1,值2,值3,…); <==> 列名=值1 or 列名=值2 or…
例:查詢employees表中在部門10,20,30部門工作的員工信息

select * from employees where department_id in (10,20,30);    
 <==>等價於
select * from employees where department_id = 10 or department_id = 20 or department_id = 30;

3.字符串的模糊匹配 like
通配符 “%”:可以代表任意長度的字符串,包括0長度 “_”:可以代表一個字符,不包括0長度
例:查詢employees表中員工姓名以S開頭員工信息

select * from employees where last_name like 'S%';

例:查詢employees表中員工姓名第二個字符是o員工信息

select * from employees where last_name like '_o%';

例:查詢employees表中員工姓名中至少含有一個E的員工信息

select * from employees where last_name like '%E%';

escape轉義字符 可以用任意符號進行轉義
例:查詢employees表中職位以‘MK_’開頭端點員工信息

select * from employees where job_id like 'MK+_%' escape '+';
<==>  
select * from employees where job_id like 'MK\_%' escape '\';

4.is null 對空值的判斷
例:查詢employees表中沒有績效獎的員工信息

select * from employees where commission_pct is null;

空值只有is null或者is not null來判斷的時候,纔會返回true或false,否則後悔
返回null(不可知或不確定)

select * from employees where commission_pct = null;

5.not 運算符
列名 not between 值1 and 值2 《》列名 < 值1 or 列名 > 值2 列名 not in(值1,值2,值3,…) 《》 列名 <> 值1 and 列名 <> 值2 and 列名 <> 值3…
例:查詢employees表中有績效的員工的信息

select * from employees where commission_pct is not null;

例 :查詢employees中10和20部門中工資小於6000的員工信息;

select * from employees where (department_id = 10 or department_id = 20) and salary < 6000;

例:查詢employees表中job_id不是‘MK_’開頭的員工信息

select * from employees where job_id not like 'MK!_%' escape '!';

三、排序

  1. 列名排序
    例:查詢employees表中30部門員工姓名和工資,要求按照工資進行降序排序
select last_name,salary from employees where department_id = 30 order by salary desc;

例:查詢employees表中所有員工的姓名,工資和部門編號,要求按照部門升序,工資降序排序

select last_name,salary,department_id from employees order by department_id, salary desc;
  1. 表達式
    例:查詢employees表中所有員工的姓名,工資以及年薪,按照年薪升序排序
select last_name,salary,salary*12 from employees order by salary * 12  asc;

也可以根據列別名進行排序

select last_name,salary,salary*12 annsal from employees order by annsal asc;
  1. 序號 列在select子句中出現的位置-- 序號從1開始計數
    例:查詢employees表中所有員工的姓名,工資,職位和部門編號,要求按照部門升序,工資降序排序
select last_name,salary,job_id,department_id from employees order by 2,4;

第三章——單行行數

單行函數指的是對單行進行計算,也就是說會對結果集中每一條記錄計算一次,每一條記錄返回一個結果。
一、字符類型
1.大小寫轉換
例:把’I Love YOU’轉換成全大寫,全小寫和首字符大寫的形式

select upper('I Love YOU'),lower('I Love YOU'),initcap('I Love YOU') from dual;

2.concat(列|表達式,列|表達式):連接字符串

--例:把'I Love'和'You'連接起來
select concat('I Love','You') from dual; 
--例:把'I','Love'和'You'連接起來
select concat(concat('I ', 'Love '), 'You') from dual;

函數嵌套,是由最內層向外層一次計算的,且單行函數可以無限嵌套

3.substr(列|表達式,m,n)
注:把源字符串中從第m位開始,截取n個字符,如果不寫n,默認試試截取到字符串的末尾

--例:
select substr('I Love You',3,4) from dual;

例:將字符串’Hi, I am TOM, I am 15 years old, I Love YOU’中"YOU"截取出來(m可以取負數)

select substr('Hi, I am TOM, I am 15 years old, I Love YOU', -3, 3) from dual;--(從倒數第三個開始截取三位)
select substr('Hi, I am TOM, I am 15 years old, I Love YOU', -3) from dual;--(從倒數第三位開始截取到字符串的最後一個字符)

4.length(列|表達式):取長度

select length('Hi, I am TOM, I am 15 years old, I Love YOU') from dual;

5.instr(源字符串,子串,m,n)
注:返回子串在源字符串中從第m個字符開始,第n次出現的位置,m,n默認值都是1。

select instr('I Love You','o') from dual;    --(表示第一次出現‘o’在第幾位)
select instr('I Love You','o',5) from dual;  --(表示從字符串的第5位開始,第1次出現‘o’的位置)
select instr('I Love You','o',5,1) from dual;--(表示從字符串的第5位開始,第1次出現‘o’的位置)

例:使用字符函數查詢employees表的員工姓名,職位,以及工資,條件是:1、員工職位的最後三個字母是man 2、員工姓名中至少含有一個字母e

select last_name,job_id,alary from employees 
where lower(substr(job_id, -3))='man' and instr(lower(last_name),'e')>0; 

6.lapd(列|表達式,n,‘子串’):將源串用子串在左邊填充成n個字符長度
rapd(列|表達式,n,‘子串’):將源串用子串在右邊填充成n個字符長度
注:n指的是填充完的字符串的總長度,而不是填充多少個字符
例:將I Love You的左右分別用*填充到15個字符

select lpad('I Love You', 15, '*'), rpad('I Love You', 15, '*') from dual;

7.trim([leading|trailing|both]字符From源串):截去源串頭|尾的字符–默認是both,頭尾都截

--例:
select trim('l'from 'level') from dual;--——頭尾都截     
select trim(leading 'l' from 'level') from dual;--——只截頭部     
select trim(trailing 'l' from 'level') from dual;--——只截尾部

trim 的第二種用法:trim(列|表達式) ——去掉字符串頭尾的空格
例:select ’ mike ’ 源串, trim(’ mike ')截後 from dual;

8.replace(源字符串,s1,s2):將源字符串中的s1都替換成s2
例:將‘I Love You’中的‘You’替換成‘Her’

select replace('I Love You','You','Her') from dual;

二、數字函數
1.round(列|表達式[,n]):將數字四捨五入到小數點後n位,n默認是0

--例:
select round(654.31,1) from dual;  -- 四捨五入到小數點後一位     
select round(654.31,-1) from dual;      --四捨五入到小數點前一位     
select ronnd(654.31) from dual;  	    -- 四捨五入到0位小數

2.trunc(列|表達式[,n]):將數字截取到小數點後n位,n默認是0

--例:
select trunc(654.31,1) from dual;    --截取到小數點後一位     
select trunc(654.31,-3) from dual;  -- 截取到小數點前三位

3.mod(m,n):計算m除以n後的餘數

--例:
select mod(1000,400) from dual;   --1000除以400=2*400+200,所以餘數爲200

4.abs(m):取絕對值

--例:
select abs(-654) from dual;   --取-654的絕對值爲654

三、日期函數
1.sysdate:返回當前系統(Oracle服務器)時間

--例:
select sysdate from dual;

2.months_between(date1,date2):返回兩個日期之間相差的月數
例:查詢employees中的員工至今爲止已經在公司裏工作了多少年了

Select last_name,hire_date,round(months_between(sysdate,hire_date)/12,1) from employees;

練習:計算自己的年齡,四捨五入到小數點後兩位

select round(months_between(sysdate,'17-3月-00')/12,2) 年齡 from dual;

3.add_months(date1,n):在指定日期基礎上加上 相對應的月數

--例:
select add_months(sysdate,1) from dual;

如果給定的日期是一個月的最後一天的話,加上對應月數,結果也是那個月的最後一天

--例:
select add_months('28-2月-2019',1) from dual;
  1. next_day(date1, ‘星期×’|n):返回給定日期後一週之內的下一個星期×的日期
    注:是下一個星期幾,不是下個星期幾,比如今天星期四,next_day星期五就是明天
--例:
select next_day(sysdate,'星期二')from dual;     
select next_day(sysdate,'星期五') from dual;     
select next_day(sysdate,'星期四') from dual;     
select next_day(sysdate,6) from dual;

– 星期日是一週的第一天,星期一是2,以此類推

  1. last_day(date1):返回指定日期當月最後一天的日期
--例:
select last_day(sysdate) from dual;
  1. round(date1, ‘fmt’): 對給定日期進行四捨五入fmt叫做格式
    字符串,定了四捨五入到日期的哪一位代表年YYYY 表月 MM 代表日 DD
    例:上半個月來,工資按全月發放,下半個月來,工資按下個月一號開始發放查詢 employees表中員工從什麼時間開始拿工資
select last_name,hire_date,round(hire_date,'mm') from employees;

– 1~15日爲上半個月,不管這個月有多少天。

select round(to_date('15-2-2000', 'dd-mm-yyyy'), 'mm') from dual;
  1. trunc(date1, ‘fmt’): 對給定日期進行截斷,fmt叫做格式字符串,規定了截斷到日期的哪一位
    例:不管上半個月或下半個月,工資全按全月發放。
select last_name,hire_date,trunc(hire_date,'mm') from employees;
  1. extract(year|month|day from date1) : 從指定的日期中抽取出年,月或日的信息
    – year|month|day 都是關鍵字,不是字符串 – 是oracle 9i版本提供的,不建議大家使用
--例:
select extract(year from sysdate) from dual;      --抽出年份     
select extract(month from sysdate) from dual;  -- 抽出月份

9.日期的數學運算
注:在日期上加上或者減去一個數字,結果仍爲日期。
兩個日期相減返回日期之間相差的天數(日期不允許做加法運算)。
可以用數字除以24來向日期中加上或者減去天數。
例:查詢90號部門員工的姓名和到現在工作了多少個星期

select last_name,(sysdate-hire_date)/7 as weeks from employees where department_id = 90;

四. 類型轉換
1、 隱式的類型轉換

select * from employees where department_id = '10'; select * from employees where department_id = 10;
select * from employees where hire_date = '17-12月-1981';'DD-MON-YYYY'

– oracle是可以進行隱式類型轉換的
– 隱式類型轉換是有規則的
– 不建議大家使用隱式類型轉換
– 1. 代碼可讀性差;
– 2. 使用隱式類型轉換,代碼的效率差;
– 3. Oracle並沒有承諾在下一個版本中不修改隱式類型轉換的規則。

2、 顯式的類型轉換

  1. to_char(date1|number1,‘fmt’) : 將日期或數字轉換成字符,fmt是格式字符串,規定了轉換的格式
    – 常用的日期格式
    – fm 去掉前導0
    練習:輸出當前系統日期,如 2011/4/11 星期一
select to_char(sysdate,'fmYYYY/MM/DD DY') from dual;

– 常用的時間格式
練習:輸出當前系統時間,如 下午 3:24:33

select to_char(sysdate,'fmAM HH12:MI:SS') from dual; -- 獲取到下午 幾點幾分幾秒

– 如果在格式中需要加入字符串,那麼這個字符串應該寫在雙引號中
練習:輸出當前系統日期,如 2011年4月11日

select to_char(sysdate,'fmYYYY"年"MM"月"DD"日"') from dual;  

– RR和YY的問題
– YY始終認爲時間是當前世紀的時間
– RR更符合世紀之交人類的正常的思維習慣,有世紀轉換。

`select to_char(sysdate,'WW') from dual;--當前時間是今年的第幾周

– Q :代表季度
– W: 當月的第幾周
– WW:當年的第幾周
– 代表數字的格式字符串
– 9 : 代表一位數字;
– 0 : 代表一位數字或前導零;
– $ : 代表美元符號;
– L : 根據語言區域動態的顯示本地的貨幣符號;
– . : 小數點;
– , : 千位分隔符;
例:查詢employees表中King的姓名和工資,工資的格式要求有美元符號,帶有千位分隔符,而且保留兩位小數。

select last_name, to_char(salary,'$9,999.00') salary from employees where initcap(last_name) = 'King';

例子:查詢employees表中King的姓名和工資,工資的格式要求有人民幣符號,帶有千
位分隔符,而且保留兩位小數。(匯率是6)

select last_name, to_char(salary*6, 'L99,999,999.00') salary  from employees where initcap(last_name) = 'King';

在數字向字符型轉換的時候,整數位一定要足夠長,否則的話結果出錯 ‘17-12月-1981’

select * from employees where hire_date= to_date('12-17-1980', 'MM-DDYYYY');

五. 其他函數

  1. NVL (表達式1, 表達式2),兩個參數的數據類型要一致。對第一個
    參數進行判斷,如果爲空,則返回第二個參數的值,如果不爲空,返回第一個參數
    練習:查詢employees表中員工姓名,工資以及年薪
select last_name,salary,(salary + nvl(commission_pct,0))* 12 from employees;
  1. nvl2(p1, p2, p3) : 對第一個參數進行判斷,如果第一個參數不爲
    空的話,則返回第二個參數的值,如果爲空的話,返回第三參數的值
    練習:查詢employees表中員工姓名,工資以及年薪
select last_name,salary,nvl2(commission_pct,salary + commission_pct , salary)*12 from employees;
  1. NULLIF(表達式1, 表達式2): 函數主要是完成兩個參數的比較。當兩個參數不相等時,返回值是第一個參數值;當兩個參數相等時,返回值是空值。

  2. Coalesce(p1, p2…):參數的數量沒有限制,返回第一個不爲空的參數
    練習:查詢employees表中員工姓名,工資以及年薪

select last_name,salary,coalesce(salary+commission_pct,salary,0) * 12 from employees;

5.Case:作條件分支的判斷 Case 列|表達式 When 取值1 Then 返回值1 When 取值2 Then 返回值2…When 取值N Then返回值N Else默認返回值End
練習:查詢employees表中員工的姓名,部門編號以及部門名稱(10 - 部門1)

select last_name,department_id,
(case department_id   
when 10 then '部門1'     
when 20 then '部門2'       
else '部門3' end)部門名稱 
from employees;

decode : case表達式的簡便寫法
– decode函數的參數也是不限數量的 decode(列|表達式, 取值1, 返 回值1, 取值
2, 返回值2,…取值N, 返回值N, 默認返回值)
練習:查詢公司在1995-1998年之間,每年僱用的人數 to_char count

select count(*) total, sum(decode(to_char(hire_date,'yyyy'),1995,1,0))"1995", sum(decode(to_char(hire_date,'yyyy'),1996,1,0))"1996", sum(decode(to_char(hire_date,'yyyy'),1997,1,0))"1997", sum(decode(to_char(hire_date,'yyyy'),1998,1,0))"1998" from employees;

用 group by 和having來寫

select to_char(hire_date,'yyyy') 年份,count(employee_id) 人數 from employees group by to_char(hire_date,'yyyy')
having to_char(hire_date,'yyyy') in (1995,1996,1997,1998);

用case when then else end來寫

select count(*) as total, count (case when to_char(hire_date,'yyyy')=1995 then 1995 else null end) "1995"
,count(case when to_char(hire_date,'yyyy')=1996 then 1996 else null end) "1996"
,count(case when to_char(hire_date,'yyyy')=1997 then 1997 else null end) "1997"
,count(case when to_char(hire_date,'yyyy')=1998 then 1998 else null end) "1998" from employees;
     第四章——多表查詢

一、笛卡爾集
注:笛卡爾集會省略連接條件,所有表中的所有行互相連接
例:查詢員工姓名和相對應的部門名稱

select last_name||first_name as 姓名,department_name from employees ,departments where employees.department_id = departments.department_id;

–當不寫where語句時,出現的結果是員工數*部門數,寫where語句,也可以說成
Oracle連接

二、表的連接
1.等值連接
注:連接條件使用“=”進行比較,其他的篩選條件和連接條件之間是“and”的關係
例:查詢employees表中,工資高於2000員工的姓名和部門名稱

select e.last_name||first_name,d.department_name as from employees e ,departments d s where d.department_id = e.department_id and e.salary>2000;

– 只要在SQL中給表起了別名了,那麼在SQL語句的任何地方都不能再使用表名引用其中的列,建議大家所有的列都要加上表名作爲前綴

2.不等值連接
注:連接條件不用“=”連接
例:查詢employees表中員工的工資以及工資等級

select e.last_name||first_name,e.salary,j.grade_level from employees e,job_grades j where e.salary
between j.lowest_sal and j.highest_sal

–使用表名前綴在多個表中區分相同的列。在不同表中具有相同列名的列可以用表的別名加以區分。使用別名可以簡化查詢.使用表名前綴可以提高執行效率

3.外連接
注:使用外連接可以查詢不滿足條件的數據,外連接符號是“(+)”寫在連接條件中,且外連接符號“(+)”永遠是放在連接條件的缺乏表的一端,你要接觸哪個表的所以記錄,另外一張表就是缺乏表
例:查詢各部門有哪些員工工作,即使這個部門沒有員工 .(右外連接)

 select d.department_name, e.last_name  from employees e, departments d  where e.department_id(+) = d.department_id;  

例:查詢employees表員工姓名和部門名稱,即使這個員工沒有部門。(左外連接)

select d.department_name,e.last_name||first_name from employees e,departments d where e.department_id=d.department_id(+);

例:查詢emp表員工姓名和部門名稱,即使這個部門沒有員工,即使這個員工沒有部門。(全外連接)

select d.department_name,e.last_name from employees e full outer join departments d on e.department_id=d.department_id;

注:上面這種寫法是SQL1999寫法

例:輸出沒有員工的部門名稱

select d.department_name from employees e,departments d
where e.department_id(+)=d.department_id and e.last_name is null

注:內連接: 合併具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行
外連接: 兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中
不滿足條件的行 ,這種連接稱爲左(或右) 外連接。沒有匹配的行時, 結果表中相應的列爲空(NULL). 外連接的 WHERE 子句條件類似於內部連接, 但連接條件中沒有匹配行的表的列後面要加外連接運算符, 即用圓括號括起來的加號(+).

四、自連接
注:查詢結果和查詢條件都需要從同一張表中查詢出來的這種問題,需要使用到自連接
例:查詢和King同部門的員工的信息,但是不包括King

select e1.* from employees e1, employees e2 where e1.department_id = e2.department_id and e2.last_name = 'King' and e1.last_name <> 'King';

–自連接的語法比較晦澀,在工作中很少用到。
–一般用子查詢來代替自連接。

五:SQL1999連接語法
1.交叉連接(t1 cross join t2)–就是生成兩個表的笛卡爾集
例:查詢員工姓名和相對應的部門名稱

select e. last_name, d.department_name from employees e cross join departments d;

2.自然連接(t1 natural join t2)
注:NATURAL JOIN 子句,會以兩個表中具有相同名字的列爲條件創建等值連接。
在表中查詢滿足等值條件的數據。
如果只是列名相同而數據類型不同,則會產生錯誤。
返回的是,兩個表中具有相同名字的列的“且、交集”,而非“或,並集”。即:比如
employee類和department類都有department_id和manager_id,返回二者都相同的結果。
例:自然連接,自動查找兩個表的公共字段(狹義的公共字段,列名和數據類型都相同的那些列)作爲連接條件進行等值連接

select e.last_name,d.department_name from employees e natural join departments d;

3.等值連接(t1 join t2 using(列名))
注:在“NATURAL JOIN”子句創建等值連接時,可以使用“USING”子句指定等值連接中需要用到的列。使用 USING 可以在有多個列滿足條件時進行選擇。
不要給選中的列中加上表名前綴或別名。
JOIN 和 USING 子句經常同時使用。
例:用戶指定的公共字段列進行等值連接

Select e.last_name,d.department_name from employees e join departments d using(department_id);

4.連接條件(table1 join table2 on (連接條件))
注:自然連接中是已具有相同名字的列爲連接條件的。
可以使用ON字句指定額外的連接條件。這個連接條件是與其他條件分開的。
ON字句是語句具有更高的易讀性。
例:由用戶指定連接條件進行連接,通常解決兩個表沒有狹義的公共字段或兩個表需要使用不等值連接的情況

select e.last_name,d.department_name from employees e join departments d on (e.department_id = d.department_id);

例:使用ON字句創建多表連接

select employee_id, city, department_name from   employees e 
join   departments d on  d.department_id = e.department_id 
join   locations l on  d.location_id = l.location_id;

5.外連接(t1 left/right/full outer join t2 on(連接條件))
注:在SQL:1999中,內連接值返回滿足裏阿杰條件的數據。
兩個表在連接過程中除了返回滿足連接條件的行以外,還返回左或右表中不滿足條件的行,這種連接成爲左或右外連接。
兩個表在連接過程中除了返回滿足連接條件的行以外,還返回兩個表中不滿足條件的行,這種連接成爲滿外連接。
例:查詢各部門有哪些員工工作,即使這個部門沒有員工¬
左外連接寫法:

select d.department_name,e.last_name
from departments d left outer join employees e on (d.department_id = e.department_id);

右外連接寫法:

select d.department_name,e.last_name from employees e
right outer join departments d on(d.department_id = e.department_id);

滿(全)外連接寫法:
例:查詢employees表員工姓名和部門名稱,即使這個部門沒有員工,即使這個員工沒有部門。(全外連接)

select d.department_name,e.last_name from employees e full outer join departments d on(d.department_id = e.department_id);
      第五章——分組函數

分組函數會對結果集中一組記錄計算一次,一組記錄返回一個結果。
一、常用的分組函數
1.max([distinct]列|表達式) min([distinct]列|表達式):返回的結果集中某列的最大值或最小值
例:查詢10部門中工資的最大值和最小值分別是多少

select max(salary),min(salary) from employees where department_id = 10;

2.sum([distinct]列|表達式):計算結果集中某列數值之和
例:計算10部門中員工的工資總數是多少

select sum(salary) from employees where department_id = 10;

3.avg([distinct]列|表達式):計算結果集中的某列數值的平均值
例:查詢10部門中員工的平均工資

select avg(salary) from employees where department_id;

4.count([distince]*|列名):返回結果集中記錄的條數
例:查詢10號部門中員工的數量

select count(*) from employees where department_id = 10;

5.distince關鍵詞的用法
例:查詢employees表中的員工在幾個部門工作

select count(distince department_id) from employees;

6.group by 子句
1.分組函數通常和group by子句聯用,group by子句提供了一個分組的依據 group by子句中出現的列,可以不再select子句中出現
例:查詢employees表中各部門員工糉子對的最大值、最小值、總和和平均值

select department_id,max(salary),min(salary),sum(salary),avg(salary) from employees group by department_id;

2.select子句中出現的非分組函數列,一定要在group by子句中出現
例:查詢employees表中平均工資高於2000的部門編號個平均工資

select department_id,avg(salary) from employees
--where avg(salary)>2000 group by department_id
having avg(salart)>2000

– having 子句:對分組函數的結果進行篩選,是SQL語句的執行順序所決定的
– where 子句中不能出現分組函數
例:查詢employees表中領導的員工編號以及下屬員工的數量

select manager_id,count(*) from employees  group by manager_id having manager_id is not null;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章