1. 程式人生 > >007-sql整體概述

007-sql整體概述

left 建表 高級 das from 插入數據 類型 ceil 重新

一、概述

  1. sql基礎

數據庫、數據表、行、列、關系

  1. 查詢

Select 字段1,字段2,* from 表 where 條件

  1. 去除重復

Distinct

必須放在所有列前面

  1. 區間語句

BETWEEN ... AND 會選取介於兩個值之間的數據範圍。這些值可以是數值、文本或者日期。並且包含兩端值。。

示例:select * from tableA where age between 18 and 50

  1. 指定條件語句

in

  1. AND/or 語句

連接多個條件

  1. 排序

Order by asc 升序;desc降序

  1. 匯總count(*)
  2. 聚合函數

匯總:count(*)

最大值:max(列名)

最小值:min(列名)

平均值:avg(列名)

  1. 分組語句

Group by (字段名) having 條件

二、Sql基礎

SQL定義:SQL是一種面向數據庫的通用數據處理語言規範,能完成以下幾類功能:提取查詢數據,插入修改刪除數據,生成修改和刪除數據庫對象,數據庫安全控制,數據庫完整性及數據保護控制。

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

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

2.1 DDL

DDL—數據庫定義語言:直接提交的。
CREATE:用於創建數據庫對象。
DECLARE:除了是創建只在過程中使用的臨時表外,DECLARE語句和CREATE語句非常相似。唯一可以被聲明的對象是表。並且必須放入用戶臨時表空間。

DROP:可以刪除任何用CREATE(數據庫對象)和DECLARE(表)創建的對象。
ALTER:允許修改某些數據庫對象的信息。不能修改索引。
下面主要基於對象介紹基本的語法:
1、數據庫
創建數據庫:CREATE DATABASE database-name [USING CODESET codeset TERRITORY territory]
註:代碼頁的問題。
刪除數據庫:drop database dbname
2、表:

創建新表:
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根據已有的表創建新表:
A:create table tab_new like tab_old
B:create table tab_new as select col1,col2… from tab_old definition only
修改表:
增加一個列:
Alter table table_name add column_name datatype

刪除一個列

Alter table table_name drop column column_name
註:列增加後將不能刪除。DB2中列加上後數據類型也不能改變,唯一能改變的是增加varchar類型的長度。

改變表中列的數據類型

Alter table table_name alter column column_name datatype

主鍵:
添加:Alter table tabname add primary key(col)
刪除:Alter table tabname drop primary key(col)

刪除表:drop table tabname
3、表空間:
創建表空間:create tablespace tbsname pagesize 4k managed by database using (file ‘file’ size)
表空間加入容器:alter tablespace tablespace_name add(file ‘filename‘ size)
註:該操作是不可逆的,加入容器後將不能將其刪除,因此在加入的時候註意。
刪除表空間:drop tablespace tbsname
4、索引:
創建索引:create [unique] index idxname on tabname(col….)
刪除索引:drop index idxname
註:索引是不可更改的,想更改必須刪除重新建。
5、視圖:
創建視圖:create view viewname as select statement
刪除視圖:drop view viewname
註:視圖唯一能修改的是引用類型列,改變列的範圍。其他定義好了都不能修改。當視圖基於的基表drop後,視圖變為無效。

2.2 DML

DML—數據庫操縱語言,它不隱式地提交當前事務 ,是否提交視環境設定而定。

SELECT:從表中查詢符合數據
註:條件中連接的問題,避免出現笛卡兒乘積
DELETE:刪除已有表的數據
UPDATE:更新已有表的數據
INSERT:向已有表中插入數據
註:DELETE,UPDATE和INSERT是否直接提交取決與執行語句所在的環境。
在執行時註意事務日誌滿的情況。
1select,註意索引謂詞和非索引謂詞,盡量在有索引的列上使用索引謂詞。
謂詞類型 可索引註釋
Col∝con Y ∝代表>;,>;=,=,<=,<,但是<>;不是可索引的。
Col between con1 and con2 Y 在匹配系列中必須是最後的。
Col in list Y 僅對一個匹配列
Col is null Y
Col like ‘xyz%’ Y 模糊匹配%在後面。
Col like ‘%xyz’ N 模糊匹配%在前面。
Col1∝Col2 N Col1和col2來自同一個表
Col∝Expression N 例如:c1(c1+1)/2
Pred1 and Pred2 Y Pred1和Pred2都是可索引的,指相同索引的列
Pred1 or Pred2 N 除了(c1=a or c1=b)外,他可以被認為是c1 in(a,b)
Not Pred1 N 或者任何的等價形式:Not between,Not in,Not like等等。
使用索引的例子介紹:
<1>;、單個表上索引查詢的介紹 :
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列上有單獨的索引
在c1,c2和c3列上有聯合索引
此處可以填加索引匹配規則和高級規則,比較難理解!!
<2>;、兩個或多個表上索引查詢的介紹:
(1)、使用循環嵌套法執行查詢
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)、使用歸並連接執行連接查詢
例: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)、三個以上的表進行連接查詢采取的規則或者方法
(2)、GROUP BY:實現簡單分組的功能,當用group by時,查詢選擇列中除了在group by中出現的和常量外,其他的列上要用分組函數。可以使用一些分組函數實現一些列不在group by中出現,min,max等。
(3)、HAVING的使用,對一些分組列進行條件判斷。
(4)、ORDER BY子句使得SQL在顯示查詢結果時將各返回行按順序排列,返回行的排列順序由ORDER BY 子句指定的表達式的值確定。
2DELETE:從表中刪除記錄
語法格式:
DELETE FROM tablename WHERE (conditions)
3INSERT:向表中插入記錄
語法格式:
INSERT INTO tablename (col1,col2,…) VALUES (value1,value2,…);
INSERT INTO tablename (col1,col2,…) VALUES (value1, value2,…), (value1, value2,…),……
Insert不會等待任何程序,不會導致鎖定。
4UPDATE
語法格式:
UPDATE tabname SET (col1=values1,col2=values2,…) WHERE (conditions);
註:update的速度比較慢,要在相應列上建立索引。

2.3、DCL

DCL—數據控制語言

GRANT—授予用戶權限
REVOKE—撤消用戶權限
COMMIT—提交事務,可以使數據庫的修改永久化
ROLLBACK—回滾事務,消除上一個COMMIT命令後的所做的全部修改,使得數據庫的內容恢復到上一個COMMIT執行後的狀態.。

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

三、高級sql簡介

一、查詢間使用運算詞
A: UNION 運算符
UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重復行而派生出一個結果表。當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
B: EXCEPT 運算符
EXCEPT 運算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重復行而派生出一個結果表。當 ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重復行。
C: INTERSECT 運算符
INTERSECT 運算符通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重復行而派生出一個結果表。當 ALL 隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重復行。
註:使用運算詞的幾個查詢結果行必須是一致的。
二、外連接
A、left outer join:
左外連接(左連接):結果集幾包括連接表的匹配行,也包括左連接表的所有行。
B:right outer join:
右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。
C:full outer join:
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。

註:復合外連接按照從左到右的順序執行連接,左邊連接的結果集和右邊連接
三、超級分組和移動函數
A:grouping sets:用來在單個sql中形成多級分組。
例:select company_id,node_id,count(customer_id) from customer group by grouping sets(company_id,node_id)
B:rollup:可以在單個數據庫操作中形成多個分組。
例: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:移動函數可以幫助實現移動的數據分析
Select date,avg(qty) over(order by date rows between 1 preceding and 1 following) as values from sale

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

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

1.數據庫查詢:Select用法
Select [Top(數值)] 字段列表 From 數據表 [Where 條件] [Order by 字段] [asc或desc]

2.添加數據:Insert Into用法
Insert Into 數據表(字段1,字段2,字段3,…) Values(字段1的值,字段2的值,字段3的值,…)

3.刪除數據:Delete用法
Delete From 數據表 [Where 條件]

4.更新數據:Update用法
Update 數據表 Set 字段1=字段值1, 字段2=字段值2, … [Where 條件]

5.建數據表:Create Table用法
Create Table 數據表名(字段1名稱,字段1類型,字段2名稱 字段2類型, …)

Access數據表常用數據類型:Text,Char(Number),Memo,Number,Int,Date/Time,Logical,OLEObject

自動編號字段添加例子:create table aaa(id int identity (1, 1) not null,abc varchar(25) null)

6.改數據表:Alter Table用法
添加字段:Alter Table 數據表名 Add Column 字段名 字段類型

刪除字段:Alter Table 數據表名 Drop Column 字段名

7.刪數據表:Drop Table用法

Drop Table 數據表名

007-sql整體概述