SQL高级语法集锦

1.case…end (具体的值)

注意:case后必须有条件,并且when后面必须是值不能为条件。

SELECT name AS '姓名',
    CASE level
        WHEN 1 THEN '大师'
        WHEN 2 THEN '大虾'
        WHEN 3 THEN '菜鸟'
    END AS '头衔'
FROM user

2.case…end (范围)

注意:case后不跟条件

select *,
    case
       when english>=80  then '优'
       when english>=60  then '良'
       else '差'
    end
from score

3.if…else

IF(条件表达式)
 BEGIN --相当于C#里的{
   语句1
    ……
 END --相当于C#里的}
ELSE
 BEGIN
   语句1
   ……
 END

4.while循环

WHILE(条件表达式)
  BEGIN --相当于C#里的{
    语句
    ……
    BREAK
  END --相当于C#里的}

5.索引

使用索引能提高查询效率,但是索引也是占据空间的,而且添加、更新、删除数据的时候也需要同步更新索引,因此会降低Insert、Update、Delete的速度。只在经常检索的字段上(Where)创建索引。
1)聚集索引:索引目录中的和目录中对应的数据都是有顺序的。
2)非聚集索引:索引目录有顺序但存储的数据是没有顺序的。

--创建非聚集索引
CREATE NONCLUSTERED INDEX [IX_Student_sNo] ON student
(
    [sNo] ASC
)

6.子查询

将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询。所有可以使用表的地方几乎都可以使用子查询来代替。

select * from (select * from student where sAge<30) as t  --被查询的子表必须有别名
where t.sSex ='男' --对子表中的列筛选

横向输出

select (select max(english) from score) as '最高成绩',
    (select min(english) from score) as '最低成绩',
    (select sum(english) from score) as '总成绩',
    (select avg(english) from score) as '平均成绩'

纵向输出

select '最高成绩' as '描述',max(english) as '成绩' from score
UNION ALL
select '最低成绩',min(english) from score
UNION ALL
select '总成绩',sum(english) from score
UNION ALL
select '平均成绩',avg(english) from score

转换为两位小数:CONVERT(numeric(10,2), AVG(english))

只有返回且仅返回一行、一列数据的子查询才能当成单值子查询。

select '平均成绩', (select AVG(english) from Score) --可以成功执行
select '姓名', (select sName from student) --错误,因为‘姓名’只有一行,而子表中姓名有多行

select * from student where sClassId in(select cid from Class where cName IN('高一一班','高二一班')) --子查询有多值时使用in
    原文作者:mnz12138
    原文地址: https://www.jianshu.com/p/1598df3d6794
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞