SqlServer基础复习
- 一、数据类型
- 包括整数类型(可以用来做主键)的如bit,int ,samllint,tinyint,bigint,存储的范围不同,常用的有int,bigint等;树脂类型decimal(p,s)【p为固定精度,s为宽度,使用这种数据类型时必须指定范围和精度】,numeric(decimal的同义词)money(货币型,精确到货币的万分之一),smallmoney(货币型),float(近似数值型,供浮点数使用)等。
- 字符类型:固定长度char,nchar,可变长度varchar,国际化可变长度nvarchar。固定长度char类型的,用来保存具有固定长度的字符串。如果字符串的长度不满足所定义的长度,则用空格填充,这样在读取字符串的时候也将空格读取出来,很不方便,可变长度varchar,也需要指定一个最大长度,但是如果数据不足最大长度,数据库不会将剩下的部分用空格填充;固定长度和可变长度只能存储基于ASXII的字符,这样对于中文,日文,韩文等Unicode字符集的程序员来说就会造成存储问题,解决办法使用国际化可变长度nvarchar。
- 日期类型:smalldatetime,timestamp(时间戳),datetime时间格式为‘2008-1-1 19:22:22’
- 二进制类型:在存储一幅图片或者是一段视频的时候,就要使用二进制类型的字段,这种字段通常能够保存非常大的,没有固定结构的数据,如image,可以保存任意的二进制数据。
- 二、操作数据表
- 1、创建数据表
- create table table(id int not null,name varchar(20),age int,primary key(id));
- create table ftable(id int not null, name varchar(20) account int ,customerId int ,
- contraint fk_table_1 foreign key(customerId) refrences table(id))
- 2、修改已有表
- 添加字段: alter table表名 add 字段名字段类型
- 删除字段 alter table drop 字段名
- alter table table add sex char(2);
- alter table table drop sex;
- 3、删除数据表
- 包括清空数据表delete from 和销毁数据表 drop ,两者的区别在于,delete只是将表中的信息全部清空,但是表的矿建还在,还可以使用insert语句为表插入新的数据,而drop是将数据表直接在数据库销毁,数据表不存在了。
- delete from table
- drop table1
- delete from table where age>20 and age <40
- 4、为表插入新的数据
- insert int table (id ,name age) values(1,'wangjun',22);
- 5、更新数据
- update table1 set age=24 where name='wangjun'
- 6数据库的检索
- select * from table
- select id,name from table
- 排序:将表中的数据按照年龄的大小排序
- select * from order by desc
- desc 向下 asc向上
- 单字符通配_:匹配单个出现的字符,多字符% :匹配多次出现的字符, 集合[] :匹配满足集合要求的字符。
- select * from table where name like '_angjun';
- select * from table where name like '%y'
- select * from table where name like '[wj%]'
- select * from table where name like '[^wj%]'
- select * from table where name is null
- 多值判断
- delect * from table where age in (19,20,21)
- select * from table where age betwent 19 and 30
- 数据分组(group by)和聚合函数
- --将table表中的数据按照年龄相同的检索
- select * from table group by age
- select * from table where age >20 group by age
- 只检索人数大于2的年龄端段 having语句的使用
- select age ,count(*) as N'总人数' from table group by age having count(*)>2
- 区别:having语句是分组后的信息进行过滤,而where语句是对原始数据进行过滤
- 限制结果集行数
- select top 5 * from table order by age desc
- 联合结果集 union union all函数
- -- 查询正式员工和临时工的最高、最低年龄 ,分开查
- select '正式工的最大年龄' , max(FAge) from T_Employee
- union
- select '正式工的最小年龄' , min(FAge) from T_Employee
- union
- select '临时工的最大年龄' , max(FAge) from T_TempEmployee
- union
- select '临时工的最小年龄' , min(FAge) from T_TempEmployee
- 联合结果集使用原则:一是每个结果集必须有相同的列,二是每个结果集的列类型必须相容。
union和union all 的区别:union会自动将查询出来的结果进行重复比较如果有重复,则只显示一条,而union all 则将查询出来的结果直接显示出来。所以,在没有特殊要求下,尽量使用union all 进行连接。- 三、函数,包括数学函数,字符串函、日期函数以及其它函数等
1、数学函数,包括常用的求绝对值abs(),求指数函数power(),求平方根sprt(),求随机数rand(),舍入到最大整数celing(),舍入到最小整数floor(),四舍五入round()等。
- select abs(-12.1)
- select power(2.2)
- select rand()
- 2.字符串函数,包括计算字符串的长度,装换大小写,去掉字符串两边的空格,字符串替换,等到字符串的ASCII值等
- select len('sqlserver')
- select upper('sqlserver') --SQLSERVER
- select upper('SQLSERVER') --sqlserver
- select substring('sqlserver',4,6)
- select charindex('q','sqlserver') --
- select left('sqlserver') --sql
- select right('sqlserver') -- ver
- select replace('sqlserver','sql','SQL') --SQLserver
- select ASCII('a')
- 3、日期函数,date, time,datetime,datestamp
- 获取当前时间
- select getdate()
- 计算据今天3个月的日期
- select dateadd(month,1,getdate())
- 计算今天星期几
- select datename(weekday,getdate())
- 四、索引和约束
但一个数据表中的数据量越来越大时,检索一天记录的速度也会变慢,创建索引是一个很好的解决办法,索引提高的搜索效率,但是索引会占据一定的磁盘空间,减缓了数据插入和删除的速度,同时会造成存储碎片的问题,由于索引是采用的B树结构存储的,在删除一天记录的时候,索引项是不会被删除的,这样经过一段时间的增删改查之后就会产生存储碎片,道理通内存碎片磁盘碎片一样。
- 创建索引
- create index idx_name on table(name)
- 删除索引
- drop table.inx_name
- 约束:包括非空约束,唯一约束,复合约束,主键约束,外键约束等。
- 1、非空约束
- not null
- 2、唯一约束
- create table (id int not null ,name char(20) unique)
- 3、复合约束 ,被约束的字段不能同时重复
- create table person(
- id int not null,name varchar(20),number varchar(20) ,age int,deparUne nvarchar(20),
- constraint uni_num_deparnum unique(number,departUne),
- constraint uni_name_num unique(name,number)
- )
- 如果在创建表的时候,没有添加约束,可以利用alter来修改添加
- alter table person add constraint uni_name unique(name,number)
- 删除约束
- alter table person drop constraint uni_name
- 4、check约束
- create table person (id int not null,name vchar(20),number varchar(20),age int check(age>0))
- 5、主键约束
- create table T_Author (FId int primary key ,FName varchar(20),FAge int )
- create table T_Book (FId int primary key ,FName varchar (20),FAuthotId int ,
- foreign key ( FAuthorId) references T_Author (FId))
- 五、表连接
当数据表中存在许多重复的冗余信息时,就要考虑将这些信息建在另一张新表中,在新表中为原表设置好外键,在进行数据查询的时候,就要使用到连接了,表连接就好像两根线,线的两端分别连接两张表的不同字段上,将两个字段进行关联。表连接分为内连接(inner join)、交叉连接、自连接和外连接等。
1、内连接
- select c.name,o.number,o.price from T_order o inner join T_Customer on o.customerId = c.id where c.name='wj'
- 2、交叉连接
与内连接相比,交叉连接非常简单,不需要on子句,交叉连接将表中的所有记录都包含到结果集中,交叉连接分为隐式连接和显示的cross join连接,其中隐式的交叉连接,所有的数据库都支持,cross join 显示的cros join显示的交叉连接DB2数据库不支持。
- --隐式的交叉连接
- select T_Customer.id ,T_Customer.name,T_Customter.age,T_Order.name,T_Order,number form T_Customer ,T_Order
- --显示的交叉连接
- select T_Customer.id,T_Customer.name,T_Customer.age,T_Order.name,T_Order.number from T_Customer across join T_Order
- 3、自连接
其用途就是检索一张表中的内部情况,例如检索T_Order表中订单类型相同的订单列表
- select o1.FNumber ,o1.FName,o1.FType, o2.FNumber ,o2.FName,o2.FType
- from T_Order o1
- inner join T_Order o2 on o1.FType=o2.FType and o1.FId <o2.FId
- 4、外连接,内连接要求连接的两张表必须有匹配的记录,但是如果说T_Order表中的FCustomerId一列有null值,那么内连接是无法将这条信息查询出来的,但是我们是需要这条数据的,这样就需要外部连接了,外连接包括左外连接,右外连接和全外连接,全外连接在数据库MySql中是不支持的,所以,可以使用union all 联合两个查询语句,即左外连接查询和右外连接查询。
左外连接就是将左表中的所有数据,无论是否满足on后面的条件语句,都匹配出来。右外连接就是将右表中的所有数据都匹配出来,无论是否满足on后面的条件语句,都匹配初恋,而全外连接,就是将两个表中的所有数据,无论是否满足on后面的条件语句都匹配出来。
- --左外连接取出左表T_Customer中的所有数据,无论是否匹配 T_Customer.FId =T_Order.FCustomerId
- select c.number,c.name,o,number,o,price
- from T_Customer c
- left outer join T_Order o on T_Customer.id =T_Order,customerId
- --右外连接 取出右表T_Order中所有的数据无论是否匹配了条件
- select c.number,c.name,o.number,o.price
- from T_Customer c
- right outer join T_Order o on T_Customer.id=T_Order.CustomerId
- -- 全外连接,取出两张表中的所有数据,无论是否匹配 T_Customer.FId =T_Order.FCustomerId
- select c.FNumber ,C.FName,o.FNumber ,o.FPrice
- from T_Customer c
- full outer join T_Order o on T_Customer.FId =T_Order.FCustomerId
- 六、子查询
sql允许将一个查询语句作为结果集提供给其他sql语句使用,被当做结果集的查询语句就是子查询。可以将子查询看做是一张临时生产的数据表,这张数据表在开始时被创建,在查询结束的时候被删除。子查询可以使用在select语句,insert语句,update语句。子查询大大简化了SQL语句的编写,提高了效率,但是如果使用不当,容易造成性能问题。
1、单值子查询
单值子查询和普通的SQL语句没有什么区别,唯一的显示就是子查询的返回值必须只有一行记录,而且只能有一个列,这样的子查询也称作标量子查询。
- select 1 as f1 ,2 ,(select MIN (FYearOfPublish)from T_Book ) as N'最早出版年份',
- (select MAX (FYearOfPublish) from T_Book )as N'最晚出版年份'
- 2、列值子查询 与标量子查询不同,列值在查询可以返回一个多行多列的结果集,又称为表子查询,可以看做是一个临时的表。
select r.name,b.name,b.yearOfPublish
from T_Reader r ,(select name ,yearOfPublish from T_Book where yearOfPublish < 1800) b
- 3、集合运算符与子查询,如果子查询的结果集是多行多列的,那么可以将该子查询看做是一个临时的数据表,但是当结果集是一个多行单列的集合时,就需要使用in,any,all及exists等来查询。
- in操作符,是用来匹配多行单列的,可以简单的匹配一个集合中的某一项,比如检索在2001,2003,2005年出版的所有图书
- select * from T_Book where FYearofPublish in (2001,2003,2005)
- select * from T_Reader where FYearofJoin in (select FYearofPublis from T_Book)
- any必须和其他的比较运算符(=,<,>,!=)共同使用,不严谨的说你可以这样认为,any就是任何一个,匹配任何一个的意思,比如
- select * from T_Reader where FYearOfJoin =any ( select FYearOfPublish from T_Book )
- select * from T_Reader where FYearOfJoin <>any ( select FYearOfPublish from T_Book )
- 这两条语句前一条=any其效果适合in一样的,<>any 效果适合not in 一样的,除了=运算符,any还可以和大于小于大于等于等运算符共同使用,例如:
- -- 查询在所有会员出生之前出版的书
- select * from T_Book where FYearOfPublish <any( select FYearOfBith from T_Reader)
- exists,是否存在比较运算符,其后面的语句如果为真则返回true,否则返回false。先看一个例子:
- 在这个事例中,如果T_Reader表中存在姓名为Tom的读者信息,那么将返回T_Book表中的信息,反之,不会检索出任何信息。也就是,如果存在,则返回,不存在,则查不到任何信息,看似好像exists的作用并不是很大,但是它往往用在子查询中引用外部字段的检索中,看实例:
- -- 检索1950年以前出版的图书的图书类别
- select * from T_Category where exists (select * from T_Book where T_Book.FCategoryId =T_Category.Id and T_Book .FYearofPublis <1950 )
- 这样就会检索出在1950年以前出版的图书的信息了。
- 七、子查询在insert语句update语句中的应用
- insert语句:一般的,向一个数据表中添加一条数据就是应用insert into 表名(字段1,字段2……)values (值1,值2,……) 比如
- insert into T_Person(FId ,FName,FAge) values (1,'Tom',20)
- 但其实insert还有另外一种用法,就是insert ……select……语句,具体语法为insert into 表名(字段1,字段2……)select (值1,值2,……) from 表
- insert into T_Reader2(FId,FName,FAge) select (FId,FName,FAge) from T_Reader
- 这条语句其实就相当于复制了一个T_Reader表,将其信息插入到了T_Reader2 中。当然,insert……select 还有更复杂的用法,可以向不同结构的表中插入数据,例如:为每个读者的爱好增加“小说”,也就是为每一个读者在其T_ReaderFavorite中添加一条FCategory=1的记录(如果原先读者已经有了此爱好,就不用添加,如果没有此爱好,就添加)。
- insert into T_ReaderFavorite(FCategoryId ,FReaderId ) select 1,FId from T_Reader
- where not exists
- (
- select * from T_ReaderFavorite where T_ReaderFavorite .FCategoryId =1 and T_ReaderFavorite .FReaderId =T_Reader .FId
- )
- update语句:在update语句中子查询也可以有比较复杂的检索,例如:将所有同类图书的本数超过3本的图书的出版日期更新为2008(自连接)
- update T_Book set FYearOfPublish =2008 where (select COUNT (*) from T_Book bk2 where bk2 .FCategoryId =T_Book .FCategoryId )>3
- delete语句:例如:将所有同类图书的本数超过3本的图书删除
- delete from T_Book where (select count(*) from T_Book bk where bk.FCategoryId=T_Book.FCategoryId)>3
- 带分页的存储过程
create proc userpage(
@pageIndex int,
@pageSize int,
@pageCount int output,
@recordCount int output
)
as
begin
select * from (
select *,ROW_NUMBER() over(order by user_id) as rows from t_user) as t
where rows between (@pageIndex-1)*@pageSize and @pageIndex*@pageSize
set @recordCount=(select COUNT(*) from t_user)
set @pageCount=(CEILING(@recordCount*1.0/@pageSize))
end
- class SqlDataAdapter
- {
- static void Main()
- {
- string str = "server=localhost;uid=sa;pwd=123;database=northwind";
- SqlConnection conn = new SqlConnection(str);
- string sql = "select * from stu";
- SqlDataAdapter adptr = new SqlDataAdapter(sql, conn);//Adepter对象
- DataSet ds = new DataSet();//DataSet对象
- adptr.Fill(ds, "stu");//填充DataSet 并为当前表命名
- DataTableReader rdr = ds.CreateDataReader();
- while (rdr.Read())//读取表中数据
- {
- for (int i = ; i < rdr.FieldCount; i++)
- {
- Console.Write(rdr.GetName(i) + "\t" + rdr.GetValue(i) + "\t");
- }
- Console.WriteLine();
- }
- }
SqlServer基础复习的更多相关文章
- 《CSS权威指南》基础复习+查漏补缺
前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- Java基础复习笔记系列 四 数组
Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...
- Data Base sqlServer基础知识
sqlServer 基础知识 大纲 创建数据库 1 创建表 2 备份表 3 删除表 4 修改表 5 查询出重复的数据 6 增删改查 7 添加约束 8 分页存储过程 9 排序 10 类型转换 11 ...
- C语言基础复习总结
C语言基础复习总结 大一学的C++,不过后来一直没用,大多还给老师了,最近看传智李明杰老师的ios课程的C语言入门部分,用了一周,每晚上看大概两小时左右,效果真是顶一学期的课,也许是因为有开发经验吧, ...
- JS基础 复习: Javascript的书写位置
爱创课堂JS基础 复习: Javascript的书写位置复习 js书写位置:body标签的最底部.实际工作中使用书写在head标签内一对script标签里.alert()弹出框.console.log ...
随机推荐
- iOS--手势之谜
原文转至: http://www.cnblogs.com/huangjianwu/p/4675648.html iOS在手机APP的手势操作中包含了:拖动.捏合.旋转.点按.长按.轻扫.自定义等等,详 ...
- GCD深入学习(1)dispatch_semaphore
dispatch_semaphore信号量是一种基于计数器的一种多线程同步机制 在多个线程访问共有资源的时候,会因为多线程的特性引发数据出错. - (void)addData { dispatch_q ...
- android gradle NDK简介
本章介绍在Android开发中,关于NDK,gradle相关的知识点. 1.NDK简介 (1)NDK是一系列工具的集合 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将s ...
- PHP(第一天)
<?php // $name='lisi'; // $age =18; //$bol =true; //$bol =false; // echo ($bol); //echo ('name is ...
- iOS 本地推送通知
1.什么是本地推送通知 不需要联网的情况下,应用程序经由系统发出的通知 2.本地推送的使用场景 定时提醒,如玩游戏.记账.闹钟.备忘录等 3.实现本地推送通知的步骤 创建本地推送通知的对象UILoca ...
- 学习Swift的点点滴滴
1.类型标注 之前不知道为啥别人写的Swift语言的时候,定义常量或者变量的格式是 常量: let 常量名: 常量类型 = 常量值 或者 变量: var 变量名: 变量类型 = 初始值 原来书上有记 ...
- Git的冲突解决过程
下面图是我总结一次提交遇到冲突解决的过程. 1. 把本地工作区的修改提交到本地仓库 2. 从远程仓库拉取代码,与本地仓库合并(pull = fetch + merge) 3. 本地仓库的代码推送回工作 ...
- Oracle监听服务启动失败案例
在ORACLE测试服务器上还原恢复了一个数据库后,启动监听服务时出现了TNS-12541, TNS-12560,TNS-00511之类的错误,具体情况如下所示: [oracle@getlnx01 ad ...
- Oracle Linux(64位)安装64位Oracle10g遇到ins_ctx.mk问题
在Oracle Linux Server Release 5.7上安装64位Oracle 10g 时,遇到如下问题: Error in invoking target 'install' of mak ...
- oracle行转列与列转行
一.行转列 在有些应用场景中,如学生成绩.学生所有科目的成绩都保存到一张表里面,当我们需要以列表的形式显示出学生所对应的每一科目的成绩的时候,需要使用到行转列. 示例 -- 学生成绩表 create ...