1. 程式人生 > >Java 8---SELECT簡單查詢

Java 8---SELECT簡單查詢

導讀

1.簡單單表查詢
2.查詢子句之ORDER BY:排序
3.查詢子句之WHERE:條件子句

資料庫指令碼檔案:
	字尾:sql
	註釋:--
	
	可以把各個物件的建立(表,序列等),以及資料的新增放到一個指令碼中
	執行指令碼:
		方式1:start 指令碼路徑   注意:start後面要跟一個空格
		方式2:@指令碼路徑        注意:@後面不需要空格
		
		從指令碼的上面到下面逐行執行,一行出錯,後面繼續執行
				
	如果執行指令碼錯誤,建議先刪除使用者,重新建立後再執行指令碼
	管理員刪除使用者:DROP USER 使用者名稱 CASCADE;

簡單單表查詢

語法:
	1)SELECT 列名1,列名2,...,列名n
	  FROM 表名;
	  
	  從某張表查詢指定的列

注意:

		1.執行流程
			FROM,確定資料來源-->SELECT,確定哪些列
		2.如果查詢的是一個表的全部列,可以用*代替,
		  查詢出來的列順序與定義時一直,可讀性不高,不建議使用
		3.查詢時,數值型,日期型可以做算術運算,+,-,*,/
eg3:查詢每個員工如果加薪1000後的薪資
		SELECT id,salary+1000
		FROM s_emp;
4.關於空值:代表的是未知的,不確定的,沒有值	
		空值運算後結果還是空值
		空值轉換函式:
			  數值型列:NVL(列,數值)  :如果這個列值為空,則用這個數值代替
			  文字型列:NVL(列,'文字'):如果這個列值為空,則用這個文字代替
eg4:求每個員工包含提成後的月工資總額
		SELECT id,salary*(1+NVL(commission_pct,0)/100)
		FROM s_emp;
5.查詢時可以給查詢的列或表示式取別名
			SELECT 列名 [AS] 別名,列名...
			FROM 表名;
		  別名如果需要保持原來的大小寫,或者別名中包含一些特殊字元,比如空格可以用雙引號括起來
eg5:求每個員工包含提成後的月工資總額,取別名為sal
		SELECT id,salary*(1+NVL(commission_pct,0)/100) AS sal
		FROM s_emp;
		
		SELECT id,salary*(1+NVL(commission_pct,0)/100) AS "sal"
		FROM s_emp;
6.查詢某個列時,查詢去重後的結果,distinct
eg6:查詢公司的所有部門名,相同的只保留一份
		SELECT DISTINCT name
		FROM s_dept;
查詢補充:
	可以直接查詢一個常量或者常量表達式:
		SELECT 1+2 FROM dual;(查詢結果就是1+2的結果3)
	此時,為了滿足SELECT...FROM...,FROM 後面跟的dual,可以稱它為虛表
		SELECT sysdate FROM  dual;
		sysdate:當前系統時間,date型別
	所以dual的作用就是查詢某些表示式的結果或者某些函式的作用

查詢子句之ORDER BY:排序

語法:
	SELECT ...
	FROM ...
	ORDER BY 列名 ASC|DESC,列名 ASC|DESC ...;

注意:

		1.執行流程:FROM->SELECT,此時確定了結果集->ORDER BY把資料改變位置,排序
		2.ASC:升序,DESC:降序,省略預設是升序
		3.按照多列排序,首先先按照第一列排序,如果第一列相等再按第二列排序...
		4.null值預設為最大
		5.ORDER BY子句永遠在查詢的最後,排序永遠是最後執行
eg1:查詢每個員工的編號,名字,部門編號,並按照部門編號升序排序
		SELECT id,first_name,dept_id
		FROM s_emp
		ORDER BY dept_id ASC;

		SELECT id,first_name,dept_id
		FROM s_emp
		ORDER BY dept_id DESC;

		SELECT id,first_name,dept_id
		FROM s_emp
		ORDER BY dept_id;
		
	eg2:查詢每個員工的編號,名字,部門編號,薪資,要求按照部門編號升序排序,
		如果部門相同,則按照薪資降序排序
		SELECT id,first_name,dept_id,salary
		FROM s_emp
		ORDER BY dept_id ASC,salary DESC;

在這裡插入圖片描述

查詢子句之WHERE:條件子句

語法:
	SELECT
	FROM
	WHERE 條件
	ORDER BY;

注意:

		1.執行流程:FROM,確定表->WHERE,確定表的行->SELECT,確定列,結果集確定->ORDER BY,排序
		2.WHERE子句緊跟在FROM子句之後
		3.WHERE篩選,逐行判斷,如果當前行條件滿足,則結果集中包含,否則不包含
		4.條件中的運算子:
			比較運算子:
				>,>=,<,<=,=(等於),!=,<>(不等於)
				BETWEEN...AND...:在...和...之間, 閉區間
				IN,  IN(點值1,點值2,...)
				IS NULL:是空的,空代表未知的,不確定的,不能用=判斷
				LIKE:用來模糊查詢的
					萬用字元:
						%:可以代表任意的0個或多個字元
					    _:可以代表任意1個字元
					如果需要%,_表示原本的含義,可以利用escape指定轉義字元
					eg:查詢以_a開頭的名字
						SELECT first_name
						FROM s_emp
						WHERE first_name LIKE '\_a%' escape '\';(表示以_a開頭的名字,轉義字元只對其後緊挨著的一個字元有效)
				NOT BWTWEEN...AND...:不在...和...之間
				NOT IN
				IS NOT NULL:不是空的
				NOT LIKE
				
			邏輯運算子:
				NOT:非  取反
				AND:與,都成立,結果才成立
				OR:或,只要有一個成立,結果就成立	
				
				優先順序:NOT>AND>OR
				
			拼接:||
	
eg1:查詢出所有薪資高於1200的員工編號,薪資
	SELECT id,salary
	FROM s_emp
	WHERE salary>1200;
	
	eg2:查詢薪資在1100到1450之間的所有員工編號,名字,薪資
	SELECT id,first_name,salary
	FROM s_emp
	WHERE salary BETWEEN 1100 AND 1450;
	
	eg3:查詢部門編號為41或44或45的所有員工編號,部門編號
	SELECT id,dept_id
	FROM s_emp
	WHERE dept_id IN(41,44,45);
	
	eg4:查詢沒有提成的員工的編號,名字
	SELECT id,first_name
	FROM s_emp
	WHERE commission_pct IS NULL;
	
	
	eg5:查詢以a結尾的名字
	SELECT id,first_name
	FROM s_emp
	WHERE first_name LIKE '%a';
	
	'B%':以B開頭的
	'%b%':包含b的
	'_b%':第二個字元是b
	'_b':長度是2,第二個字元是b
		
	
	eg6:查詢薪資低於1000或者薪資高於1500的所有員工id,薪資
	SELECT id,salary
	FROM s_emp
	WHERE salary<1000 OR salary>1500;
	
	eg7:查詢在41或44號部門,並且薪資高於1100的員工id,薪資
	SELECT id,dept_id,salary
	FROM s_emp
	WHERE (dept_id=41 OR dept_id=44) AND salary>1100;
	
	
	eg8:查詢每個員工的姓名,顯示的格式為:名,姓
	SELECT first_name||','||last_name
	FROM s_emp;