上JavaSE高級編程時需要用到sql語句發(fā)現都忘了,抽時間簡單總結了一下。
一.基本概念:
數據庫:存放信息的倉庫,構造簡單,遵守規(guī)則.
關系型數據庫: 關系型數據庫的專長就是把分別放在兩個數據表中的數據聯系(相互匹配)起來,這種聯系是通過查找兩個數據表的共同元素來實現的
注意其中的數據聯系
? ? 衍生命題 關系數據庫和非關系型數據庫的對比。
表:數據庫里的數據都放在數據表(table)中. 由 行(row)和列(column)構成.
二.sql基礎語法
SQL語句語法沒有這么復雜,只要掌握好關鍵字的使用方法就好(閱讀即可,重點是掌握實際用法):
SELECT 、 FROM 、WHERE 、 GROUP BY、HAVING 、ORDER BY、INSERT 、UPDATE 、DELETE、CREATE、DROP、ALTER、GRANT、REVOKE
需要注意的點
1.在sql語句中,SQL關鍵字和函數名都要用大寫英文字母,而數據庫,數據表,數據列的名稱全部用小寫字母。
2.在語法描述時,【】方括號表示語法可選,可選內容以| 分隔 {}花括號表示必須出現,必須從其中選擇一個數據項.
【】方括號表示里面參數可選. | 豎線分割參數
{} 花括號內的內容是指必不可少的,
3.【①】是指執(zhí)行順序.
三.sql簡單查詢
整個SQL結構就是由若干個關鍵字所組成,所以掌握簡單查詢,也是關鍵字的使用.
所謂的簡單查詢就是指查詢一張數據表中所有數據行的內容.
【②】 SELECT [DISTINCT] * 列名稱 [別名],列名稱[別名],...
【①】FROM 表名稱 [別名];
在以上的結構之中,首先執(zhí)行的是FROM子句,因為必須通過FROM子句確定數據的來源.而后要針對對于數據的篩選操作,那么就通過SELECT 子句完成.(很重要,數據來源)
如果是全部記錄指的就是所有的行和列的數據,簡單查詢是不能控制數據行的,只能夠在SELECT子句里面控制列,如果是全部的查詢咧,那么就使用通配符(星號)”*” 完成;
SELECT * FROM EMP(表名);? 查詢emp表中的全部記錄.
大概數據樣子是這種的
只想查詢幾個固定的列,所以在SELECT 子句之后要寫上具體的列名稱
SELECT empno,job,ename,sal FROM emp;? 查詢每個雇員的編號,姓名,職位,工資
四.去重(重復)關鍵字 DISTINCT - distinct
如果要想要去除掉所有的重復信息,那么可以使用’DISTINCT’,此選項只能夠出現在SELECT 子句的后面(重點1).
如果查詢的數據是多個列,那么只有在這多個列的數據都相同的時候才可以消除.(重點2)
? ? select? distinct job from emp; 去除掉重復的內容(job列)
五.別名
通過使用 SQL,可以為表名稱或列名稱指定別名。
基本上,創(chuàng)建別名是為了讓列名稱的可讀性更強(長名變短名,或者有意義的)。
或者是為了為通過查詢出來的復雜數據命名,使之可操作性更強
表和列都可以起別名
? SELECT column_name AS alias_name FROM table_name;? as關鍵字之后的就是列的別名(是單列,不是所有列)
? SELECT column_name(s) FROM table_name AS alias_name? 表別名-此用法開發(fā)中很少看到;
六.限定查詢(條件查詢)
很多時候并不需要查詢所有數據行內容,此時就可以通過WHERE子句來針對于要顯示的數據行進行篩選,而此時我們可以使用SQL語法結構變?yōu)槿缦率褂酶袷?
【③控制要顯示的數據列】SELECT [DISTINCT] * | 列名稱 [別名],列名稱 [別名]...
【① 確定數據來源】FROM 表名稱 [別名]
【② 確定滿足條件的數據行】[WHERE 過濾條件(s);]
如果要想實現限定查詢,那么需要掌握一系列的限定查詢的符號,有如下幾種:
? 關系運算符: >、 <、 >=、 <=、 <>(!=) ;
? 邏輯運算符:AND 、OR、NOT;
? 范圍運算符:BETWEEN...AND;
? 謂詞范圍: IN 、 NOT IN:
? 空判斷: IS NULL、IS NOT NULL
? 模糊查詢:LIKE.
6.1 關系運算符
關系運算符主要進行大小關系比較操作使用的。
? ? select *
? ? FROM EMP
? ? WHERE SAL>1500;
? ? 要求查詢出所有基本工資高于1500的雇員信息
所有的過濾都是采用條件的形式進行過濾.
6.2 邏輯運算符
如果說現在有多個條件要進行連接,那么就需要根據要求選擇是與連接還是或連接;
? 與連接:所有的判斷條件都要滿足 AND 關鍵字
? 或連接:若干個條件有一個滿足即可 OR 關鍵字
查詢出工資范圍在1500-3000之間的雇員信息
? 條件一: sal>=1500;
? 條件二:sal<=3000;
? 關系:兩個條件必須同時滿足才可以顯示內容,所以使用 AND 連接.
? ? SELECT *
? ? FROM emp
? ? WHERE sal>=1500 AND sal<=3000;
在邏輯運算之中除了與和或的邏輯之外還會存在有非的邏輯,
非的邏輯是,如果條件的結果為真,那么非之后就是假,
反之,如果原始條件判斷的結果為假,那么結果就是真.
6.3 范圍查詢
在進行查詢條件過濾的時候可以針對與某一個范圍的數據進行過濾,使用的是BETWEEN...AND,語法:
BETWEEN 最小值(數字,日期) AND 最大值
在此處最小值(包含最小值)與最大值(包含最大值)之間的內容都滿足條件.
查詢工資在1500-2000之間的雇員,包含(1500,2000)
? ? SELECT *FROM emp WHERE sal>=1500 AND sal<=2000;
? ?
? ? SELECT *FROM emp WHERE sal BETWEEN 1500 AND 2000;
第一個查詢需要匹配兩個條件,而第二個查詢只需要匹配一個條件.
注意:在進行日期判斷時,我們不用BETWEEN .. AND 而用 > < 大與小于符號加 00:00:00 23:59:59秒判斷.(之后實例查詢演示)
6.4 空判斷
空在數據庫上解釋為不確定的內容,但是需要注意的是:如果在數字列上使用null,那么絕對不表示0. 對于null的判斷不能夠使用關系運算符完成.
空的操作只能夠使用IS NULL 或者是IS NOT NULL(NOT IS NULL)表示.
查詢所有領取傭金的雇員(傭金存在,不為空)
? ? SELECT * FROM emp WHERE? ? comm IS NOT NULL;
? ? SELECT * FROM emp WHERE? ? NOT comm IS NULL;
任何的數據庫,空的操作只能夠使用以上的兩個標記來判斷.
6.5 IN 操作符 和 NOT IN操作符
IN 操作符類似于BETWEEN....AND,
但是BETWEEN...AND是給了一個大的范圍,而IN給出的是一個指定的可選范圍.
要求查詢出雇員編號是7369,7566,7788,,9999的雇員信息.
? 如果不使用IN操作可以使用或操作:
? ? SELECT * FROM EMP
? ? WHERE? EMPNO=7369 OR EMPNO=7566 OR EMPNO=7788
? ? OR EMPNO=9999;
? 使用IN操作實現:
? ? SELECT * FROM EMP
? ? WHERE? EMPNO in(7369,7566,7788,9999);
在指定值查詢的過程之中,IN的操作是最簡短的.
既然在指定的范圍里面使用IN,,那么如果不在指定的范圍之中,可以使用NOT IN 操作.
查詢出雇員編號不是7369,7566,7788,,9999的雇員信息.
? ? SELECT * FROM EMP
? ? WHERE EMPNO NOT in(7369,7566,7788,9999);
注意:關于NOT IN和NULL的問題
正在使用NOT IN 進行范圍判斷的時候,如果范圍里面包含有NULL,那么不會有任何的結果返回.(好好研究以下邏輯)
使用IN操作中包含有NULL.
? ? SELECT * FROM EMP
?
? ? WHERE? EMPNO in(7369,7566,7788,null);
---含有null對結果沒有任何影響
實際上使用where最大的用處在于控制顯示的數據行,
再簡單一點:別顯示全部數據行(因為如果要顯示全部的數據行,幾乎是宣判了一個程序的死刑).
使用NOT IN的目的是為了查詢部分數據行
但是如果有了NULL(某些數據永遠不可能為空),就變成了查詢全部了.
6.6 模糊查詢:LIKE
用兩個通配符.
? “_” : 匹配任意的一位字符;
? “%” : 匹配任意的零位,一位或多位字符.
? ? SELECT * FROM EMP WHERE? ENAME LIKE 'A%'; 查詢姓名是以字母A開頭的雇員信息
注意:關于LIKE的兩點說明:
說明一:LIKE可以應用在各種數據類型上,不一定非要是字符串;
說明二:在使用LIKE模糊查詢的時候,如果不設置查詢關鍵字,那么表示查詢全部.
SELECT * FROM EMP WHERE? sal LIKE '%%';
雖然以上的代碼可以查詢全部數據,但是與不使用where子句相比,不使用where子句的查詢性能一定更好.
七.查詢排序
之前的查詢里面只使用了SELECT、FROM、WHERE,
但是如果需要針對于查詢后的結果按照指定的數據列進行排序操作,就必須使用ORDER BY 子句.
當使用查詢操作的時候,默認情況下他會按照數據的插入順序進行數據排序顯示.
如果要針對于指定的列內容實現排序,就必須使用 ORDER BY子句完成.
【③控制要顯示的數據列】SELECT [DISTINCT] * | 列名稱 [別名],列名稱 [別名]...
【①確定數據來源】FROM 表名稱 [別名]
【②確定滿足條件的數據行】[WHERE 過濾條件(s);]
【④針對查詢結果進行排序】[ORDER BY 字段 [ASC | DESC], 字段 [ASC | DESC], ... ]
ORDER BY 子句是在SELECT 子句之后執(zhí)行,而ORDER BY子句可以使用SELECT 子句定義的別名,
ASC (默認,不寫也是ASC):按照升序的方式排列
DESC:按照降序的方式排列
查詢所有的雇員信息,要求按照工資由高到低排序.
? SELECT * FROM emp ORDER BY sal DESC;
以上只是針對于一個字段的排序,那么也可以同時設置多個字段.
ORDER BY 子句既然在SELECT子句之后執(zhí)行,那么就可以使用SELECT 子句里面定義的別名.
此時的程序就可以正常的調用SELECT定義的別名.在整個SQL查詢結構之中,只有ORDER BY子句可以調用SELECT子句里面定義的別名. (一定要注意sql的執(zhí)行順序)
1、 使用ORDER BY查詢的時候,排序是在最后完成的;
2、 ORDER BY子句是最后一個執(zhí)行的子句;
3、 在ORDER BY之中可以設置多個排序的字段.
4、 ORDER BY 有兩種排序模式:ASC、DESC;
5、 ORDER BY 是唯一一個可以使用SELECT子句定義別名的子句.
.八.總結
簡單查詢是將一張表中所有數據行的內容都顯示出來;
在查詢語句之中先執(zhí)行FROM 子句確定數據來源(此時實際上是所有的行和列的數據), 而后利用SELECT子句可以控制要顯示的數據列;
如果出現數據的重復,可以使用DISTINCT 來消除重復的數據行顯示.
1 where子句一般都寫在from子句之后,但是是緊跟著from子句之后執(zhí)行的
2 where 子句控制顯示的數據行的操作,select子句控制著顯示數據列的操作.
? select子要落后于where 子句執(zhí)行,所以在select子句之中定義的別名,無法在where子句里面使用;
3 要求完整的掌握給出的各個限定查詢符號.
? 關系運算符: >、 <、 >=、 <=、 <>(!=) ;
? 邏輯運算符:AND 、OR、NOT;
? 范圍運算符:BETWEEN...AND;
? 謂詞范圍: IN 、 NOT IN:
? 空判斷: IS NULL、IS NOT NULL
? 模糊查詢:LIKE.
4 使用LIKE實現模糊查詢的時候,如果不設置關鍵字(%%)表示查詢全部.
5使用NOT IN 查詢時,查詢范圍里面不允許出現NULL,否則不會有任何查詢結果.
小結:
清楚學習過的每一個子句的作用: SELECT,FROM ,WHERE,ORDER BY ;
多個條件判斷的時候一定要使用邏輯連接,而且盡量使用”()”,做一個區(qū)分
以上有部分內容為借鑒...