SQL中的常见问题

1.with as 的用法

with table_name as (查询语句)
select * from table_name

解释:意思就是将查询语句放入到临时表table_name中去,然后再进行对临时表table_name的操作。
如果想要多个临时表,后面可以继续跟as语句,例如:

with 
table1 as (查询语句1),
table2 as (查询语句2),
table3 as (查询语句3)
select * from ....

三个临时表创建完毕后再写对该三个表操作的语句。

2.存储过程

(1)创建存储过程

create proc pro_name
as
SQL_statements

例如:

create proc proc1
as
select * from table1

(2)创建带参数的存储过程

create proc pro_name(@startId int, @endId int) 
as 
select * from student where id between @startId and @endId`

(3)调用存储过程
exec proc1

(4)修改存储过程

alter proc proc_name 
as 
SQL_statements

3.几个删除的比较

SQL里删除操作有三个函数可用:Drop,Truncate,Delete,具体区别如下:

相关函数 删除数据 删除定义(结构) 释放空间
Delete
Truncate
Drop

删除的速度,一般来说: drop>truncate >delete

4.SQL性能优化

(1)where子句的顺序
SQL Sever和ORACLE是采用自下而上解析where子句的,也就是说where里的子句是从后往前执行的,所以,要把那些能够过滤掉最大数量记录的子句写在最后。
(2)on、where和having这三个都可以加条件的句子,on先执行,where次之,having最后。在多表连接查询中,先通过on子句过滤掉不符合条件的记录,把多个表合成临时表后,再由where条件进行过滤,再进行计算,计算完成后再由having条件进行过滤。
(3)使用索引
在数据量大时可以使用索引,来提高查询效率。但是索引也会付出相应代价,就是索引需要空间来存储,也需要定期维护。在数据增删改时,相应的索引也要发生变化,降低了增删改的效率。
(4)用>=代替>
比如:select * from table where id >=4 语句,DBMS直接跳到id=4的记录,而如果使用select * from table where id >3 语句,DBMS先定位到id=3的记录,然后再向前扫描到第一个id>3的记录。
(5)用in来代替or
比如下面两句sql,第二句比第一句效率高

1.`select * from table where id = 2 or id = 3 or id = 4`
2.`select * from table where id in (2,3,4)`

(6)优化group by子句
下面两种语句执行效果一样,但明显第二种语句效率更高。

1.select job,avg(sal) from table group by job having job = "job1" or job = "job2"
2.select job,avg(sal) from table where job = "job1" or job = "job2" group by job

(7)使用表的别名
在多表连接查询时,使用表的别名可以减少解析的时间,并且也可以避免由于列名引起的语法错误。

5.case when的用法

case when 有两种格式写法
(1)简单case函数

case sex
when '1' then '男'
when '2' then '女'
else '其他'
end

(2)case搜索函数

case when sex = '1' then '男'
when sex = '2' then '女'
else '其他'
end

需要注意到的是,case when 函数只返回第一个符合条件的值,其后所有的都将会被忽略。

举例:暂略

6.union的用法

union是对字段类型以及个数一样的两个表进行行连接,直接对两个select语句中间加union即可,举例

select * from table1 where ...
union
select * from table2 where ...

如果要对合并后的表进行排序的话,只在最后加上order by子句即可,union函数不支持对某一个表格排序,要么整体排序,要嘛不排序。order by子句写在最后就是对合并后的表格排序。如下所示:

select * from table1 where ...
union
select * from table2 where ...
order by ...

如果两个表格里有重复的行,union 函数会去重,如果不要求去重,可用union all函数。

7.关于集合的运算,交集、并集、差集等

上面提到的union 即是集合的的并集运算。下面讲讲其他运算。
集合运算的基本语法:

查询语句1
运算关键字
查询语句2

首先,关于集合的运算的几点说明:
(1)两个查询不能包含order by子句,可以在集合运算后一次性的order by
(2)两个查询必须具有相同的列数,且相应的列的数据类型必须具有兼容性
(3)集合运算结果的列名由查询语句1决定,如果要为结果列重新起名,则应在查询语句1中起名

交集(INTERSET)
基本语法:

查询语句1
INTRSET
查询语句2

差集(EXCEPT)
基本语法:

查询语句1
EXCEPT
查询语句2

集合运算的优先级:INTERSECT>UNION=EXCEPT

posted on 2018-11-02 12:37  小马927  阅读(230)  评论(0)    收藏  举报

导航