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
表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的过程:
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上的条件是否为真都会返回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的)
SQL Union和SQL 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