posts - 1, comments - 0, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          SQL速查手冊

          Posted on 2006-08-03 08:35 張峰 閱讀(212) 評論(0)  編輯  收藏
          ●SQL定義:SQL是一種面向數(shù)據(jù)庫的通用數(shù)據(jù)處理語言規(guī)范,能完成以下幾類功能:提取查詢數(shù)據(jù),插入修改刪除數(shù)據(jù),生成修改和刪除數(shù)據(jù)庫對象,數(shù)據(jù)庫安全控制,數(shù)據(jù)庫完整性及數(shù)據(jù)保護(hù)控制。

          ●SQL分類:
          DDL—數(shù)據(jù)定義語言(CREATE,ALTER,DROP,DECLARE)
          DML—數(shù)據(jù)操縱語言(SELECT,DELETE,UPDATE,INSERT)
          DCL—數(shù)據(jù)控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)

          ●SQL數(shù)據(jù)類型
          CHAR():定長字符串 最大長度為 254
          VARCHAR():變長字符 最大長度為 4000
          SMALLINT:短整型數(shù)字 長度為 2 字節(jié)
          INTEGER:整型數(shù)字 長度為 4 字節(jié)
          REAL:單精度浮點(diǎn) 32 位近似值
          DOUBLE:雙精度浮點(diǎn) 64 位近似值
          DECIMAL(m,n):數(shù)字 精度為m小數(shù)位為n
          DATE:日期時(shí)間
          TIME:日期時(shí)間
          TIMESTAMP:日期時(shí)間

          ●數(shù)據(jù)庫定義語言:
          CREATE:用于創(chuàng)建數(shù)據(jù)庫對象。
          DECLARE:除了是創(chuàng)建只在過程中使用的臨時(shí)表外,DECLARE語句和CREATE語句非常相似。唯一可以被聲明的對象是表。并且必須放入用戶臨時(shí)表空間。
          DROP:可以刪除任何用CREATE(數(shù)據(jù)庫對象)和DECLARE(表)創(chuàng)建的對象。
          ALTER:允許修改某些數(shù)據(jù)庫對象的信息。不能修改索引。

          ●下面主要基于對象介紹基本的語法:

          1、數(shù)據(jù)庫:
          創(chuàng)建數(shù)據(jù)庫:CREATE DATABASE database-name [USING CODESET codeset TERRITORY territory]
          注:代碼頁的問題。
          刪除數(shù)據(jù)庫:drop database dbname

          2、表:
          ⑴創(chuàng)建新表:
          create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
          根據(jù)已有的表創(chuàng)建新表:
          A:create table tab_new like tab_old
          B:create table tab_new as select col1,col2… from tab_old definition only
          ⑵修改表:
          增加一個(gè)列:
          Alter table tabname add column col type
          注:列增加后將不能刪除。DB2中列加上后數(shù)據(jù)類型也不能改變,唯一能改變的是增加varchar類型的長度。添加主鍵:
          Alter table tabname add primary key(col)
          刪除主鍵:
          Alter table tabname drop primary key(col)
          刪除表:drop table tabname

          3、表空間:
          創(chuàng)建表空間:create tablespace tbsname pagesize 4k managed by database using (file ‘file’ size)
          表空間加入容器:alter tablespace tablespace_name add(file 'filename' size)
          注:該操作是不可逆的,加入容器后將不能將其刪除,因此在加入的時(shí)候注意。
          刪除表空間:drop tablespace tbsname

          4、索引:
          創(chuàng)建索引:create [unique] index idxname on tabname(col….)
          刪除索引:drop index idxname
          注:索引是不可更改的,想更改必須刪除重新建。

          5、視圖:
          創(chuàng)建視圖:create view viewname as select statement
          刪除視圖:drop view viewname
          注:視圖唯一能修改的是引用類型列,改變列的范圍。其他定義好了都不能修改。當(dāng)視圖基于的基表drop后,視圖變?yōu)闊o效。

          ●數(shù)據(jù)庫操縱語言:
          SELECT:從表中查詢符合數(shù)據(jù)
          DELETE:刪除已有表的數(shù)據(jù)
          UPDATE:更新已有表的數(shù)據(jù)
          INSERT:向已有表中插入數(shù)據(jù)

          1、select時(shí),注意索引謂詞和非索引謂詞,盡量在有索引的列上使用索引謂詞。
          謂詞類型 可索引 注 釋
          Col∝con Y ∝代表>,>=,=,<=,<,但是<>不是可索引的。
          Col between con1 and con2 Y 在匹配系列中必須是最后的。
          Col in list Y 僅對一個(gè)匹配列
          Col is null Y
          Col like ‘xyz%’ Y 模糊匹配%在后面。
          Col like ‘%xyz’ N 模糊匹配%在前面。
          Col1∝Col2 N Col1和col2來自同一個(gè)表
          Col∝Expression N 例如:c1(c1+1)/2
          Pred1 and Pred2 Y Pred1和Pred2都是可索引的,指相同索引的列
          Pred1 or Pred2 N 除了(c1=a or c1=b)外,他可以被認(rèn)為是c1 in(a,b)
          Not Pred1 N 或者任何的等價(jià)形式:Not between,Not in,Not like等等。

          使用索引的例子介紹:

          <1>、單個(gè)表上索引查詢的介紹 :
          A:select * from t1 where c1 = 10;
          在c1列上無索引,如何檢索
          在c1列上有索引,如何檢索
          B:select * from t1 where c1 =10 and c2 between 5 and 10 and c3 like ‘A%’
          僅在c1列上有索引
          在c1,c2和c3列上有單獨(dú)的索引
          在c1,c2和c3列上有聯(lián)合索引
          此處可以填加索引匹配規(guī)則和高級規(guī)則,比較難理解!!

          <2>、兩個(gè)或多個(gè)表上索引查詢的介紹:
          (1)、使用循環(huán)嵌套法執(zhí)行查詢
          A:select t1.c1,t1.c2,t2.c3,t2.c4 from t1,t2 where t1.c1=10 and t1.c2 =t2.c3
          介紹查詢的方法,看看哪列上最需要索引。
          B:select t1.c1,t1.c2,t2.c3,t2.c4 from t1,t2 where t1.c1=10 and t2.c4 = 10 and t1.c2 =t2.c3
          (2)、使用歸并連接執(zhí)行連接查詢
          例:select t1.c1,t1.c2,t2.c3,t2.c4 from t1,t2 where t1.c1=10 and t2.c4 = 10 and t1.c2 =t2.c3
          (3)、三個(gè)以上的表進(jìn)行連接查詢采取的規(guī)則或者方法

          (2)、GROUP BY:實(shí)現(xiàn)簡單分組的功能,當(dāng)用group by時(shí),查詢選擇列中除了在group by中出現(xiàn)的和常量外,其他的列上要用分組函數(shù)。可以使用一些分組函數(shù)實(shí)現(xiàn)一些列不在group by中出現(xiàn),min,max等。
          (3)、HAVING的使用,對一些分組列進(jìn)行條件判斷。
          (4)、ORDER BY子句使得SQL在顯示查詢結(jié)果時(shí)將各返回行按順序排列,返回行的排列順序由ORDER BY 子句指定的表達(dá)式的值確定。

          2、DELETE:從表中刪除記錄
          語法格式:
          DELETE FROM tablename WHERE (conditions)

          3、INSERT:向表中插入記錄
          語法格式:
          INSERT INTO tablename (col1,col2,…) VALUES (value1,value2,…);
          INSERT INTO tablename (col1,col2,…) VALUES (value1, value2,…), (value1, value2,…),……
          Insert不會(huì)等待任何程序,不會(huì)導(dǎo)致鎖定。

          4、UPDATE:
          語法格式:
          UPDATE tabname SET (col1=values1,col2=values2,…) WHERE (conditions);
          注:update的速度比較慢,要在相應(yīng)列上建立索引。

          ●數(shù)據(jù)控制語言

          GRANT—授予用戶權(quán)限
          REVOKE—撤消用戶權(quán)限
          COMMIT—提交事務(wù),可以使數(shù)據(jù)庫的修改永久化
          ROLLBACK—回滾事務(wù),消除上一個(gè)COMMIT命令后的所做的全部修改,使得數(shù)據(jù)庫的內(nèi)容恢復(fù)到上一個(gè)COMMIT執(zhí)行后的狀態(tài).。

          1、GRANT:所有著或者管理員把訪問權(quán)限賦給其他用戶
          語法格式:
          grant [all privileges|privileges,….] on tabname | viewname to [public|user,….]
          2、REVOKE:取消某一用戶的某中訪問權(quán)限
          語法格式:
          Revoke [all privileges|privileges,….] on tabname | viewname from [public|user,….]
          注:不能取消實(shí)例級別的用戶的任何權(quán)限,他們不是通過grant授權(quán)的,是通過組實(shí)現(xiàn)的權(quán)限。
          3、COMMIT:把事務(wù)中所做的修改永久化記錄到數(shù)據(jù)庫。
          語法格式:
          commit [work]
          4、ROLLBACK:將上次提交以來所做的更改全部撤消。
          語法格式:
          Rollback [work]

          ●高級SQL簡單介紹:

          一、查詢間使用運(yùn)算詞
          A: UNION 運(yùn)算符
          UNION 運(yùn)算符通過組合其他兩個(gè)結(jié)果表(例如 TABLE1 和 TABLE2)并消去表中任何重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 UNION 一起使用時(shí)(即 UNION ALL),不消除重復(fù)行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。

          B: EXCEPT 運(yùn)算符
          EXCEPT 運(yùn)算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 EXCEPT 一起使用時(shí) (EXCEPT ALL),不消除重復(fù)行。

          C: INTERSECT 運(yùn)算符
          INTERSECT 運(yùn)算符通過只包括 TABLE1 和 TABLE2 中都有的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 INTERSECT 一起使用時(shí) (INTERSECT ALL),不消除重復(fù)行。
          注:使用運(yùn)算詞的幾個(gè)查詢結(jié)果行必須是一致的。

          二、外連接
          A、left outer join:
          左外連接(左連接):結(jié)果集幾包括連接表的匹配行,也包括左連接表的所有行。
          B:right outer join:
          右外連接(右連接):結(jié)果集既包括連接表的匹配連接行,也包括右連接表的所有行。
          C:full outer join:
          全外連接:不僅包括符號(hào)連接表的匹配行,還包括兩個(gè)連接表中的所有記錄。

          注:復(fù)合外連接按照從左到右的順序執(zhí)行連接,左邊連接的結(jié)果集和右邊連接
          三、超級分組和移動(dòng)函數(shù)
          A:grouping sets:用來在單個(gè)sql中形成多級分組。
          例:select company_id,node_id,count(customer_id) from customer group by grouping sets(company_id,node_id)
          B:rollup:可以在單個(gè)數(shù)據(jù)庫操作中形成多個(gè)分組。
          例:select company_id,node_id,count(customer_id) from customer group by rollup(company_id,node_id)
          注:rollup操作不是可交換的操作,指定用戶組的順序是很重要的。
          C:cube: 生成分組表中分組的所有組合。
          例:select company_id,node_id,count(customer_id) from customer group by cube(company_id,node_id)
          D:over:移動(dòng)函數(shù)可以幫助實(shí)現(xiàn)移動(dòng)的數(shù)據(jù)分析
          Select date,avg(qty) over(order by date rows between 1 preceding and 1 following) as values from sale

          附錄:常用函數(shù)介紹
          1、類型轉(zhuǎn)化函數(shù):
          轉(zhuǎn)化為數(shù)字類型的:
          decimal, double, Integer, smallint,real
          Hex(arg):轉(zhuǎn)化為參數(shù)的16進(jìn)制表示。
          轉(zhuǎn)化為字符串類型的:
          char, varchar
          Digits(arg):返回arg的字符串表示法,arg必須為decimal。
          轉(zhuǎn)化為日期時(shí)間的:
          date, time,timestamp
          2、時(shí)間日期:
          year, quarter, month, week, day, hour, minute ,second
          dayofyear(arg):返回arg在年內(nèi)的天值
          Dayofweek(arg):返回arg在周內(nèi)的天值
          days(arg):返回日期的整數(shù)表示法,從0001-01-01來的天數(shù)。
          midnight_seconds(arg):午夜和arg之間的秒數(shù)。
          Monthname(arg):返回arg的月份名。
          Dayname(arg):返回arg的星期。
          3、字符串函數(shù):
          length,lcase, ucase, ltrim, rtrim
          Coalesce(arg1,arg2….):返回參數(shù)集中第一個(gè)非null參數(shù)。
          Concat (arg1,arg2):連接兩個(gè)字符串a(chǎn)rg1和arg2。
          insert(arg1,pos,size,arg2):返回一個(gè),將arg1從pos處刪除size個(gè)字符,將arg2插入該位置。
          left(arg,length):返回arg最左邊的length個(gè)字符串。
          locate(arg1,arg2,<pos>):在arg2中查找arg1第一次出現(xiàn)的位置,指定pos,則從arg2的pos處開始找arg1第一次出現(xiàn)的位置。
          posstr(arg1,arg2):返回arg2第一次在arg1中出現(xiàn)的位置。
          repeat(arg1 ,num_times):返回arg1被重復(fù)num_times次的字符串。
          replace(arg1,arg2,arg3):將在arg1中的所有arg2替換成arg3。
          right(arg,length):返回一個(gè)有arg左邊length個(gè)字節(jié)組成的字符串。
          space(arg):返回一個(gè)包含arg個(gè)空格的字符串。
          substr(arg1,pos,<length>):返回arg1中pos位置開始的length個(gè)字符,如果沒指定length,則返回剩余的字符。
          4、數(shù)學(xué)函數(shù):
          Abs, count, max, min, sum
          Ceil(arg):返回大于或等于arg的最小整數(shù)。
          Floor(arg):返回小于或等于參數(shù)的最小整數(shù)。
          Mod(arg1,arg2):返回arg1除以arg2的余數(shù),符號(hào)與arg1相同。
          Rand():返回1到1之間的隨機(jī)數(shù)。
          Power(arg1,arg2):返回arg1的arg2次方。
          Round(arg1,arg2):四舍五入截?cái)嗵幚恚琣rg2是位數(shù),如果arg2為負(fù),則對小數(shù)點(diǎn)前的數(shù)做四舍五入處理。
          Sigh(arg):返回arg的符號(hào)指示符。-1,0,1表示。
          truncate(arg1,arg2):截?cái)郺rg1,arg2是位數(shù),如果arg2是負(fù)數(shù),則保留arg1小數(shù)點(diǎn)前的arg2位。

          5、其他:
          nullif(arg1,arg2):如果2個(gè)參數(shù)相等,則返回null,否則,返回參數(shù)1

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 德安县| 灵石县| 鄄城县| 高尔夫| 杂多县| 陇西县| 大宁县| 民勤县| 睢宁县| 舞阳县| 象州县| 武陟县| 东山县| 永平县| 松潘县| 黄梅县| 兴业县| 沅陵县| 宜丰县| 五寨县| 云林县| 吉隆县| 诸城市| 深圳市| 香河县| 永寿县| 嵊州市| 三江| 松阳县| 阜平县| 长乐市| 始兴县| 永宁县| 九台市| 河南省| 梁平县| 潞西市| 仁寿县| 乐山市| 高陵县| 陕西省|