基礎SQL語句

1、創建表

create table tabname(

columnName  columnType[not null] [primary key],

columnName  columnType[not null]

)

使用已存在表創建新表

create table tableNamelike oldTableName

create table tableNameas select col1,col2… from oldTableName definition only

2、刪除表

drop table tabname


3、增加一個列
Alter table tableName add column columnType

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


4、添加主鍵Alter table tableName add primary key(col)

刪除主鍵:Alter table tableName drop primarykey(col)


5、創建索引create[unique] index indexName on tableName (col1, col2)
刪除索引:drop index indexName

注:索引是不可更改的,想更改必須刪除重新建。


6、創建視圖create viewviewName as select sqlStatement
刪除視圖drop view viewName


語句

插入:insert into tableName (field1,field2)values(value1,value2)

刪除:delete from tableName where

更新update tableNameset field1=value1 where  

選擇:select * from tableName where


SQL核心之查詢:

SELECT select_list
[ INTO new_table ]
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]


Where

下面的操作符能被使用在WHERE中:

=,<>,>,<,>=,<=,BETWEEN,LIKE

注意:在某些SQL的版本中不等號< >能被寫作爲!=

And & Or

Between…And

not between … and

DISTINCT關鍵字返回被作用列的唯一的值

in 的使用方法:select *from table1 where a [not] in (‘1’,’2’,’4’,’6’)

SQL語句組合時用where 1=1” 是表示選擇全部    where 1=2”全部不選

like操作符

%:表示0到多個字符  _:表示任意單個字符

Order by

指定結果集的排序,可以按照ASC(遞增方式排序,從最低值到最高值)或者DESC(遞減方式排序,從最高值到最低值)的方式進行排序,默認的方式是ASC

Group by

對結果集進行分組,常與彙總函數一起使用。

Having

指定羣組或彙總的搜尋條件。HAVING 通常與 GROUP BY 子句同時使用。不使用 GROUP BY 時,HAVING 則與WHERE 子句功能相似。

SELECT Company,SUM(Amount) FROM Sales GROUP BY CompanyHAVING SUM(Amount)>10000

Join
A記錄如下:
aI       D
aNum
1        
a20050111
2        
a20050112
3        
a20050113
4        
a20050114
5        
a20050115

B記錄如下:
bID      
bName
1        
2006032401
2        
2006032402
3        
2006032403
4        
2006032404
8        
2006032408

1.left join sql語句如下:
select * from A left join B on A.aID = B.bID

結果如下:
aID  
aNum        bID    bName
1    
a20050111   1      2006032401
2    
a20050112   2      2006032402
3    
a20050113   3      2006032403
4    
a20050114   4      2006032404
5    
a20050115   NULL   NULL

(所影響的行數爲 5 行)
結果說明:
left join
是以A表的記錄爲基礎的,A可以看成左表,B可以看成右表,left join是以左表爲準的換句話說,左表(A)的記錄將會全部表示出來,而右表(B)只會顯示符合搜索條件的記錄(例子中爲: A.aID = B.bID).B表記錄不足的地方均爲NULL.

2right join sql語句如下:
select * from A right join B on A.aID = B.bID

結果如下:

aID   aNum        bID    bName
1    
a20050111   1      2006032401
2    
a20050112   2      2006032402
3    
a20050113   3      2006032403
4    
a20050114   4      2006032404
NULL  NULL
       8      2006032408

(所影響的行數爲 5 行)
結果說明:
仔細觀察一下,就會發現,left join的結果剛好相反,這次是以右表(B)爲基礎的,A表不足的地方用NULL填充.
3.inner join sql
語句如下:
select * from A innerjoin B on A.aID = B.bID

結果如下:

aID   aNum        bID    bName
1    
a20050111   1      2006032401
2    
a20050112   2      2006032402
3    
a20050113   3      2006032403
4    
a20050114   4      2006032404

結果說明:
很明顯,這裏只顯示出了 A.aID = B.bID的記錄.這說明inner join並不以誰爲基礎,它只顯示符合條件的記錄.

join默認就是inner join

與如下此sql作用一樣

select * from A, B where A.aID = B.bID

joinonwhere區別

left join :左連接,返回左表中所有的記錄以及右表中連接字段相等的記錄。

right join :右連接,返回右表中所有的記錄以及左表中連接字段相等的記錄。

inner join: 內連接,又叫等值連接,只返回兩個表中連接字段相等的行。

full join:外連接,返回兩個表中的行:left join + right join

cross join:結果是笛卡爾積,就是第一個表的行數乘以第二個表的行數。

關鍵字: on

數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。

在使用left jion時,onwhere條件的區別如下:

1 on條件是在生成臨時表時使用的條件,它不管on中的條件是否爲真,都會返回左邊表中的記錄。

2where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不爲真的就全部過濾掉。

假設有兩張表:

1tab2

id

size

1

10

2

20

3

30

2tab2

size

name

10

AAA

20

BBB

20

CCC

兩條SQL:
1
select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=AAA
2
select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=AAA)

第一條SQL的過程:

1、中間表
   on
條件:
   tab1.size = tab2.size

tab1.id

tab1.size

tab2.size

tab2.name

1

10

10

AAA

2

20

20

BBB

2

20

20

CCC

3

30

(null)

(null)



2、再對中間表過濾
   where
條件:
   tab2.name=’AAA’

tab1.id

tab1.size

tab2.size

tab2.name

1

10

10

AAA



第二條SQL的過程:

1、中間表
   on
條件:
   tab1.size = tab2.size and tab2.name=’AAA’
   (
條件不爲真也會返回左表中的記錄)

tab1.id

tab1.size

tab2.size

tab2.name

1

10

10

AAA

2

20

(null)

(null)

3

30

(null)

(null)

其實以上結果的關鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否爲真都會返回leftright表中的記錄,full則具有leftright的特性的並集。inner jion沒這個特殊性,則條件放在on中和where中,返回的結果集是相同的。


子查詢

子查詢是指嵌入在其他sql語句中的select語句,也叫嵌套查詢。
單行子查詢
單行子查詢是指只返回一行數據的子查詢語句
SELECT * FROM emp WHERE deptno = (select deptno from emp WHERE ename ='SMITH');
數據庫在執行sql 是從左到右掃描的,如果有括號的話,括號裏面的先被優先執行。
多行子查詢
多行子查詢指返回多行數據的子查詢

請思考:如何查詢和部門10的工作相同的僱員的名字、崗位、工資、部門號
SELECT * FROM emp WHERE job IN (SELECT DISTINCT job FROM emp WHERE deptno =10);
(注意:不能用job=..,因爲等號=是一對一的)

在多行子查詢中使用all操作符
問題:如何顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號?
SELECT ename, sal, deptno FROM emp WHERE sal > all (SELECT sal FROM empWHERE deptno = 30);
擴展要求:
大家想想還有沒有別的查詢方法。
SELECT ename, sal, deptno FROM emp WHERE sal > (SELECT MAX(sal) FROM empWHERE deptno = 30);
執行效率上,函數高得多
在多行子查詢中使用any操作符
問題:如何顯示工資比部門30的任意一個員工的工資高的員工姓名、工資和部門號?
SELECT ename, sal, deptno FROM emp WHERE sal > ANY (SELECT sal FROM empWHERE deptno = 30);
擴展要求:
大家想想還有沒有別的查詢方法。
SELECT ename, sal, deptno FROM emp WHERE sal > (SELECT min(sal) FROM empWHERE deptno = 30);
多列子查詢

單行子查詢是指子查詢只返回單列、單行數據,多行子查詢是指返回單列多行數據,都是針對單列而言的,而多列子查詢是指查詢返回多個列數據的子查詢語句。
請思考如何查詢與SMITH的部門和崗位完全相同的所有僱員。
SELECT deptno, job FROM emp WHERE ename = 'SMITH';
SELECT * FROM emp WHERE (deptno, job) = (SELECT deptno, job FROM emp WHEREename = 'SMITH');
小總結:
在這裏需要說明的當在from子句中使用子查詢時,該子查詢會被作爲一個視圖來對待,因此叫做內嵌視圖,當在from子句中使用子查詢時,必須給子查詢指定別名。
注意:別名不能用as,如:SELECT e.ename, e.deptno, e.sal, ds.mysal FROM emp e,(SELECT deptno, AVG(sal) mysal FROM emp GROUP by deptno) as ds WHERE e.deptno =ds.deptno AND e.sal > ds.mysal;
ds前不能加as,否則會報錯(給表取別名的時候,不能加as;但是給列取別名,是可以加as的)

SQL UnionSQL Union All用法

SQL UNION 操作符

UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。

請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。

SQL UNION 語法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

註釋:默認地,UNION 操作符選取不同的值,即UNION是去了重的。如果允許重複的值,請使用 UNION ALL

SQL UNION ALL 語法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章