第一章 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语言基础》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. collectd使用

    1.什么是collectd collectd是一款基于C语言研发的插件式架构的监控软件,它可以收集各种来源的指标,如操作系统,应用程序,日志文件和外部设备,并存储此信息或通过网络提供.这些统计数据可用 ...

  2. Java编程思想 学习笔记8

    八.多态  在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征. 多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来. “封装”通过合并特征和行为来创建新的数据类型.“实现 ...

  3. python 的正则表达式指北

    正则表达式用来拆分字符串 >>> s = 'one1two2three3four4' >>> pattern = re.compile(r'\d+') >&g ...

  4. 通过read()读文件

    一.在POSIX中的定义 #include <unistd.h> ssize_t read(int fd, void *buf, size_t len); 二.调用read()的可能结果 ...

  5. Java SE之Java中堆内存和栈内存[转/摘]

    [转/摘]1-3Java中堆内存和栈内存 注解:内存(Memory)即 内存储器,主存,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器(辅存)交换的数据. Java中把内存分为两种:栈 ...

  6. CF875F Royal Questions

    传送门 似乎可以按边权排序后二分图匹配 这里给一个复杂度稳定的算法 把一个公主能匹配的两个点连边,然后依次加边,每当加到一个大小为\(n\)的连通块中有\(n\)条边之后,这时形成了基环树,将这些边定 ...

  7. 以前的 Delphi版本

                    Delphi 1 Delphi 2 Delphi 3 Delphi 4 Delphi 5 Delphi 6 Delphi 7 Delphi 8 Delphi 2005

  8. JavaScript练习 - 正反选练习

    正反选练习 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  9. geeksforgeeks-Array-Rotate and delete

    As usual Babul is again back with his problem and now with numbers. He thought of an array of number ...

  10. struts2在配置文件与JSP中用OGNL获取Action属性

    参考:Struts与OGNL结合 struts2在配置文件中可以调用Action的属性,在JSP页面也可以取出Action的属性值(前提是属性有get,set方法). 第一个例子: 1.Action中 ...