7月28
選擇部門30中的雇員
Select last_name, first_name from employees where department_id=30;
列出所有職員(CLERK)的姓名、編號和部門
Select last_name, first_name, employee_id, job_id from employees;
找出薪金大於5000的雇員
Select last_name, first_name from employees where salary>5000;
找出獎金高於0.1的雇員
Select last_name, first_name from employees where commission_pct>0.1;
找出部門50中的所有員工和部門30中的經理的詳細資料
Select * from employees where department_id=50 or (department_id=30 and job_id like ‘%\_MAN’);
找出收取獎金的雇員的不同工作職位 每種職位顯示一次 distinct
Sesect distinct job_id from employees where comission_pct is null;
找出不收取獎金或收取的工資低於5000的雇員
Select last_name, first_name from employees where commission_pct is null or salary*12*(commission_pct)<5000;
顯示last_name不帶有‘R‘的雇員姓名
Select last_name, first_name from employees where last_name not like ‘%\_R’;
Order by排序 默認是升序 加上desc表示降序。
多行函數:
單行函數:
Character functions(字符串)函數:
Trunc截斷,如 select last_name, trunc((sysdate - hire_date) /30) from employees;
Conversion 轉換函數 implicat隱含類型轉換 explicit明確類型轉換 類型必須一致。
To_char做格式轉換的使用。
Rr代表離當前年份最近的。Yy代表和當前年份在同一個世紀中。年份必須四個y
排序:
SQL> select last_name, salary from employees order by salary;
SQL> select last_name, salary from employees order by salary desc;
SQL> select last_name, salary from employees order by last_name;
SQL> select last_name, hire_date from employees order by hire_date;
SQL> select last_name, salary, commission_pct from employees order by salary desc, commission_pct desc;
SQL> select last_name, salary*12*(1+commission_pct) from employees order by 2;2表示第幾列
SQL> select last_name, salary*12*(1+commission_pct) total_salary from employees order by total_salary;
單行函數
SQL> select upper(first_name), lower(last_name), length(last_name) from employees;
SQL> select (sysdate-hire_date)/7 from employees;
SQL> select trunc((sysdate-hire_date)/30, 0) from employees;
SQL> select trunc(months_between(sysdate,hire_date), 0) from employees;
SQL> select sysdate+3650 from dual;
SQL> select add_months(sysdate, 120) from dual;
SQL> select next_day(‘2015-09-01‘, ‘friday‘) from dual;
SQL> select next_day(‘2015-10-01‘, 6) from dual;
SQL> select last_day(sysdate) from dual;
SQL> select round(to_date(‘2015-10-10‘,‘yyyy-mm-dd‘), ‘MONTH‘) from dual;
SQL> select round(to_date(‘2015-10-16‘,‘yyyy-mm-dd‘), ‘MONTH‘) from dual;
SQL> select round(to_date(‘2015-10-10‘,‘yyyy-mm-dd‘), ‘YEAR‘) from dual;
SQL> select round(sysdate, ‘DAY‘) from dual;
練習:
找出各月最後三天內受雇的所有雇員
extract(month from hire_date+4) != extract(month from hire_date)
找出早於25年之前受雇的雇員
months_between(sysdate, hire_date)/300>=25
顯示正好為6個字符的雇員姓名
length(last_name)=6
顯示所有雇員的姓名的前三個字符
substr(last_name, 1, 3)
顯示所有雇員的姓名,用a替換所有‘A‘
replace(last_name, ‘A‘, ‘a‘)
類型轉換和其他函數
SQL> select to_char(salary, ‘$999,999.00‘) from employees;
SQL> select last_name, to_char(hire_date, ‘dd-Mon-RR‘) from employees;
SQL> select to_char(sysdate, ‘yyyy-mm-dd hh24:mi:ss‘) from dual;
SQL> select to_char(sysdate, ‘yyyy-mm-dd hh:mi:ss AM‘) from dual;
SQL> select last_name from employees where hire_date=to_date(‘2006-05-23‘, ‘yyyy-mm-dd‘);
SQL> select to_number(‘$123,456.78‘, ‘$999,999.00‘) from dual;
練習:
查詢2006年入職員工:
select last_name
from employees
where hire_date between to_date(‘2006-01-01‘, ‘yyyy-mm-dd‘)
and to_date(‘2006-12-31‘, ‘yyyy-mm-dd‘);
select last_name
from employees
where to_char(hire_date, ‘yyyy‘)=‘2006‘;
select last_name
from employees
where extract(year from hire_date)=2006;
--不推薦
select last_name
from employees
where hire_date like ‘2006%‘;
查詢歷年9月份入職的員工:
select last_name
from employees
where to_char(hire_date, ‘mm‘)=‘09‘;
select last_name
from employees
where extract(month from hire_date)=9;
其他函數:
nvl:
nvl(val1, val2)
if val1 is not null
then
return val1;
else
return val2;
SQL> select last_name, salary*12*(1+nvl(commission_pct, 0)) total_salary from employees;
練習:
顯示所有員工部門編號,沒有部門的顯示“未分配部門”
Select last_name, nvl(to_char(department_id), ‘N/A’) from employees;
case和decode:
IT_PROG +1000
SA_REP +1500
ST_CLERK +2000
其他人工資不變 select salary from employees where job_id not in=(‘IT_PROG‘; SA_REP ST_CLERK)
select salary+1000 from employees where job_id=‘IT_PROG‘;
select last_name, job_id, salary,
case job_id
when ‘IT_PROG‘ then salary+1000
when ‘SA_REP‘ then salary+1500
when ‘ST_CLERK‘ then salary+2000
else salary
end new_salary
from employees;
select last_name, job_id, salary,
decode( job_id,
‘IT_PROG‘, salary+1000,
‘SA_REP‘, salary+1500,
‘ST_CLERK‘, salary+2000,
salary) new_salary
from employees;
練習:
按照員工工資,對員工分級顯示:
A 20001-25000
B 15001-20000
C 10001-15000
D 5001-10000
E 0-5000
select last_name, salary, (case when salary>=20001 and salary<=25000 then ‘A‘ when salary>=15001 and salary<=20000 then ‘B‘ when salary>=10001 and salary<=15000 then ‘C‘ when salary>=5001 and salary<=10000 then ‘D‘ when salary>=0 and salary<=5000 then ‘E‘ end) qualified_salary from employees;
7月28