SQLServer学习笔记系列1
一.前言
一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流!
不当之处请斧正!在此感谢!这边就先从学习Sqlserver写起,自己本身对数据库方面不擅长,所以决定对此从基础开始学习,
大牛们对此文可以忽略!首先以《Sqlserver2008技术内幕》这本书作为学习的指导,大家如果觉得这本书不错的话,
可以去网上买一本,作为菜鸟的我,觉得这本书对于入门介绍的还是非常不错的。
请戳我:http://item.jd.com/10067484.html#none。
二.Sqlserver基础知识
(1)创建数据库
创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库。
脚本如下:
- ---------------------------------------------------------------------
- -- Microsoft SQL Server 2008 T-SQL Fundamentals
- --
- -- Script that creates the sample database TSQLFundamentals2008
- --
- -- Supported versions of SQL Server: 2005, 2008
- --
- -- Based originally on the Northwind sample database
- -- with changes in both schema and data to fit the book's needs
- --
- -- Last updated: 20081202
- ---------------------------------------------------------------------
- ---------------------------------------------------------------------
- -- Create Database
- ---------------------------------------------------------------------
- USE master;
- -- Drop database
- IF DB_ID('TSQLFundamentals2008') IS NOT NULL DROP DATABASE TSQLFundamentals2008;
- -- If database could not be created due to open connections, abort
- IF @@ERROR = 3702
- RAISERROR('Database cannot be dropped because there are still open connections.', 127, 127) WITH NOWAIT, LOG;
- -- Create database
- CREATE DATABASE TSQLFundamentals2008;
- GO
- USE TSQLFundamentals2008;
- GO
- ---------------------------------------------------------------------
- -- Create Schemas
- ---------------------------------------------------------------------
- CREATE SCHEMA HR AUTHORIZATION dbo;
- GO
- CREATE SCHEMA Production AUTHORIZATION dbo;
- GO
- CREATE SCHEMA Sales AUTHORIZATION dbo;
- GO
- ---------------------------------------------------------------------
- -- Create Tables
- ---------------------------------------------------------------------
- -- Create table HR.Employees
- CREATE TABLE HR.Employees
- (
- empid INT NOT NULL IDENTITY,
- lastname NVARCHAR(20) NOT NULL,
- firstname NVARCHAR(10) NOT NULL,
- title NVARCHAR(30) NOT NULL,
- titleofcourtesy NVARCHAR(25) NOT NULL,
- birthdate DATETIME NOT NULL,
- hiredate DATETIME NOT NULL,
- address NVARCHAR(60) NOT NULL,
- city NVARCHAR(15) NOT NULL,
- region NVARCHAR(15) NULL,
- postalcode NVARCHAR(10) NULL,
- country NVARCHAR(15) NOT NULL,
- phone NVARCHAR(24) NOT NULL,
- mgrid INT NULL,
- CONSTRAINT PK_Employees PRIMARY KEY(empid),
- CONSTRAINT FK_Employees_Employees FOREIGN KEY(mgrid)
- REFERENCES HR.Employees(empid),
- CONSTRAINT CHK_birthdate CHECK(birthdate <= CURRENT_TIMESTAMP)
- );
- CREATE NONCLUSTERED INDEX idx_nc_lastname ON HR.Employees(lastname);
- CREATE NONCLUSTERED INDEX idx_nc_postalcode ON HR.Employees(postalcode);
- -- Create table Production.Suppliers
- CREATE TABLE Production.Suppliers
- (
- supplierid INT NOT NULL IDENTITY,
- companyname NVARCHAR(40) NOT NULL,
- contactname NVARCHAR(30) NOT NULL,
- contacttitle NVARCHAR(30) NOT NULL,
- address NVARCHAR(60) NOT NULL,
- city NVARCHAR(15) NOT NULL,
- region NVARCHAR(15) NULL,
- postalcode NVARCHAR(10) NULL,
- country NVARCHAR(15) NOT NULL,
- phone NVARCHAR(24) NOT NULL,
- fax NVARCHAR(24) NULL,
- CONSTRAINT PK_Suppliers PRIMARY KEY(supplierid)
- );
- CREATE NONCLUSTERED INDEX idx_nc_companyname ON Production.Suppliers(companyname);
- CREATE NONCLUSTERED INDEX idx_nc_postalcode ON Production.Suppliers(postalcode);
- -- Create table Production.Categories
- CREATE TABLE Production.Categories
- (
- categoryid INT NOT NULL IDENTITY,
- categoryname NVARCHAR(15) NOT NULL,
- description NVARCHAR(200) NOT NULL,
- CONSTRAINT PK_Categories PRIMARY KEY(categoryid)
- );
- CREATE INDEX categoryname ON Production.Categories(categoryname);
- -- Create table Production.Products
- CREATE TABLE Production.Products
- (
- productid INT NOT NULL IDENTITY,
- productname NVARCHAR(40) NOT NULL,
- supplierid INT NOT NULL,
- categoryid INT NOT NULL,
- unitprice MONEY NOT NULL
- CONSTRAINT DFT_Products_unitprice DEFAULT(0),
- discontinued BIT NOT NULL
- CONSTRAINT DFT_Products_discontinued DEFAULT(0),
- CONSTRAINT PK_Products PRIMARY KEY(productid),
- CONSTRAINT FK_Products_Categories FOREIGN KEY(categoryid)
- REFERENCES Production.Categories(categoryid),
- CONSTRAINT FK_Products_Suppliers FOREIGN KEY(supplierid)
- REFERENCES Production.Suppliers(supplierid),
- CONSTRAINT CHK_Products_unitprice CHECK(unitprice >= 0)
- );
- CREATE NONCLUSTERED INDEX idx_nc_categoryid ON Production.Products(categoryid);
- CREATE NONCLUSTERED INDEX idx_nc_productname ON Production.Products(productname);
- CREATE NONCLUSTERED INDEX idx_nc_supplierid ON Production.Products(supplierid);
- -- Create table Sales.Customers
- CREATE TABLE Sales.Customers
- (
- custid INT NOT NULL IDENTITY,
- companyname NVARCHAR(40) NOT NULL,
- contactname NVARCHAR(30) NOT NULL,
- contacttitle NVARCHAR(30) NOT NULL,
- address NVARCHAR(60) NOT NULL,
- city NVARCHAR(15) NOT NULL,
- region NVARCHAR(15) NULL,
- postalcode NVARCHAR(10) NULL,
- country NVARCHAR(15) NOT NULL,
- phone NVARCHAR(24) NOT NULL,
- fax NVARCHAR(24) NULL,
- CONSTRAINT PK_Customers PRIMARY KEY(custid)
- );
- CREATE NONCLUSTERED INDEX idx_nc_city ON Sales.Customers(city);
- CREATE NONCLUSTERED INDEX idx_nc_companyname ON Sales.Customers(companyname);
- CREATE NONCLUSTERED INDEX idx_nc_postalcode ON Sales.Customers(postalcode);
- CREATE NONCLUSTERED INDEX idx_nc_region ON Sales.Customers(region);
- -- Create table Sales.Shippers
- CREATE TABLE Sales.Shippers
- (
- shipperid INT NOT NULL IDENTITY,
- companyname NVARCHAR(40) NOT NULL,
- phone NVARCHAR(24) NOT NULL,
- CONSTRAINT PK_Shippers PRIMARY KEY(shipperid)
- );
- -- Create table Sales.Orders
- CREATE TABLE Sales.Orders
- (
- orderid INT NOT NULL IDENTITY,
- custid INT NULL,
- empid INT NOT NULL,
- orderdate DATETIME NOT NULL,
- requireddate DATETIME NOT NULL,
- shippeddate DATETIME NULL,
- shipperid INT NOT NULL,
- freight MONEY NOT NULL
- CONSTRAINT DFT_Orders_freight DEFAULT(0),
- shipname NVARCHAR(40) NOT NULL,
- shipaddress NVARCHAR(60) NOT NULL,
- shipcity NVARCHAR(15) NOT NULL,
- shipregion NVARCHAR(15) NULL,
- shippostalcode NVARCHAR(10) NULL,
- shipcountry NVARCHAR(15) NOT NULL,
- CONSTRAINT PK_Orders PRIMARY KEY(orderid),
- CONSTRAINT FK_Orders_Customers FOREIGN KEY(custid)
- REFERENCES Sales.Customers(custid),
- CONSTRAINT FK_Orders_Employees FOREIGN KEY(empid)
- REFERENCES HR.Employees(empid),
- CONSTRAINT FK_Orders_Shippers FOREIGN KEY(shipperid)
- REFERENCES Sales.Shippers(shipperid)
- );
- CREATE NONCLUSTERED INDEX idx_nc_custid ON Sales.Orders(custid);
- CREATE NONCLUSTERED INDEX idx_nc_empid ON Sales.Orders(empid);
- CREATE NONCLUSTERED INDEX idx_nc_shipperid ON Sales.Orders(shipperid);
- CREATE NONCLUSTERED INDEX idx_nc_orderdate ON Sales.Orders(orderdate);
- CREATE NONCLUSTERED INDEX idx_nc_shippeddate ON Sales.Orders(shippeddate);
- CREATE NONCLUSTERED INDEX idx_nc_shippostalcode ON Sales.Orders(shippostalcode);
- -- Create table Sales.OrderDetails
- CREATE TABLE Sales.OrderDetails
- (
- orderid INT NOT NULL,
- productid INT NOT NULL,
- unitprice MONEY NOT NULL
- CONSTRAINT DFT_OrderDetails_unitprice DEFAULT(0),
- qty SMALLINT NOT NULL
- CONSTRAINT DFT_OrderDetails_qty DEFAULT(1),
- discount NUMERIC(4, 3) NOT NULL
- CONSTRAINT DFT_OrderDetails_discount DEFAULT(0),
- CONSTRAINT PK_OrderDetails PRIMARY KEY(orderid, productid),
- CONSTRAINT FK_OrderDetails_Orders FOREIGN KEY(orderid)
- REFERENCES Sales.Orders(orderid),
- CONSTRAINT FK_OrderDetails_Products FOREIGN KEY(productid)
- REFERENCES Production.Products(productid),
- CONSTRAINT CHK_discount CHECK (discount BETWEEN 0 AND 1),
- CONSTRAINT CHK_qty CHECK (qty > 0),
- CONSTRAINT CHK_unitprice CHECK (unitprice >= 0)
- )
- CREATE NONCLUSTERED INDEX idx_nc_orderid ON Sales.OrderDetails(orderid);
- CREATE NONCLUSTERED INDEX idx_nc_productid ON Sales.OrderDetails(productid);
- GO
同时往数据库表插入一些数据,用户后续对数据库的sql的练习。在这里有需要的可以下载相应的脚本进行数据库的初始化。
我放到百度云上面,请戳我:http://yun.baidu.com/share/link?shareid=3635107613&uk=2971209779,
提供了《Sqlserver2008技术内幕》这本书的电子版和脚本。
(2)在这里对TSQLFundamentals2008数据各个表进行表说明一下:
数据库表界面如下:
HR.Employees |
雇员表,存放员工的一些基本信息。 |
Production.Products |
产品信息表 |
Production.Suppliers |
供应商表 |
Production.Customers |
顾客信息表 |
Production.Categories |
产品类别表 |
Sales.OrderDetails |
订单详情表 |
Sales.Orders |
订单表 |
Sales.Shippers |
货运公司表 |
三.Sqlserver一些基本命令:
查询数据库是否存在:
if DB_ID("testDB")is not null;
检查表是否存在:
if OBJECT_ID(“textDB”,“U”) is not null ;其中U代表用户表
创建数据库:
create database+数据名
删除数据库:
drop database 数据库名 --删除数据库的
drop table 表名--删除表的
delete from 表名 where 条件 --删除数据的
查询语句:
use 数据库名称 --修改的数据库
select*from +表名称 --要查询的表
select某某,某某,某某 from 表名称 where 条件 --带条件查询的数据
插入数据:
insert into 表名称 (条件)values (相对应的值)
四.单表查询
(1)分组--对于分组查询,select字句会有限制,需要查询字段要出现在group by 子句中,同时分组以后,可以对分组情况进行统计。
查询雇员表,根据雇员所在国家分组,统计每组的人数情况:
- select country,count(*) as N'人数'
- from hr.Employees
- group by country
当要查询的字段不包含在group by子句中,则会报相应的错误,所以此时要注意出现在select 后面的查询字段进行分组后,也同时需要出现在group by后面。
(2)在这里提示一下:查询条件不要使用计算列,下面谈谈具体原因:
例如:查询雇员表里面雇员出生为1973年的所有雇员信息,可以这样编写sql语句:
- select YEAR(birthdate),firstname,lastname from HR.Employees
- where YEAR(birthdate)=''
可以看到查询结果将1973年的雇员信息查出来了,但是大家可以思考一下,上面的sql语句在查询的时候,首先是要讲birthdate进行取出年度的计算,
Year(birthdate),其中Year为sql的内置函数,可以用于对字符串日期进行取出年份的计算。同时我们还可以采用下面的sql语句进行查询:
通过sql执行计划可以看出来,查询条件带计算列走的是索引扫描,而where子句后面采用查找范围限制,则走的是索查找。对比两个查询显然绝大部分情况下
走索引查找的查询性能要高于走索引扫描,特别是查询的数据库不是非常大的情况下,索引查找的消耗时间要远远少于索引扫描的时间。所以在查询条件中尽
量避免计算条件。
(3)说说sqlserver中的null,null在数据库中表示不存在,与C#中的null不同,不表示空引用,没有对象,NULL的运算规则:有null的任何运算都是null。
is [not] null: 只能用做条件判断表达式,是否是null?是 条件为true,不是 条件为false。
isnull():函数,如果第一个参数是null,则用第二个参数的值替换第一个参数的值作为函数的返回值。记住:第二个参数的类型必须和第一个兼容。
nullif():函数,如果两个参数值相等、有一个参数是null、或两个参数是null,函数返回值是null;否则返回第一个参数的值。
(4)top用法:意在取出表中满足条件的前多少位。top 10---前10位
说到top,突然想到了面试题中经常出现的查询某表中的前30—40条记录,注意id可能不连续。利用top可以这样写:
- select top 10 * from A where ID
- not in(select top 30 ID from A order by ID asc)
- order by ID asc
同时也可以采用如下写法,只不过可读性比较差:
- select top 10 * fron A where ID>
- (select Max(ID) from (select top 30 ID from A order by ID)as t)
- order by ID asc
当然既然有范围in存在,就可以用exist实现:
- select top 10 * from A a1
- WHERE NOT EXISTS
- (SELECT * from
- (SELECT TOP 30 * FROM A ORDER BY id asc) a2
- WHERE a2.id =a1.id
- )
但是目前需要考虑到----相关子查询:主查询每遍历一条记录时,都要针对主查询的值执行子查询,所以效率比较低。
下面介绍一下top与percent联合使用,percent表示所占的百分比:例如查询雇员表里面,前面百分之二十的雇员的信息,可以写sql,查询结果为两人。
- select top(20) percent * from hr.employees
我们在查询一下hr.employees(雇员表),同时查询一下雇员表里面总共有多少人,查出结果显示有9人。
- select count(*) as N'总人数' from hr.employees
可以看出,9个人按百分之二十取整数了,所以查出来的显示有两个人。
(5)with ties附加属性:
当我们查询订单表时,查询sql:
- select orderid,orderdate
- from sales.orders order by orderdate desc
加入我们查询前五个订单信息时候,加入top 5
- select top 5 orderid,orderdate
- from sales.orders order by orderdate desc
查询结果如图:
对比没有加top 5,查询结果截取了前五条订单信息,但是有时候我们需要将与最后一条订单日期相同的一起取出来,此时就需要采用附加属性with ties。
(6)over开窗函数:
上面讲到要用count聚合函数,在需要分组求和。但采用over 则可以同样实现基于什么的求和。省去group by。
- select firstname,lastname ,count(*) over() as N'总人数'
- from hr.employees
其中over(),括号里面可以附加条件,基于什么进行汇总。不添加,则表示对所有的记录进行汇总。例如求每位顾客所消费的订单总额,可以这样写:
- select orderid,custid,sum(val) over (partition by custid) as N'顾客消费总额',
- sum(val) over() as N'订单总额' from sales.ordervalues
五.排名函数
(1)row_number,行号,一般与over联合使用。over基于什么排名。
- select row_number() over(order by lastname) as N'行号', lastname,firstname
- from hr.employees
(2)rank ,排名,真正意义上的排名,例如:
- select country,row_number() over(order by country) as N'rank排名', lastname,firstname
- from hr.employees
可以看出,根据country排名,确实排出来啦,但是发现前四位同为UK,按理来说使部分先后顺序的,所以在此可以用rank来操作。
- select country,rank() over(order by country) as N'rank排名', lastname,firstname
- from hr.employees
可以看出来,使用rank以后,country同为UK的并列第一,类似于学生考试成绩排名并列第一的情况。
(3)dense_rank,密集排名
通过上面rank排名以后,存在并列第一的情况,但是country为USA的应该为第二,所以就出现了使用密集排名dense_rank进行排名。
- select country,dense_rank() over(order by country) as N'dense_rank排名', lastname,firstname
- from hr.employees
可以看出采用dense_rank以后,就满足了某一条件下,同属一个名次的需求。
(4)分组ntile。按某一条件进行分组。
- select country,ntile(3) over (order by country) as N'ntile分组',dense_rank() over(order by country) as N'dense_rank排名', lastname,firstname
- from hr.employees
- order by country
有时候为了在某一个范围内进行排序,比如:
- select lastname,firstname,country,row_number() over( order by country) as N'排名'
- from hr.employees
为了实现根据在country范围内排序,即country为Uk的为一组进行排序,country为USA的为一组进行排序。可以这样写:
- select lastname,firstname,country,row_number() over( partition by country order by country) as N'排名'
- from hr.employees
希望各位大牛给出指导,不当之处虚心接受学习!谢谢!
SQLServer学习笔记系列1的更多相关文章
- SQLServer学习笔记系列3
一.写在前面的话 今天又是双休啦!生活依然再继续,当你停下来的时候,或许会突然显得不自在.有时候,看到一种东西,你会发现原来在这个社会上,优秀的人很多,默默 吃苦努力奋斗的人也多!星期五早上按时上班, ...
- SQLServer学习笔记系列2
一.写在前面的话 继上一次SQLServer学习笔记系列1http://www.cnblogs.com/liupeng61624/p/4354983.html以后,继续学习Sqlserver,一步一步 ...
- SQLServer学习笔记系列6
一.写在前面的话 时间是我们每个人都特别熟悉的,但是到底它是什么,用什么来衡量,可能很多人会愣在那里.时间可以见证一切,也可以消磨一切,那些过往的点点滴滴可思可忆.回想往年清明节过后,在家乡的晚上总能 ...
- SQLServer学习笔记系列5
一.写在前面的话 转眼又是一年清明节,话说“清明时节雨纷纷”,武汉的天气伴随着这个清明节下了一场暴雨,整个城市如海一样,朋友圈渗透着清明节武汉看海的节奏.今年又没有回老家祭祖,但是心里依然是怀念着那些 ...
- SQLServer学习笔记系列4
一.写在前面的话 好多天没有记录sql学习笔记了,要坚持下去,坚信每一点的进步都是为在积蓄力量.今天看到一幅图,特此分享出来. 通过这幅图,我看到的是每人站在自己的角度看问题,感受是不一样的,就如同学 ...
- SQLServer学习笔记系列12
一.写在前面的话 这个sql学习系列,今天准备告一段落,虽然短短的十几篇文章,深刻感受到将学习的东西记录下来,是需要一种坚持! 这些东西只有反复的学习吸收,最终沉淀下来的才是属于自己的知识.也是提醒自 ...
- SQLServer学习笔记系列11
一.写在前面的话 身体是革命的本钱,这句放在嘴边常说的话,还是拿出来一起共勉,提醒一起奋斗的同僚们,保证睡眠,注意身体!偶尔加个班,也许不曾感觉到身体发出的讯号,长期晚睡真心扛不住!自己也制定计划,敦 ...
- SQLServer学习笔记系列10
一.写在前面的话 生活的路很长,还是要坚持走下去,自己选择的生活,就该让这样的生活放射精彩!我不奢求现在的积累,在将来能够收获多少,至少在以后的日子里回忆起来,我不曾放弃过,我坚持过,我不后悔!最近跟 ...
- SQLServer学习笔记系列8
一.写在前面的话 最近一直在思考一个问题,什么才能让我们不显得浮躁,真正的静下心来,用心去感受,用心去回答每个人的问题,用心去帮助别人.现实的生活,往往让我们显得精疲力尽,然后我们仔细想过没用,其实支 ...
随机推荐
- c#与java的区别
经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...
- .NET Core系列 :4 测试
2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...
- 让姑姑不再划拳 码农也要有原则 : SOLID via C#
“姑娘,别这样.我们是有原则的.” “一个有原则的程序猿是不会写出 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去.” “对,是时候和那些只会滚键盘的麻瓜不同了, ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- 走进缓存的世界(三) - Memcache
系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 简介 Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用 ...
- bzoj1079--记忆化搜索
题目大意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得 ...
- “风投云涌”:那些被资本看中的IT企业的风光与辛酸
进入七月份以来,纷享销客获得D轮融资1亿美元,撼动业界,资本与IT联姻令一部分创业者眼红的同时,没有人注意到背后的风险. 科技与资本的结合,是当今经济社会前行的宏大主题.相关统计显示,软件行 ...
- 高仿it之家新闻客户端源码
仿it之家新闻客户端界面,数据为本地假数据.仅实现了新闻模块的功能. 源码下载:http://code.662p.com/list/11_1.html 详细说明:http://android.662p ...
- MongoDB学习笔记~对集合属性的操作
回到目录 $unset清除元素 请注意在单个数组元素上使用$unset的结果可能与你设想的不一样.其结果只是将元素的值设置为null,而非删除整个元素.要想彻底删除某个数组元素,可以用$pull 和$ ...
- Linux硬件IO的优化简介
Linux硬件IO的优化简介 首先简单介绍下有哪些硬件设备如下(由于硬件种类厂家等各种因素我就不在此多做介绍有兴趣的可以自行学习): 1.CPU:中央处理器,是计算机运算控制的核心部件之一,相当于人的 ...