《microsoft sql server 2008技术内幕 t-sql语言基础》
第一章 TSQL编程基础
源代码下载:TSQLFundamentals2008
创建表
USE testdb;
CREATE TABLE dbo.Employess
(
empid INT NOT NULL,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
hiredate DATE NOT NULL,
mgrid INT NULL,
ssn VARCHAR(20) NOT NULL,
salary MONEY NOT NULL
)
- 主键约束
ALTER TABLE Employess
ADD CONSTRAINT PK_Employess
PRIMARY KEY(empid)
- 唯一约束
--唯一约束
ALTER TABLE Employess
ADD CONSTRAINT UN_Employess_ssn
UNIQUE(ssn)
- 外键约束
外键约束用于实施的完整性。在引用表的一组属性上进行定义,并指向被引用表中的一组候选键。引用表和被引用表可能是同一个表。
外键的目的是为了将外键列允许的值域限制为被引用列中的现有的值。
--创建订单表
CREATE TABLE Orders
(
orderid INT NOT NULL,
empid INT NOT NULL,
custid VARCHAR(10) NOT NULL,
orderts DATETIME NOT NULL,
qty INT NOT NULL,
CONSTRAINT PK_Orders
PRIMARY KEY(orderID)
);
--将Orders 表的 empid 列支持的值域限制为现有Employees 表中empid列。
ALTER TABLE Orders
ADD CONSTRAINT FK_Orders_Employees
FOREIGN KEY(empid)
REFERENCES Employess(empid);
- 检查约束
检查约束用于定义在表中输入或修改一行数据前必须满足得一个谓词。
例如,检查约束可以保证 Employees 表的 salary 列只支持正数:
ALTER TABLE Employess
ADD CONSTRAINT CHK_Emplyees_salary
CHECK(salary>0);
- 默认约束
插入数据,没有显示指定值,可以用表达式为其默认值。
ALTER TABLE Orders
ADD CONSTRAINT DTF_Orders_orderts
DEFAULT(CURRENT_TIMESTAMP) FOR orderts
主键约束:列内容不能重复,且不能为空
外键约束:内容必须是所关联主键的值其中的值
空值约束:不能为空
默认约束:当插入时没有赋值,会使用默认值
唯一约束:列的内容都是唯一的,不以重复
检查约束:列的内容必须符合要求。如CHECK (JOB IN(‘Engineer’,’Sales’,’Manager’));
第二章 单表查询
练习题:
1.返回2007年6月的订单,数据库:TSQLFundamentals2008,表:Sales.Orders
期望的输出:
(30 row(s) affected)
2.(可选,高级)
返回每个月的最后一天生成的订单。表:Sales.Orders
期望的输出:
3.返回姓氏(last name)包含字母‘a’两次或更多的雇员。涉及表:HR.Employees
期望的输出:
4.返回总价格(数量*单价)大于10000的所有订单,并按总价格排序。涉及表:Sales.OrderDetails
期望的输出:
5.返回2007年平均运费最高的三个发货国家。涉及表:Sales.Orders
期望的输出:
6.为每个顾客单独根据订单日期的顺序(用 orderID作为附加属性)来计算其订单的行号。涉及表:Sales.Orders
期望的输出:
7.构造一个 SELECT 语句,让它根据每个雇员的友好称谓,而返回其性别,对于‘Ms.’ 和 ‘Mrs.’,则返回 'Female';
对于'Mr.',则返回'Male';对于其他情况(例如'Dr.'),则返回 'Unkonwn'。涉及表:HR.Employees
期望的输出:
8.返回每个客户的客户ID和所在区域。对输出中的行按区域排序,NULL 值排在最后面(在所有非 NULL 值之后)。注意,T-SQL中 NULL 值的默认排序行为是把 NULL 值排在前面(所有非 NULL 值之前)。涉及表:Sales.Customers 表
期望的输出:
--1.返回2007年6月的订单
SELECT orderid,orderdate,custid,empid
FROM Sales.Orders
WHERE YEAR(orderdate) = 2007
AND MONTH(orderdate) = 6;
--2.返回每个月的最后一天生成的订单
-- MONTH(DATEADD(day,1,orderdate)) <> MONTH(orderdate)
-- orderdate+1天的月份数不等于当前月
SELECT * FROM Sales.Orders
WHERE orderdate = (CASE when MONTH(DATEADD(day,1,orderdate)) <> MONTH(orderdate) THEN orderdate
ELSE NULL END)
--3.返回姓氏(last name)包含字母‘a’两次或更多的雇员
-- LEN(lastname) - LEN(REPLACE(lastname, 'a', ''))
-- lastname字段字符‘a’出现的次数 = lastname的长度 - lastname字段把a去掉后的长度
SELECT empid,firstname,lastname
FROM HR.Employees
WHERE LEN(lastname) - LEN(REPLACE(lastname, 'a', '')) >= 2;
--4.返回总价格(数量*单价)大于10000的所有订单,并按总价格排序。
SELECT orderid, SUM(unitprice*qty) as totalvalue FROM Sales.OrderDetails
GROUP BY (orderid)
HAVING SUM(unitprice*qty)>10000
ORDER BY totalvalue DESC
--5.返回2007年平均运费最高的三个发货国家
SELECT TOP(3) AVG(freight) AS avgfreight,shipcountry FROM Sales.Orders
WHERE YEAR(orderdate)=2007
GROUP BY shipcountry
ORDER BY avgfreight DESC
--6.为每个顾客单独根据订单日期的顺序(用 orderID作为附加属性)来计算其订单的行号。
SELECT custid, orderdate, orderid,
ROW_NUMBER() OVER ( PARTITION BY custid ORDER BY orderdate ) AS rownum
FROM Sales.Orders
ORDER BY custid;
--7.构造一个 SELECT 语句,让它根据每个雇员的友好称谓,而返回其性别,对于‘Ms.’ 和 ‘Mrs.’,则返回 'Female';
--对于'Mr.',则返回'Male';对于其他情况(例如'Dr.'),则返回 'Unkonwn'。
SELECT empid, firstname, lastname, titleofcourtesy,
CASE WHEN titleofcourtesy = 'Ms.'
OR titleofcourtesy = 'Mrs.' THEN 'Female'
WHEN titleofcourtesy = 'Mr.' THEN 'Male'
ELSE 'Unkonwn'
END AS gender
FROM HR.Employees;
--8.返回每个客户的客户ID和所在区域。对输出中的行按区域排序,NULL 值排在最后面(在所有非 NULL 值之后)。
--注意,T-SQL中 NULL 值的默认排序行为是把 NULL 值排在前面(所有非 NULL 值之前)。
SELECT custid,region
FROM Sales.Customers
ORDER BY
(CASE WHEN region IS NULL THEN 1 ELSE 0 END)
《microsoft sql server 2008技术内幕 t-sql语言基础》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- c# 打印 bartender
参考: 官网 https://www.seagullscientific.com/label-software/barcode-label-design-and-printing 文章 http:/ ...
- 从匿名函数(闭包特性)到 PHP 设计模式之容器模式
匿名函数(匿名函数) 匿名函数,也叫闭包函数,它允许临时创建一个没有指定名称的函数,常用作回调函数参数的值,也可以作为变量的值来使用.具体的使用见以下示例代码: /* 示例一:声明一个简单匿名函数,并 ...
- C# 实现线段的编码裁剪算法(vs2010)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 10 SpringBoot全面接管SpringMVC
Spring Boot官方文档描述 If you want to keep Spring Boot MVC features and you want to add additional MVC co ...
- Unity3d跨平台原理
知乎的一个提问:unity3d跨平台原理 一些资料: IL IL是.NET框架中中间语言(Intermediate Language)的缩写.使用.NET框架提供的编译器可以直接将源程序编译为.exe ...
- Linux 4.10.8 根文件系统制作(三)---制作yaffs文件系统
这里直接用的是韦东山提供的工具. yaffs文件系统是专门用于nandflash的文件系统 我们前面已经下载了yaffs 的源码,也做了文件系统目录的构建. 在yaffs2的源码目录中有一个utils ...
- spfa判负环
bfs版spfa void spfa(){ queue<int> q; ;i<=n;i++) dis[i]=inf; q.push();dis[]=;vis[]=; while(!q ...
- 20155313 2016-2017-2 《Java程序设计》第五周学习总结
20155313 2016-2017-2 <Java程序设计>第五周学习总结 教材内容学习 第八章 异常处理 程序中总有些意想不到的状况所引发的错误,Java中的错误也以对象方式呈现为ja ...
- dense prediction
Dense prediction fully convolutional network for sementic segmentation 先用feature extractor 提特征,然后再使 ...
- Linux - 系统资源
查看剩余内存 free -m #-/+ buffers/cache: #6458M为真实使用内存 1649M为真实剩余内存(剩余内存+缓存+缓冲器) #linux会利用所有的剩余内存作为缓存,所以要保 ...