博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

sql必知必会(第四版) 学习笔记

Posted on 2015-04-29 14:28  和风细雨汪汪  阅读(274)  评论(0编辑  收藏  举报

还有一个《Sqlserver2008技术内幕》的笔记,也很好!~

http://www.cnblogs.com/liupeng61624/p/4354983.html

温习一遍简单的sql语法,把自己掌握还不够的地方,做了些笔记....

1 去重复关键词,distinct

    select distinct sname from student;

 

2 限制结果top的用法

     select top 5 id from student 获取前五条记录

     可以利用top来写sql分页语句

 

3 排序order by

    select * from student order by id,name desc;

    默认是升序 asc,若是降序要在列名后标明desc

    order by语句在sql句尾,在where语句后面出现

 

4 where

   操作符 =,<> !=(不等于),>,>=,<,<=,!(不小于),!>(不大于)

             BETWEEN......(在...之间)

              is NULL(空值)

      AND 条件与

      OR   条件或 

      注意: and的结合优先级高于or,所以where后面多条件时候最好用括号写清楚

 

5 IN,NOT

     select * from student

     where id in(1,2,3)

      where 条件中的NOT表明否定其后跟的任何条件,也就是筛选的是where条件外的数据

 

6 通配符匹配过滤

    Like...模糊匹配

   select * from student

    where name like '汪%'

   选出汪姓 的同学,其中 % 代表匹配任意次,_ 代表匹配单个字符,[]表示匹配中括号里面的字符

 

7 as 利用as起别名,简便写法

  

8 聚合函数

    利用一些简单的聚合函数汇总数据

   AVG()  计算平均值

   Count() 计算 个数

   Max() 最大值

   Min() 最小值

 

9 分组数据

  select COUNT(*) as 人数, Kind as 科目类型
  from Course
  Group by Kind

 

Having的用法,和where的区别就是where是在检索时过滤行的,而Having是用来过滤分组的

如上,在sql句末加上,Having Count(*) > 2 那么就是要筛选出人数大于2的组了

 

另外一种理解,where是对数据分组前进行过滤,而Having 是对数据分组后进行过滤,where中排出的行就不包括在分组中了,从而影响到Having子句中基于这些值过滤掉的分组。

 

至此简单回顾下select子句及其顺序

  句子                   说明                       是否必须使用

---------       -----------------       -------------------------

select            要返回的列或者表达式         是

from             从中检索数据的表                仅在从表中选择数据使用

where           行级的过滤                          否

group by       分组说明                             仅在按组计算聚合时使用

Having          组级过略                              否

Order by        输出排序顺序                       否

 

    以前一直弄不清,group by,having...一起怎么使用的,现在清楚了许多。

 

10 子查询

       不多说了,就是一级级嵌套查询下去

 

11 联结表 多表查询

    对于关系表而言,那么就是一种数据存放在对应的一张数据表中,避免数据的重复,比如把产品相关信息放在一张Products表中,产品对应的供应商相关信息放在另一张供应商表Vendors中。

  如果我们要通过产品查询其对应的供应商Vendor的相关信息,要么使用之前的子查询,这样就过于繁琐,所以我们要使用表的连接查询。

   多表的连接有自然连接,通过join来连接的左外连接和右外连接。

 

12 组合查询 

    union

select * from StuCou
where StuNo = 1
union
select * from StuCou
where StuNo = 2 

等价于

select * from StuCou
where StuNo = 1 or StuNo = 2

 

13 插入数据

    insert [into] Student  values('1','King',13,'浙江杭州')

     这样的话,就是插入一整行数据,要求插入数据个数和数据表中定义的个数要一致

   或者可以这么写

   insert into Student(stu_id,stu_name,stu_age,stu_address,stu_score)

   values(1,'King',13,'浙江杭州',100);

   values中的值和前面的属性一一对应

 

    从一个表复制到另一个表

     insert * into class1 from class

     那么数据库会新建一个名为class1的数据表然后把class中的数据复制到class1中。

    如果你想将class表中的部分新数据导入到class1中的话,那么你可以这么写

    insert into class1(列1,列2,列3)

    select 列11,列22,列33

    from class

    但是如果行中有不能为null的属性,就不能这么做了

 

14 更新和删除数据

   update ,delete

   update 表名

    set 列名 ='值'

   where 条件

    值得注意的是,更新操作往往会因为,表与表之间的约束关系发生冲突

 

  delete from 表名

  where 条件

  delete是删除表的内容

   若想删除整张表中的内容,那么delete from 表名

   更快的删除表中所有行,而且速度更快

    truncate Table  这样删除不用记录数据的变动所以删除更快

 

15 创建表,更新,删除

     create table 表名(

         列名 数据类型 说明(null/not null),

         ...

        )

     更新表

     给表增加一列

    Alter Table 表名

    ADD 列名, 数据类型

    Drop Column 列名   --删除一列

 

   删除表

   Drop Table 表名