數據庫——Oracle(增刪改查,單行函數,多行函數,多表查詢)

Oracle簡介

一、sqlplus鏈接遠程Oracle命令sql

sqlplus(須要設置環境變量) scott(用戶名)/5456(密碼)@192.168.230.128:1521(IP)/orcl(數據庫名)  -- 若是是本地的Oracle,@後面的不用寫數據庫

二、查看當前用戶函數

show user  -- sqlplus命令優化

三、查看當前用戶下的表spa

select * from tab;3d

四、執行上一條SQL語句code

/  -- sqlplus命令orm

一、基本查詢

1)查看員工表結構——descblog

desc emp;排序

2)查詢員工表中的數據

select * from emp;

eg.查詢員工表中的員工號,姓名,月薪,年薪(月薪*12)

SELECT EMPNO,ENAME,SAL,SAL*12 FROM EMP;

3)取別名的3種方式

/**
 * 取別名的3種方式:
 * 1.加不加as是同樣的
 * 2.若是起的別名中沒有特殊字段,能夠不用加""
 */
SELECT
	EMPNO "員工id",
	ENAME AS "員工姓名",
	SAL 月薪,
	SAL * 12 "年   薪",		-- 有空格,要加""
	NVL( COMM, 0 ) "獎select金",	-- 有特殊字段,要加""
	SAL * 12+NVL ( COMM, 0 ) 年收入 
FROM
	EMP;

4)去重——distinct

SELECT DISTINCT
	JOB,
	EMPNO 
FROM
	EMP;	-- 去重,distinct修飾的後面的全部字段(JOB和EMPNO二者搭配不重複),只要字段們不重複就展現

5)字符串鏈接

鏈接符 「||」

/**
 * 字符串鏈接
 * MySQL版:select concat('hello',' world');	-- 要用 單引號(單引號表示日期和字符串,雙引號表示列的別名)
 * Oracle版:select concat('hello',' world') from dual;	-- 若是前面的操做,和任何表都沒有關係就用dual表(僞表)
 *			 select 'hello' || ' world' from dual;
 */

6)排序

order by後面能夠+列、表達式、別名、序號

SELECT
	EMPNO,
	ENAME,
	SAL,
	SAL * 12 "年薪" 
FROM
	EMP 
ORDER BY
	"年薪",  -- 咱們還可使用列號來代替字段,好比此處就能夠寫4(第4列)
	SAL;-- 多個列排序,order by先按照第一個排序,在按照後面的列排序

desc只做用於離他最近的字段

SELECT
	EMPNO,
	ENAME,
	SAL,
	SAL * 12 "年薪" 
FROM
	EMP 
ORDER BY
	EMPNO,
	"年薪" desc;	-- desc只做用於離他最近的字段

空值的5大特性

1)包含null的表達式結果都爲null

SELECT
	EMPNO,
	ENAME,
	SAL,
	SAL * 12,
	COMM,
	SAL * 12+COMM
FROM
	EMP;

此時咱們須要一個方法NVL

nvl(a,b)   -- 判斷a是否爲null,若是爲null則取b的值

修改後的:

SELECT
	EMPNO,
	ENAME,
	SAL,
	SAL * 12,
	NVL(COMM, 0),
	SAL * 12+NVL(COMM, 0)
FROM
	EMP;

2)null永遠不爲null

空值是無效的,未指定的,未知的或不可預知的值;空值不是0或者空格

SELECT
	* 
FROM
	EMP 
WHERE
	COMM IN ( 300, 500, NULL );

3)若是集合中含有null,不能使用not in,可使用in

SELECT
	* 
FROM
	EMP 
WHERE
	COMM NOT IN ( NULL );

 

4)null值的排序問題

SELECT
	* 
FROM
	emp 
ORDER BY
	COMM DESC;  -- 緣由:在Oracle中,空值最大

爲了讓null值放到最後,採用nulls last進行操做:

SELECT
	* 
FROM
	emp 
ORDER BY
	COMM DESC NULLS LAST;

5)分組/多行/組函數會自動濾空

SQL與SQLPLUS

SQL優化

1.*和列名,儘可能使用列名  -- 列名:減小了分析過程
2.where解析順序是從右-->左,儘可能把假的放前面

二、條件查詢

使用where語句對查詢結果進行過濾

1)非空和空的限制

  • 非空:is not null
  • 爲空:is null

eg.查詢每月能獲得獎金的僱員

SELECT
	* 
FROM
	EMP 
WHERE
	comm IS NOT NULL;

2)範圍限制

優先級問題

eg1.查詢基本工資大於1500可是小於3000的所有僱員

SELECT * FROM EMP WHERE SAL>1500 AND SAL<3000;

  或

SELECT * FROM EMP WHERE SAL BETWEEN 1500 AND 3000; -- 這種方式包括1500和3000

eg2.查詢1981-1-1到1981-12-31入職的僱員(between and還能夠用於日期的區間

SELECT
	* 
FROM
	EMP 
WHERE
	HIREDATE BETWEEN to_date( '1981-1-1', 'yyyy-mm-dd' ) 
	AND to_date( '1981-12-31', 'yyyy-mm-dd' );	-- 字符串==>日期

eg3.查詢僱員編號爲7369,7499,7521的僱員標號的具體信息

SELECT * FROM EMP WHERE EMPNO IN (7369,7499,7521);

3)模糊查詢

SQL中採用LIKE關鍵字表示模糊查詢,它有如下通配符:

  • 「%」:能夠匹配任意長度的內容
  • 「_」:匹配一個長度的內容

eg.查詢僱員名中第二個字符包含M的僱員

SELECT * FROM EMP WHERE ENAME LIKE '_M%';

三、單行函數

1)字符函數

轉小寫——lower

SELECT
	LOWER( 'HELLO,WORLD' ) 轉小寫 
FROM
	dual;

轉大寫——upper

SELECT
	UPPER( 'hello,world' ) 轉大寫 
FROM
	dual;

首字母大寫——initcap

SELECT
	initcap( 'hello,world' ) 首字母大寫 
FROM
	dual;
>> Hello,World

取子串——substr

SELECT
	substr( 'Hello World', 4 ) 子串 
FROM
	dual;--substr(a,b) 從a中,第b位開始取
	
SELECT
	substr( 'Hello World', 4, 3 ) 子串 
FROM
	dual;--substr(a,b,c) 從a中,第b位開始取,取c位

取字符數與字節數——length,lengthb

SELECT
	length( 'Hello 中國' ) 字符,	-- 8
	lengthb ( 'Hello 中國' ) 字節  -- 10
FROM
	dual;

在a中,查找b的位置——instr

SELECT
	instr( 'Hello World', 'lo' ) 位置 
FROM
	dual;
>>3

左填充與右填充——lpad,rpad

SELECT
	lpad( 'abcd', 10, '*' ) 左,
	rpad( 'abcd', 10, '*' ) 右 
FROM
	dual;

>>左:******abcd,右:abcd******

去掉先後指定的字符

SELECT
	trim( 'H' FROM 'Hello WorldH' ) 
FROM
	dual;
>>ello World

替換——replace

SELECT REPLACE
	( 'Hello World', 'l', '*' ) 
FROM
	dual;
>>He**o Wor*d

2)數值函數

四捨五入——round(數字+日期)

SELECT
	round( 45.926, 2 ) 一,
	round( 45.926, 1 ) 二,
	round( 45.926, 0 ) 三,
	round( 45.926,- 1 ) 四,
	round( 45.926,- 2 ) 五 -- round(55.926,-2) ==> 100
FROM
	dual;

        一         二         三         四         五                          
---------- ---------- ---------- ---------- ----------                          
     45.93       45.9         46         50          0  

SELECT
	round( SYSDATE, 'month' ),	-- 時間按月來4舍5入
	round( SYSDATE, 'year' ) 	-- 按年來4舍5入
FROM
	dual;

>>2018-05-01 00:00:00	2018-01-01 00:00:00

截斷——trunc

SELECT
	trunc( 45.926, 2 ) 一,
	trunc( 45.926, 1 ) 二,
	trunc( 45.926, 0 ) 三,
	trunc( 45.926,- 1 ) 四,
	trunc( 45.926,- 2 ) 五
FROM
	dual

        一         二         三         四         五                          
---------- ---------- ---------- ---------- ----------                          
     45.92       45.9         45         40          0

3)日期函數

顯示當前時間

SELECT SYSDATE 
FROM
	dual;

>>2018-05-01 15:10:03

格式化時間(日期-->字符串)

SELECT
	to_char( SYSDATE, 'yyyy-mm-dd hh24:mi:ss' ) 
FROM
	dual;

>>2018-05-01 15:10:43

eg.打印昨天,今天,明天

SELECT
	( SYSDATE - 1 ) 昨天,
	SYSDATE 今天,
	( SYSDATE + 1 ) 明天 
FROM
	dual;

昨天           今天           明天                                              
-------------- -------------- --------------                                    
28-9月 -16     29-9月 -16     30-9月 -16

eg.計算員工的工齡:天,星期,月,年

SELECT
	ename,
	hiredate,
	( SYSDATE - hiredate ) 天,
	( SYSDATE - hiredate ) / 7 星期,
	( SYSDATE - hiredate ) / 30 月,
	( SYSDATE - hiredate ) / 365 年 
FROM
	emp;

返回兩個日期之間的月份數

-- 查詢ename的入職時間,與當前時間相差幾個月

SQL> select months_between(sysdate,hiredate) from emp where ename='FORD';

MONTHS_BETWEEN(SYSDATE,HIREDATE)
--------------------------------
                       439.12001

					   
-- 查詢系統時間與指定字符串(必須按照這個格式寫,固然能夠修改Oracle的日期格式)相差幾個月
					   
SQL> select months_between(sysdate,'06-6月-18') from emp where ename='FORD';

MONTHS_BETWEEN(SYSDATE,'06-6月-18')
-----------------------------------
                                  1

計算當前系統時間加上53個月後的日期

SELECT
	add_months( SYSDATE, 53 ) 
FROM
	dual;
>>2022-10-01 15:41:31

本月的最後一天

SELECT
	last_day( SYSDATE ) 
FROM
	dual;

>>2018-05-31 15:42:53

獲取下個星期三的日期

SELECT
	next_day( SYSDATE, 'wed' ) -- 下個星期三的日期
FROM
	dual;

select next_day(sysdate,'星期五') from dual;  -- 牛B:居然能夠用中文

NEXT_DAY(SYSDA
--------------
13-7月 -18

4)轉換函數

TO_CHAR

a.日期到字符串的轉換

TO_CHAR(date,'format_model')

SELECT
	EMPNO,
	ENAME,
	TO_CHAR( HIREDATE, 'YYYY"年"MM"月"DD' ) -- 日期轉字符串
FROM
	emp;

b.數字到字符串的轉換

TO_CHAR(number,'format_model')

SELECT
	EMPNO,
	ENAME,
	TO_CHAR(SAL,'$99,999') -- 格式化成的字符串格式
FROM
	emp

TO_NUMBER 將字符串轉換成數值

SELECT
	TO_NUMBER('10')
FROM
	dual

TO_DATE 將字符串轉換成日期格式

SELECT
	TO_DATE('1985-04-22', 'YYYY-MM-DD')-- 之後面的格式進行轉換
FROM
	dual

5)通用函數

NVL(a,b):判斷a是否爲空,爲空返回b,不爲空返回a

NVL2(a,b,c):當a=null時,返回c,不然返回b

NULLIF(a,b):a和b的值相等時,返回null;不然返回a

COALESCE(a,b,c,...):從左往右找到第一個不爲空的值

6)條件表達式

條件表達式就是SQL中的判斷,他有如下兩種實現方式:

  • CASE表達式,SQL99語法,較複雜(MySQL等均可以用)
  • DECODE函數,Oracle的方法

eg.實現給員工漲工資,總裁1000 經理800 其餘400

CASE表達式版

SELECT
	ename,
	job,
	sal 漲前,
	CASE
			job WHEN 'PRESIDENT' THEN sal + 1000   
					WHEN 'MANAGER' THEN sal + 800 
					ELSE sal + 400 
	END 漲後 
FROM
	emp;

上面的至關於等號,這個至關於範圍

DECODE函數版

SELECT
	ename,
	job,
	sal 漲前,
	decode( job, 'PRESIDENT', sal + 1000, 'MANAGER', sal + 800, sal + 400 ) 漲後 
FROM
	emp;

四、多行/(分)組函數

1)統計記錄數——count()

2)最小值查詢——min()

3)最大值查詢——max()

4)查詢平均值——avg()

5)求和函數——sum()

 6)分組查詢——group by

 

having後面的條件能夠加多行函數 

SELECT
	DEPTNO,
	MIN( SAL ) 
FROM
	EMP 
GROUP BY
	DEPTNO 
HAVING
	MIN( SAL ) > 900;

五、多表查詢

笛卡爾積

Oracle鏈接條件的類型

  • 等值鏈接
  • 不等值鏈接
  • 外鏈接
  • 自鏈接

查詢語法

內鏈接

外鏈接

左鏈接

相關文章
相關標籤/搜索