資料庫查詢基本命令
oracle 資料庫的scott帳號。
<>作為查詢條件時,可以使用!= 來替換。
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
14 rows selected
單表查詢:
SQL> select ename,job,sal from emp;
ENAME JOB SAL
SMITH CLERK 800.00
ALLEN SALESMAN 1600.00
WARD SALESMAN 1250.00
JONES MANAGER 2975.00
MARTIN SALESMAN 1250.00
BLAKE MANAGER 2850.00
CLARK MANAGER 2450.00
SCOTT ANALYST 3000.00
KING PRESIDENT 5000.00
TURNER SALESMAN 1500.00
ADAMS CLERK 1100.00
JAMES CLERK 950.00
FORD ANALYST 3000.00
MILLER CLERK 1300.00
14 rows selected
查詢全部列:
select * from emp;
查詢經過計算的值:
SQL> select ename,job,6000-sal from emp;
ENAME JOB 6000-SAL
SMITH CLERK 5200
ALLEN SALESMAN 4400
WARD SALESMAN 4750
JONES MANAGER 3025
MARTIN SALESMAN 4750
BLAKE MANAGER 3150
CLARK MANAGER 3550
SCOTT ANALYST 3000
KING PRESIDENT 1000
TURNER SALESMAN 4500
ADAMS CLERK 4900
JAMES CLERK 5050
FORD ANALYST 3000
MILLER CLERK 4700
14 rows selected
列出ename,job,sal,並用小寫字母來表示job,ename :
SQL> select lower(ename),lower(job),sal from emp;
LOWER(ENAME) LOWER(JOB) SAL
smith clerk 800.00
allen salesman 1600.00
ward salesman 1250.00
jones manager 2975.00
martin salesman 1250.00
blake manager 2850.00
clark manager 2450.00
scott analyst 3000.00
king president 5000.00
turner salesman 1500.00
adams clerk 1100.00
james clerk 950.00
ford analyst 3000.00
miller clerk 1300.00
14 rows selected
別名的使用:在select語句的執行順序中,from子句最先被執行,然後就是where子句,最後才是select子句。當在from子句中指定表別名後,表的真實名稱將被替換。同時,其他的子句只能使用表別名來限定列。
SQL> select ename 名字,job 工作,sal from emp;
名字 工作 SAL
SMITH CLERK 800.00
ALLEN SALESMAN 1600.00
WARD SALESMAN 1250.00
JONES MANAGER 2975.00
MARTIN SALESMAN 1250.00
BLAKE MANAGER 2850.00
CLARK MANAGER 2450.00
SCOTT ANALYST 3000.00
KING PRESIDENT 5000.00
TURNER SALESMAN 1500.00
ADAMS CLERK 1100.00
JAMES CLERK 950.00
FORD ANALYST 3000.00
MILLER CLERK 1300.00
14 rows selected
SQL> select ename "名字",job "工作",sal from emp;(此處雙引號只能為英文雙引號,漢字雙引號報錯)
查詢的時候,比如job='clerk'這裡是英文單引號
關於別名,比如select ename "名字",job "工作",sal from emp; 這裡是英文雙引號;這裡也是英文的,中文無效
在使用列別名時,如果列別名區分大小寫,並且還包含一些特殊字元,那麼必須使用雙引號將列別名引起來。
名字 工作 SAL
SMITH CLERK 800.00
ALLEN SALESMAN 1600.00
WARD SALESMAN 1250.00
JONES MANAGER 2975.00
MARTIN SALESMAN 1250.00
BLAKE MANAGER 2850.00
CLARK MANAGER 2450.00
SCOTT ANALYST 3000.00
KING PRESIDENT 5000.00
TURNER SALESMAN 1500.00
ADAMS CLERK 1100.00
JAMES CLERK 950.00
FORD ANALYST 3000.00
MILLER CLERK 1300.00
14 rows selected
SQL> select ename “名字”,job “工作”,sal from emp;
select ename “名字”,job “工作”,sal from emp
ORA-00911: 無效字元
消除取值重複的行:
SQL> select deptno from emp;
DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10
14 rows selected
SQL> select distinct deptno from emp;
DEPTNO
30
20
10
此處: select deptno from emp; 等同於 select all deptno from emp;預設沒有指定distinct關鍵詞,則預設值為all,即保留結果表中取值重複的行。
查詢滿足條件的元組: where 語句來實現!
查詢關於工資的比較:
SQL> select ename,job,sal from emp where sal='800';
ENAME JOB SAL
SMITH CLERK 800.00
SQL> select deptno,ename,job from emp where ename='KING';(oracle這裡區分大小寫)
DEPTNO ENAME JOB
10 KING PRESIDENT
SQL> select ename,job,sal from emp where sal>=2000;
ENAME JOB SAL
JONES MANAGER 2975.00
BLAKE MANAGER 2850.00
CLARK MANAGER 2450.00
SCOTT ANALYST 3000.00
KING PRESIDENT 5000.00
FORD ANALYST 3000.00
6 rows selected
SQL> select ename,job,sal from emp where sal between 1000 and 2000;(此處not between...and...相同使用方法)
ENAME JOB SAL
ALLEN SALESMAN 1600.00
WARD SALESMAN 1250.00
MARTIN SALESMAN 1250.00
TURNER SALESMAN 1500.00
ADAMS CLERK 1100.00
MILLER CLERK 1300.00
6 rows selected
確定集合,謂詞In 可以用來查詢屬性值屬於指定集合的元組。(IN 的相對是 NOT IN)
SQL> select ename,job,sal from emp where deptno in ('10','20');
ENAME JOB SAL
SMITH CLERK 800.00
JONES MANAGER 2975.00
CLARK MANAGER 2450.00
SCOTT ANALYST 3000.00
KING PRESIDENT 5000.00
ADAMS CLERK 1100.00
FORD ANALYST 3000.00
MILLER CLERK 1300.00
8 rows selected
字元匹配:
SQL> select ename,job, sal from emp where empno like '7369';
ENAME JOB SAL
SMITH CLERK 800.00
SQL> select ename,job, sal from emp where empno='7369';
ENAME JOB SAL
SMITH CLERK 800.00
SQL> select ename,job, sal from emp where empno like '7%9';
ENAME JOB SAL
SMITH CLERK 800.00
ALLEN SALESMAN 1600.00
KING PRESIDENT 5000.00
SQL> select ename,job, sal from emp where empno like '7__9';
ENAME JOB SAL
SMITH CLERK 800.00
ALLEN SALESMAN 1600.00
KING PRESIDENT 5000.00
SQL> select ename,job, sal from emp where empno like '7_9_';
ENAME JOB SAL
ALLEN SALESMAN 1600.00
BLAKE MANAGER 2850.00
(一個漢字要佔兩個字元的位置,所以匹配漢字的時候要注意)
涉及空值的查詢:(此處is 不能用等號(=)代替)
SQL> select ename,job,sal from emp where mgr is null;
ENAME JOB SAL
KING PRESIDENT 5000.00
多重條件查詢: 邏輯運算子and 和or 可用來聯結多個查詢條件,and優先順序比or高,可以通過括號來改變優先順序。
SQL> select ename,job,sal from emp where deptno='20' and sal>2500;
ENAME JOB SAL
JONES MANAGER 2975.00
SCOTT ANALYST 3000.00
FORD ANALYST 3000.00
order by 子句:
使用者可以用order by 子句對查詢結果按照一個或多個屬性列的升序(asc)或降序(desc)排列,預設值為升序。
SQL> select empno,ename,job,sal from emp where deptno='20' order by sal,empno;
EMPNO ENAME JOB SAL
7369 SMITH CLERK 800.00
7876 ADAMS CLERK 1100.00
7566 JONES MANAGER 2975.00
7788 SCOTT ANALYST 3000.00
7902 FORD ANALYST 3000.00
聚集函式:
count([distinct|all]*) 統計元組個數
count([distinct|all]<列名>) 統計一列中值的個數
sum([distinct|all]<列名>) 計算一列值的總合(此列必須是數值型)
avg([distinct|all]<列名>) 計算一列值的平均值(此列必須是數值型)
max([distinct|all]<列名>) 求一列值中的最大值
min([distinct|all]<列名>) 求一列值中的最小值
SQL> select count(*) from emp;
COUNT(*)
14
SQL> select count(sal) from emp;
COUNT(SAL)
14
SQL> select avg(sal) from emp where deptno='20';
AVG(SAL)
2175
SQL> select max(sal) from emp where deptno='20';
MAX(SAL)
3000
SQL> select ename,job, min(sal) from emp where deptno='20';
select ename,job, min(sal) from emp where deptno='20'
ORA-00937: 不是單組分組函式
SQL> select min(sal) from emp where deptno='20';
MIN(SAL)
800
SQL> select sum(sal) from emp ;
SUM(SAL)
29025
Group by句子:
SQL> select avg(sal),max(sal),deptno from emp group by deptno;
AVG(SAL) MAX(SAL) DEPTNO
1566.66666 2850 30
2175 3000 20
2916.66666 5000 10
SQL> select avg(sal),min(sal),job,deptno from emp group by deptno,job;
AVG(SAL) MIN(SAL) JOB DEPTNO
950 800 CLERK 20
1400 1250 SALESMAN 30
2975 2975 MANAGER 20
950 950 CLERK 30
5000 5000 PRESIDENT 10
2850 2850 MANAGER 30
1300 1300 CLERK 10
2450 2450 MANAGER 10
3000 3000 ANALYST 20
9 rows selected
having的用法。就是起到限制,group by 後面的限制。
SQL> select avg(sal),deptno from emp group by deptno having avg(sal)<2000;
AVG(SAL) DEPTNO
1566.66666 30
對資料分組的總結:
1 分組函式只能出現在選擇列表、having、order by子句中
2 如果在select 語句中同時包含有group by,having,order by 那麼他們的順序是group by,having,order by
3 在選擇列中如果有列、表示式、和分組函式,那麼這些列和表示式必須有一個出現在group by 子句中,否則就會出錯
如select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000;這裡deptno就一定要出現在group by 中。
在使用group by 子句時,必須滿足下面的條件:
在select 子句的後面只可以有兩類表示式:統計函式和進行分組的列名。
在select子句中的列名必須是進行分組的列,除此之外新增其他的列名都是錯誤的,但是,group by子句後面的列名可以不出現在select子句中。
如果使用了where子句,那麼所有參加分組計算的資料必須首先滿足where子句指定的條件。
下面是衣蛾錯誤的查詢,猶豫在select子句後面出現了salary列,而該列並沒有出現在group by 子句中,所以該語句是一個錯誤的查詢。
select job_id,salary,avg(salary),sumsalary),max(salary),count(*) from employees group by job_id;
這裡是錯誤的!!!!
如果處理null值
select sal13+nvl(comm,0)13 "年工資",ename,comm from emp;
1:子查詢
子查詢的型別:基本有兩種:單行子查詢和多行子查詢
單行子查詢
多行子查詢
另外,子查詢還有3種子型別,這3種子型別返回一行或者多行的查詢結果。
多列子查詢
關聯子查詢
巢狀子查詢
單行子查詢:
select start_date,end_date,job_id from job_history where employee_id=(select employee_id from employees where first_name='jennifer' and last_name='whalen');
多列子查詢是指返回多列資料的子查詢語句。當多列子查詢返回單行資料時,在where自居中可以使用單行比交付:單色如果需要返回多行資料時,那麼where自居中必須使用多行比較符(in、any、all)
1:使用In操作符實現制定匹配查詢
當在多行子查詢中使用In操作符時,會處理匹配與子查詢中任一個值的行。
以下程式碼查詢Jobs表中最高工資分別為10000、20000、30000的職位資訊。
select job_id,max_salary from jobs where max_salary in(10000,20000,30000);
2:使用any操作符實現任意匹配查詢
any操作符必須與單行操作符結合使用,並且返回行只需匹配與子查詢的任一個結果即可。
首先查詢jobs表中最高工資小於10000的工作職位,然後在外部查詢中查詢最低工資大於這些工資的任意一個工作職位資訊。
select job_id,min-salary,max_salary from jobs where min_salary>any(select max_salary from jobs where max_salary<10000);
3:使用all操作符實現全部匹配查詢
首先查詢jobs表中最高工資小於10000的工作職位,然後在外部查詢中查詢最低工資大於這些工資的任意一個工作職位資訊。
select job_id,min_salary,max_salary from jobs where min_salary>all(select max_salary from jobs where max_salary<10000);
在update語句中使用子查詢
update jobs set min_salary=min_salary+100 where min_salary>all(select max_salary from jobs where max_salary <10000);
在delete 語句中使用子查詢
delete from job_history where employee _id=(select employee_id from employees where first_name='jennifer' and last_name='whalen');
相關文章
- 資料庫學習(三)基本查詢資料庫
- django對資料庫查詢基本方法Django資料庫
- 資料庫查詢資料庫
- 資料庫 - 資料查詢資料庫
- 資料庫資料的查詢----連線查詢資料庫
- 資料庫高階查詢之子查詢資料庫
- mysql資料庫基本命令MySql資料庫
- 求助:資料庫查詢資料庫
- ThinkPHP 資料庫查詢PHP資料庫
- 查詢資料庫大小資料庫
- 資料庫排序查詢資料庫排序
- Jemter查詢資料庫資料庫
- 資料庫 - 連線查詢、巢狀查詢、集合查詢資料庫巢狀
- 資料庫基礎查詢--單表查詢資料庫
- 資料庫查詢優化:巢狀查詢資料庫優化巢狀
- Postgres 資料庫(一)基本命令資料庫
- 資料庫查詢語句資料庫
- 資料庫查詢優化資料庫優化
- mysql資料庫多表查詢MySql資料庫
- mysql資料庫容量查詢MySql資料庫
- 資料庫查詢步驟資料庫
- 資料庫查詢配置值資料庫
- MySQL資料庫基礎——多表查詢:子查詢MySql資料庫
- MongoDB資料庫中查詢資料(下)MongoDB資料庫
- 基本的資料庫增刪改查資料庫
- SQL Server 跨資料庫查詢SQLServer資料庫
- SQLServer查詢所有資料庫大小SQLServer資料庫
- 【資料庫】MySQL查詢優化資料庫MySql優化
- 資料庫查詢慢的原因資料庫
- openguass 資料庫狀態查詢資料庫
- 資料庫中單表查詢資料庫
- 【資料庫】sql連表查詢資料庫SQL
- 查詢資料庫表是否存在資料庫
- 查詢資料庫中表的資訊資料庫
- 資料庫查詢語言(DQL)資料庫
- Prometheus時序資料庫-資料的查詢Prometheus資料庫
- 在MongoDB資料庫中查詢資料(上)MongoDB資料庫
- 資料庫全表查詢之-分頁查詢優化資料庫優化