?? 02. sql note.txt
字號:
?先登陸服務器: telnet 192.168.0.23 公帳號: openlab-open123 tarena-tarena
再進入SQL:sqlplus sd0807/sd0807 帳號:sd0807-密碼同樣 公帳號:openlab-open123
設置環境變量:
ORACLE_SID=oral10g\ --變局部變量
export ORACLE_SID --變全局變量
unset ORACLE_SID --卸載環境變量
ORACLE_HOME=... --安裝路徑;直接用一句語句也可以,如下
export ORACLE_HOME=/oracledata/.../bin:
一、注意事項:
大小寫不敏感,即不區分大小寫。提倡關鍵字大寫,便于閱讀和調式。
“!”在SQL環境下執行Unix命令。
SQL語句是由簡單的英語單詞構成;這些英語單詞稱為關鍵字/保留字,不做它用。SQL由多個關鍵字構成。
SQL語句由子句構成,有些子句是必須的,有些是可選的。
在處理SQL語句時,其中所有的空格都被忽略(空格只用來分開單詞,連續多個空格當一個用)。
SQL語句可以在一行上寫出,建議多行寫出,便于閱讀和調試。
多條SQL語句必須以分號分隔。多數DBMS不需要在單條SQL語句后加分號,但特定的DBMS可能必須在單條SQL語句后加分號。
SQL語句的最后一句要以 “;”號結束
二、寫子句順序
Select column,group_function
From table
[Where condition]
[Group by group_by_expression]
[Having group_condition]
……
[Order by column]; --最后
三、常用簡單語句:
clear screen:清屏
edit:編輯剛才的一句。
desc/describe:(列出所有列名稱)
用法: DESCRIBE [schema.]object[@db_link]
dual:亞表,臨時用。如:desc dual;/from dual;
rollback:回溯,回溯到上次操作前的狀態,把這次事務操作作廢,只有一次(DDL和DCL語句會自動提交,不能回溯)。
可以用commit語句提交,這樣就回溯不回了。
set pause on\off :設置分屏(設置不分屏)
set pause "please put an enter key" 且 set pause on:設置帶有提示的分屏
oerr ora 904 :查看錯誤
set head off :去掉表頭
set feed off :去掉表尾
保存在oracle數據庫中的所有操作細節:
spool oracleday01.txt :開始記錄
spool off :開始保存細節
四、SELECT語句:選擇操作、投影操作。
select:從一個或多個表中檢索一個或多個數據列。包含信息:想選擇什么表,從什么地方選擇。必須要有From子句。(最常用)
當從多張表里查詢的時候,會產生笛卡爾積;可用條件過濾它。
當兩個表有相同字段時必須加前綴,列名前需加表名和“.”,如“s_emp.id”。
1、用法:SELECT columns,prod2,prod3<列> FROM Table1,table2<表名> 分號結束
如: select id from s_emp;
select last_name,name from s_emp,s_dept where s_emp.dept_id=s_dept.id;--列表每人所在部門
SELECT * FROM Products; --檢索所有列。
數據太多時,最好別使用上句,會使DBMS降低檢索和應用程序的性能。(*通配符)
2、對數據類型的列可進行運算(如加減乘除)。
3、對列起別名:有直接起別名,加AS起別名,用雙引號起別名等三種方法
(單引號,引起字符串;雙引號,引起別名。起別名有符號,或者區分大小寫時,必須用雙引號)
多表查詢時,可給表起別名。(給列起別名,列<空格>列別名;給表起別名,表<空格>表別名;)。
如:Select first_name EMPLOYEES, 12*(salary+100) AS MONEY, manager_id "ID1" From s_emp E;
4、字段的拼接,可用雙豎線(雙豎線只能用于select語句里)。不同的DBMS可能使用不同的操作符;拼接的字段同樣可以起別名。
如:Select first_name ||' '|| last_name || ', '|| title "Employees" From s_emp;
排他鎖:Select id,salary From s_emp where id=1 For Update;
可以阻止他人并發的修改,直到你解鎖。
如果已有鎖則自動退出:Select id,salary From s_emp where id=1 For Update NoWait;
FOR UPDATE :可以再加 OF 精確到某格。如: ... For Update OF salary ...
注意要解鎖。
五、ORDER BY 子句,排序
Order by:按某排序列表(默認升序 asc,由低到高;可加 desc,改成降序由高到低)
檢索返回數據的順序沒有特殊意義,為了明確地排序用 SELECT 語句檢索出的數據,可使用 ORDER BY 子句。
ORDER BY 子句取一個或多個列的名字。
對空值,按無窮大處理(升序中,空值排最后;降序中排最前)。
1、用法:Select prod_id,prod_price,prod_name From Products Order By prod_price,prod_name;
(從左到右執行排序,先排price)
ORDER BY子句中使用的列將是為顯示所選擇的列,但是實際上并不一定要這樣,用非檢索的列排序數據是完全合法的。
為了按多個列排序,列名之間用逗號分開。
2、支持按相對列位置進行排序。
輸入 SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY 2,3 --(2指price,3指name)
3、升序、降序。默認是升序(asc,從小到大排序),想降序時用desc。
如:SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price DESC;
注意:DESC 關鍵字只應用到直接位于其前面的列名。如果想在多個列上進行排序,必須對每個列指定DESC關鍵字。
升序是默認的,可不寫,但降序必須寫。
六、WHERE子句,選擇、過濾
其后只能跟邏輯語句,返回值只有ture或false
如: select last_name,salary from s_emp where salary=1000;--找出工資1000的人
WHERE子句操作符:
1、邏輯比較運算符
= 等于
!= 不等于,還有(<> ^= 這兩個同樣表示不等于)
> 大于
>= 大于等于
< 小于
<= 小于等于
2、SQL 比較運算符
between…and… :在兩者之間。(BETWEEN 小值 AND 大值)
如:select last_name,salary from s_emp where salary between 1000 and 1500;
--工資1000到1500的人,包括1000和1500。
in(列表):在列表里面的。
如:select last_name,dept_id from s_emp where dept_id in(41,42);第41、42部門的人
like : 包含某內容的。模糊查詢
可以利用通配符創建比較特定數據的搜索模式,通配符只能用于文本,非文本數據類型不能使用通配符。
通配符在搜索模式中任意位置使用,并且可以使用多個通配符。
通配符%表示任何字符出現任意次數;還能代表搜索模式中給定位置的0個或多個字符。下劃線匹配單個任意字符。
如:select table_name from user_tables where table_name like 'S\_%' escape'\';
' 找出“S_“開頭的,由于下劃線有任意字符的含義,故需另外定義轉移符。
但習慣用“\”,為方便其他程序員閱讀和檢測,一般不改用其他的。
like 'M%':M開頭的 like '_a%':第二個字符是a的 like '%a%'所有含a的
(“_”表示一個任意字符;“%”表示任意多個任意字符。)
單引號里面的內容,大小寫敏感。單引號用來限定字符串,
如果將值與串類型的列進行比較,則需要限定引號;用來與數值列進行比較時,不用引號。
is null:是空。(NULL表示不包含值。與空格、0是不同的。)
如:SELECT prod_name,prod_price FROM Products WHERE prod_price IS NULL;
七、高級檢索(邏輯運算符):
通常我們需要根據多個條件檢索數據。可以使用AND或OR、NOT等連接相關的條件
計算次序可以通過圓括號()來明確地分組。不要過分依賴默認計算次序,使用圓括號()沒有壞處,它能消除二義性。
and:條件與
如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 AND vend_id=‘DELL’
or:條件或 (注: and 的優先級比 or 更高,改變優先級可用括號)
如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 OR vend_id=‘DELL’
not:條件非。否定它之后所跟的任何條件
否定的SQL 比較運算符: NOT BETWEEN; NOT IN; NOT LIKE; IS NOT NULL:
(注意,按英語習慣用 is not,而不是 not is)
NOT 與 IN 在一起使用時,NOT 是找出與條件列表不匹配的行。
IN 列表里有 NULL 時不處理,不影響結果;用 NOT IN 時,有 NULL 則出錯,必須排除空值再運算。
in :選擇列表的條件
使用IN操作符的優點: 在長的選項清單時,語法直觀; 計算的次序容易管理;
比 OR 操作符清單執行更快;最大優點是可以包含其他 SELECT 語句,使用能夠動態地建立 WHERE 子句。
如 SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id IN(‘DELL’,’RBER’,’TTSR’);
八、單行函數:
函數一般在數據上執行,它給數據的轉換和處理提供了方便。不同的DBMS提供的函數不同。
函數可能會帶來系統的不可移植性(可移植性:所編寫的代碼可以在多個系統上運行)。
加入注釋是一個使用函數的好習慣。
大多數SQL實現支持以下類型的函數: 文本處理, 算術運算, 日期和時間, 數值處理。
Null:空值
空值當成無窮大處理,所有空值參與的運算皆為空。
空值與空值并不相等,因為空值不能直接運算。
如:prod_price="" 這種寫法是錯的(不要受到corejava的影響)
prod_price=NULL 這種寫法是錯的(不要受到corejava的影響)
prod_price IS NULL 這種寫法才是對的
NVL:處理空值,把空值轉化為指定值。可轉化為日期、字符、數值等三種(注意:轉化時,兩參數必須要同類型)
如:NVL(date, '01-JAN-95') NVL(title,'NO Title Yet') NVL(salary,0)
錯誤寫法:
Select last_name,title,salary*commission_pct/100 COMM From s_emp;--沒提成的人沒法顯示工資
正確寫法:
Select last_name,title,salary*NVL(commission_pct,0)/100 COMM From s_emp;--把提成是空值的轉化為0
DISTINCT:過濾重復
把重復的行過濾掉;多個字段組合時,只排除組合重復的。
DISTINCT必須使用列名,不能使用計算或者表達式。
所有的聚合函數都可以使用。如果指定列名,則DISTINCT只能用于COUNT(列名),DISTINCT不能用于COUNT(*)。
如:Select Distinct name From s_dept; Select Distinct dept_id,title From s_emp;
文本處理:
TRIM()/LTRIM()/RTIRM():去空格。只能去掉頭和尾的空格,中間的不理。
trim(' heo Are fdou ') --> heo Are fdou
輸入:select trim(' heo Are fdou ') from dual; -->:heo Are fdou
LOWER:轉小寫
lower('SQL Course') --> sql course
UPPER:轉大寫
upper(' SQL Course') --->SQL COURSE
INITCAP:首字母轉大寫,其余轉小寫
initcap(SQL Course') '--> Sql Course
CONCAT:合成。雙豎線只能在select語句里面用,這個可用于任何語句。
Concat('Good','String') --> GoodString
SUBSTR:截取。
Substr('String', 1 ,3) --> Str
第一個數字“1”,表示從第幾個開始截取;若要從倒數第幾個開始,用負數,如“-2”表示倒數第2個。
上式中第2個數字“3”表示截取多少個。
LENGTH:統計長度。
Length('String') --> 6
NVL:轉換空值
日期和時間處理:
Oracle日期格式:DD-MMM-YYYY (D代表日期date,M代表月month,Y代表年year)
如:SELECT prod_name (DAY表示完整的星期幾,DY顯示星期的前三個字母)
FROM Products
WHERE prod_time BETWEEN
to_date(’01-JAN-2008’)
AND to_date(’31-DEC-2008’);
日期可以進行加減,默認單位是1天。日期與日期可以相減,得出天數;日期與日期但不能相加。
sysdate -> 系統的當天
Months_Between('01-Sep-95','11-Jan-94') --> 19.774194 相差多少個月,Between里面也可以填函數。
Add_months('11-Jan-94',6) --> 11-Jul-94 增加多少個月
Next_day('01-Sep-95','Friday') --> '08-Sep-95' 下一個星期五。其中的'Friday'可用6替代,因為星期日=1
Last_day('01-Sep-95') --> '30-Sep-95' 這個月的最后一天
數值處理:可以運用于代數,三角,幾何
ROUND:四舍五入
Round(45.925,2) -> 45.93 Round(45.925,0) -> 46 Round(45.925,-1) -> 50
逗號前一個數是要處理的數據源,后一個參數表示保留多少位小數。
后一參數是負數時,表示舍去小數點前的幾位,例3是舍去個位及其后的。不寫后一參數時,默認不保留小數。
TRUNC:舍去末位。直接舍去,不會進位。
Trung(45.925,2) -> 45.92 Trung(45.925,2) -> 45.92 Trung(45.925,2) -> 45.92
日期的舍取:
常用的數值處理函數有:
ABS() 絕對值 ABS(-5741.5854) --> 5741.5854
PI() 圓周率 注意:oracle中不支持 PI()函數;MYSql 支持PI()函數。
SIN() 正統值 Oracle還支持COS()、ASIN()、ACOS()函數
SQRT() 平方根
轉化:
TO_CHAR(number,'fmt'):把數值轉換成字符串
顯示數字的命令
9:正常顯示數字;
0:顯示包括0的數值形式,空位強制補0;
$:以美元符號顯示貨幣;
L:按當前環境顯示相關的貨幣符號;
. 和,:在固定位置出現“.”點 和“,”逗號;不夠位時,四舍五入。
例題:SQL> select 'Order'||To_char(id)||
2 'was filled for a total of'
3 ||To_char(total,'fm$9,999,999')
4 from s_ord
5 where ship_date ='21-SEP-92';
TO_NUMBER(char):把字符轉換成數字
九、鏈接
內鏈接:嚴格匹配兩表的記錄。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -