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 DaNum
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.
2.right 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
join中on與where區別
left join :左連接,返回左表中所有的記錄以及右表中連接字段相等的記錄。
right join :右連接,返回右表中所有的記錄以及左表中連接字段相等的記錄。
inner join: 內連接,又叫等值連接,只返回兩個表中連接字段相等的行。
full join:外連接,返回兩個表中的行:left join + right join。
cross join:結果是笛卡爾積,就是第一個表的行數乘以第二個表的行數。
關鍵字: on
數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。
在使用left jion時,on和where條件的區別如下:
1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否爲真,都會返回左邊表中的記錄。
2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不爲真的就全部過濾掉。
假設有兩張表:
表1:tab2
id | size |
1 | 10 |
2 | 20 |
3 | 30 |
表2:tab2
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的過程:
|
第二條SQL的過程:
|
其實以上結果的關鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否爲真都會返回left或right表中的記錄,full則具有left和right的特性的並集。而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的)