黑马程序员--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语句完成,在自动化部署、数据导入中用的很多,如:
简单的Insert语句:
(*)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。
数据更新:
更新一个列:
更新多个列:
更新一部分数据:
用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
(*)检索按照工资从高到低排序检索从第六名开始一共三个人的信息:
去掉重复数据:
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
如果是上下字段不一样,一定要补充一致。
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
相关文章推荐
- 黑马程序员——Sql基础知识总结
- 黑马程序员-html+css基础知识总结
- 黑马程序员学习log第一篇基础知识:java概述及基础语法总结
- 黑马程序员学习log第六篇基础知识:JAVA的面向对象之IO总结
- SQL基础知识总结二
- SQL基础知识总结(一)
- 黑马程序员_JavaSE基础知识总结七:new、this、static关键字和单例模式初步
- SQL基础知识总结(一)
- 黑马程序员————C语言基础 第13篇 字符串知识总结
- 黑马程序员-------java循环的一些总结(基础知识)
- 黑马程序员——基础知识总结_static
- SQL基础知识归纳总结
- 黑马程序员----基础知识要点总结
- SQL基础知识归纳总结
- 黑马程序员_java基础知识学习总结二
- 黑马程序员之基础知识总结2
- 黑马程序员——基础知识总结_集合框架1
- 黑马程序员_JavaSE基础知识总结四:递归与迭代
- 黑马程序员--对关于.NET的基础入门知识总结(2)
- 黑马程序员 Java基础知识总结-异常处理