黑马程序员--SQL中的知识点和案例

  1、数据库概述

    DBMS(DateBase Management  System,数据库管理系统)。平时谈到数据库有俩种含义:MSSQLServer、Oracel等某种DBMS:存放一堆表的分类(Catalog)。

   Catalog(分类)(又叫做数据库Database、表空间TableSpace),不同类的数据库应放到不同类的数据库中

       便于对各个Catalog进行个性化管理

        避免命名冲突

        安全性更高

2、Table(表):书放到书架上,碗放到橱柜中,不同类型的资料放到不同的格子中,将这种区域叫做表(Table)。不同的表根据放的数据不同进行空间的优化,找起来也方便。  列(Column)、字段(Field)

3、主键(PrimaryKey)

  主键是数据行的唯一标识。不会重复的列才能当主键,一个表可以没有主键,但是会非常难以处理,因此没有特殊理由表都要设定主键。

  主键有俩种:业务主键和逻辑主键。因为业务主键很难保证不会重复,因此推荐使用逻辑主键。

4、SQLServer的管理

  首先需要安装SQLServer2005或者SQLServer2008,若要使用SQLServer管理工具进行开发还要安装SQLServer Mangement Studio,还可以使用VS进行管理。

 SQLServer有俩种验证方式:用户名验证和Windows验证,开发时用Windows验证就行。

 创建数据库,创建表,设置主键

 常用字段类型:bit(可选值0、1)、datetime、int、varchar、nvarchar(可能含有中文用nvarchar)

 varchar、nvarchar和char(n)的区别:char(n)不足长度n的部分用空格填充

5、SQL语句

  SQL语句是和DBMS“交谈”的专用语句,不同DBMS都认SQL语法。

  SQL中字符串用单引号。

  SQL语句是大小写不敏感的,不敏感指的是SQL关键字,字符串值还是大小写敏感的

  创建表、删除表不仅可以手工完成,还可以执行SQL语句完成,CREATE  TABLE T_Person(Id int NOT NULL,Name nvarchar(50),Age int NULL)、Drop table T_Person

  简单的insert语句。insert into T_Person(Id,Name,Age) values(1,'Jim',23)

  (*)SQL主要分DDL(数据定义语言)和DML(数据操作语言)俩类。Create Table、Drop Table等属于DDL,Select、Insert等属于DML

6、主键选择

 SQLServer中俩种常用的数据类型:int(或bigint)+标识列(又称自动增长字段);uniqueidentifier(又称Guid、UUID)

 用标识列实现字段自增可以避免并发等问题,不要开发人员控制自增。

 用标识列的字段在insert的时候不用指定主键的值,将字段的是标识列设置为“是”,一个表只能有一个标识列

  Guid算法是一种可以产生唯一标识的高效算法,它使用网卡MAC、地址、纳秒级时间、芯片ID码等算出来的,这样保证每次生成的Guid永远不会重复,无论是同一个计算机上还是不同计算机上。SQLServer中生成的Guid函数newid(),.Net中生成的Guid的方法:Guid.NewGuid(),返回是Guid类型

(*)Int自增字段的优点:占用空间小、无需开发人员干预、易读;缺点:效率低,数据导入导出的时候很痛苦。

(*)Guid的优点:效率高、数据导入导出方便;缺点:占用空间大、不易读。业界主流倾向于Guid插入:

  主键:insert into Person3(Name,Age) values('lily',38);

          insert  into Person4(Id,Name,Age) values(newid(),tom',30);

7、数据删除  

   删除表中全部数据:DELETE FROM T_Person。

  Delete只是删除数据,表还在,和Drop Table不同。

   Delete还可以带where子句来删除部分数据:DELETE FROM T_Person where  FAge>20

8、数据检索

 简单的数据检索:select * from T_Employee

 只检索需要的列:select FNumber from T_Employee、select FName,FAge from T_Employee

      列别名:select FNumber as 编号,FName as  姓名,FAge as 年龄 from T_Employee

  使用where检索符合条件的数据:select FName from T_Employee  where FSalary<5000.

  还可以检索不与任何表有关的数据:select 1+1;select newid();select getdate();

9、数据分组

  按照年龄进行分组统计各个年龄段的人数:

      select FAge,Count(*) from T_Employee

       Group by FAge

Group by 子句必须放到where语句之后

 没有出现在Group by子句中的列是不能放到select语句后的列名列表中的(聚合函数除外)

   错误:select FAge,FSalary from T_Employee Group by FAge

  正确:select FAge,AVG(FSalary)from T_Employee Group by FAge

10、Having语句

  在where中不能使用聚合函数,必须使用Having,Having要位于GROUP BY之后:

             select FAge,Count(*) as 人数 from T_Employee

             Group by FAge

             Having Count(*)>1

注意:Having中不能使用未参数分组的列,Having不能替代where。作用不一样,Having是对分组后的结果进行过滤

11、限制结果集行数

  select top 5 * from T_Employee order by FSalary Desc

(*)检索按照工资从高到低的顺序检索从第六名开始共计3个人的信息:

  select top 3 FSalary * from T_Employee where FNumber not in

     (select  top 5 FNumber  from T_Employee

     order by FSalary DESC) order by FSalary DESC

 12、去掉重复数据

  例:select FDepartment from T_Employee

      select  Distinct FDepartment from T_Employee  //加Distinct去掉重复数据

 Distinct是对整个结果集进行数据重复处理的,而不是针对每一个列,因此下面的语句并不会 只保留FDepartment进行重复值处理:

       select Distinct FDepartment,FSubCompany from T_Employee

13、联合结果集

 简单的结果集联合

 select FNumber,FName,FAge from T_Employee

  union

 select FIdCardNumber,FName,FAge from T_Employee

基本原则:每个结果集必须有相同的列数;每个结果集的列必须类型相容

案例:

   要求查询员工的最低年龄和最高年龄,临时员工和正式员工要分别查询

   select '正式员工最高年龄',MAX(FAge) from T_Employee

   union all

   select '正式员工最低年龄',MIN(FAge) from T_Employee

    union all

   select '临时工最高年龄',MAX(FAge) from T_TempEmployee

    union all

   select '临时工最低年龄',MIN(FAge) from T_TempEmployee

14、数字函数

 ABS():求绝对值;   CELING():舍入到 最大整数。3.33将被舍入到4、-3.61将被舍入到-3;   FLOOR():舍入到最小整数。3.33将被舍入到3、-3.61将被舍入到-4; ROUND():四舍五入,舍入到离我半径最近的数。ROUND(3.1425,2).

15、字符串函数

LEN():计算字符串长度;  LOWER()、UPPER():转小写、大写;  LTRIM():字符串左侧的空格去掉;  RTRIM():字符串右侧的空格去掉;  SUBSTRING(string,start_position,length)参数string为主字符串,start_position为子字符串,在主字符串的起始位置,length为子字符串的最大长度。select SubString(abcdef111',2,3)

16、空值处理函数

   ISNULL(expression,value):如果expression不为空则返回value。select Isnull(FName,'佚名') as 姓名from T_Employee

17、CASE函数用法

  单值判断,相当于switch-case

  CASE expression

  WHEN value1 THEN returnvalue1 

  WHEN value2 THEN returnvalue2

  WHEN value3THEN returnvalue3

   ELSE defaultreturnvalue

   END

  例子:

  SELECT  FName,

   (  CASE FLevel

    WHEN 1 THEN 'VIP客户'

    WHEN 2 THEN '高级客户'

    WHEN 3 THEN '普通客户'

     ELSE '客户类型错误'

      END) AS FLevelName from T_Customer

通过今天的视频学习,了解并掌握了SQL中的一些知识点。

 

posted @ 2012-11-23 13:00  韩俊  阅读(373)  评论(1)    收藏  举报