黑马程序员--SQL基础知识总结

 

DAMS(DataBase Management System,数据库管理系统)和数据库。平时谈到“数据库”可能有两种含义:

  1. MSSQLServer、Oracle等某种DBMS;
  2. 存放一堆数据表的一个分类(Catalog)。

除了Access、SQLServerCE等文件型数据库之外,大部分数据库都需要数据库服务器才能运行。学习、开发时是连接本机的数据库,上线运行时是数据库运行在单独的服务器。

 

 

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

 

主键有两种选择策略:业务主键和逻辑主键。

业务主键是使用有业务意义的字段做主键,比如身份证号、银行账号等;

逻辑主键是使用没有任何业务意义的字段做主键,完全给程序员看的,业务人员不会看的数据。因为很难保证业务主键不会重复(身份证号重复)、不会变化(账号升位),因为推荐用逻辑主键。

 

外键(ForeignKey)

char/nvarchar/varchar的区别

char会补充空格,varchar不会补充空格

var:variable可变的。

 

在SQL语句中字符串用单引号。

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

创建表、删除表不仅可以手工完成,还可以执行SQL语句完成,在自动化部署、数据导入中用的很多,如:

CREATE TABLE T_Person(Id int  NOT  NULL,Namenvarchar(50),Age  int  NULL)、Drop  table  T_Person1

 

简单的Insert语句:

INSERT  INTOT_Person(Id,Name,Age)  VALUES(1,’Jim’,20)

 

(*)SQL主要分DDL(数据定义语言)和DML(数据操作语言)两类。

Create Table、Drop Table、Alter Table等属于DDL;

Select、Insert、Update、Delete等属于DML

 

在sql中主键的一些知识点及注意事项

  1. SQLServer中两种常用的主键数据类型:int(或bigint)+标识列(又称自动增长字段);uniqueidentifier(又称Guid、UUID)
  2. 用标识列实现字段自增可以避免并发等问题,不要开发人员控制自增。用标识列的字段在Insert的时候不用指定主键的值。将字段的“是标识列”设置为“是”,一个表只能有一个标识列。
  3. Guid算法是一种可以产生唯一标识的高效算法,它使用网卡MAC、地址、纳秒时间、芯片ID码等算出来的,这种保证每次生成的GUID永远不会重复,无论是同一个计算机上还是不同的计算机。在公园3400年以前产生的GUID与任何其他产生过的GUID都不相同。SQLServer中生成GUID的函数newid(),.Net中生成Guid的方法:Guid.NewGuid(),返回是Guid类型。
  4. (*)Int自增字段的优点:占用空间小,无需开发人员干预、易读;缺点:效率低,数据导入导出的时候很痛苦。
  5. (*)Guid的优点:效率高、数据导入导出方便;缺点占用空间大、不易读。
  6. 业界主流倾向于是用Guid。

数据更新:

更新一个列:

Update  person1  set  age=30

 

更新多个列:

Update  person1 set  age=30,name=‘tom’

 

更新一部分数据:

Update  person1  set  NickName=N‘青年人’where  age>30

 

用where语句表示只更新age大于30的行,

注意SQL中等于判断用单个=,而不是==

数据删除:

  1. 删除表中的全部数据:delete  from  表
  2. Delete只是删除数据,表还在,和Drop Table不同。
  3. Delete也可以带where子句来删除一部分数据:delete  from  表  where  age>20

数据检索:

  1. 简单的数据检索:select * from 表
  2. 只检索需要的列:select  fNumber  from  表、select  fname,fage  from表
  3. 列别名:select  fnumberas编号,fnameas姓名,fage as  age111  from 表
  4. 使用where检索符合条件的数据:select  fname  from  表  where  fsalary<5000.
  5. 还可以检索不与任何表关联的数据:select  1+1;select  newid();select  getdate();
  6. 统计多少条数据select  count(*) from  表
  7. 聚合函数select  max(fSalary) from 表

select  min(fSalary) from 表

select  avg(fSalary) from 表

select  sum(fAge) from 表

8.    数据排序:order by fAge

         order by fSalary ASC(DESC)

ORDER  BY子句要放到where子句之后;

通配符过滤:

  1. 通配符过滤使用LIKE关键字
  2. 单字符通配符:为半角下划线“_”,它匹配单个出现的字符。以任意字符开头,剩余部分为“erry”:select  *  from  表  where  fname  like ‘_erry’
  3. 多字符通配符:为半角百分号“%”,它匹配任意次数(零或多个)出现的任意字符。“k%”匹配以“k”开头、任意长度的字符串。检索姓名中包含字母“n”的员工信息:select  *  from  表  where  fname  like  ‘%n%’

空值处理

  1. 数据库中,一个列如果没有指定值,那么值就为null,这个null和c#中的null不同,数据库中的null表示“不知道”,而不是表示没有。因为select  null+1结果是null,因为“不知道”加1的结果还是“不知道”。
  2. select  *  from 表  where  fname =null;
    select  *  from 表  where   fname!=null;
    都没有任何返回结果,因为数据库也“不知道”。
  3. SQL中使用is  null、is  not  null 来进行空值判断
    select  *  from 表  where  fname  is  null;
    select  *  from 表  where   fname  is  not  null;

多值匹配

用到了where  fAge  in(21,23,34)

Where  FAge  between 20 and 30;

数据分组:

Select  FAge,Count  (*)  from  表

Group  byFAge

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

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

错误:select  FAge,FSalary  From 表 group  by  FAge

正确:select  FAge,AVG(FSalary)  from 表 group  by  FAge

 

 

Having语句:

在where中不能使用聚合函数,必须使用having,having要位于group  by 之后,

select  FAge,count(*) as 人数 from 表

Group  byFAge

Having  count(*)>1

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

限制结果集行数:

Select * from 表 order by FSalaryDesc

Select top 5 * from 表 order by FSalaryDesc

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

 

select top 3 * fromwhere FNumber not in(select top 5 FNumber fromorder by FSalary DESC ) 
order by FSalary DESC

 

去掉重复数据:

Alter是修改表

首先查询select  distinct  FDepartment From 表

select  distinct FSubCompany,FDepartment From 表

from 表

union:

selectFName,FAge from T_TempEmployee

union

selectFName,FAge from T_Employee

上下两个字段的属性应该一致,否则会出现错误,并且数据类型也应该相同或相容

Union all不合并重复行,达到取出所有的数据,不出现null

selectFName,FAge from T_TempEmployee

union all

selectFName,FAge from T_Employee

如果是上下字段不一样,一定要补充一致。

Select FNumber,FSalary from T_Employee
Union
Select ‘工资合计’,sum(FSalary) from T_Employee

 

 

posted @ 2013-05-19 00:21  流浪的雁  阅读(342)  评论(0编辑  收藏  举报