基础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


你可能感兴趣的:(sql)