您的位置:首页 > 职场人生

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

2013-05-19 00:21 429 查看
------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------

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

MSSQLServer、Oracle等某种DBMS;

存放一堆数据表的一个分类(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中主键的一些知识点及注意事项

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

用标识列实现字段自增可以避免并发等问题,不要开发人员控制自增。用标识列的字段在Insert的时候不用指定主键的值。将字段的“是标识列”设置为“是”,一个表只能有一个标识列。

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

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

(*)Guid的优点:效率高、数据导入导出方便;缺点占用空间大、不易读。

业界主流倾向于是用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中等于判断用单个=,而不是==

数据删除:

删除表中的全部数据:delete from 表

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

Delete也可以带where子句来删除一部分数据:delete from 表 where age>20

数据检索:

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

只检索需要的列:select fNumber from 表、select fname,fage from表

列别名:select fnumberas编号,fnameas姓名,fage as age111 from 表

使用where检索符合条件的数据:select fname from 表 where fsalary<5000.

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

统计多少条数据select count(*) from 表

聚合函数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子句之后;

通配符过滤:

通配符过滤使用LIKE关键字

单字符通配符:为半角下划线“_”,它匹配单个出现的字符。以任意字符开头,剩余部分为“erry”:select * from 表 where fname like ‘_erry’

多字符通配符:为半角百分号“%”,它匹配任意次数(零或多个)出现的任意字符。“k%”匹配以“k”开头、任意长度的字符串。检索姓名中包含字母“n”的员工信息:select * from 表 where fname like ‘%n%’

空值处理

数据库中,一个列如果没有指定值,那么值就为null,这个null和c#中的null不同,数据库中的null表示“不知道”,而不是表示没有。因为select null+1结果是null,因为“不知道”加1的结果还是“不知道”。

select * from 表 where fname =null;
select * from 表 where fname!=null;
都没有任何返回结果,因为数据库也“不知道”。

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 * from 表
where FNumber not in(select top 5 FNumber from 表 order 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: