第一章 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. springSession框架来实现sso单点登陆

    介绍一下springsession这个框架,其实springsession框架默认的是使用redis来实现单点登陆的,但是不支持redis集群,这个框架的特点是无侵入的实现单点登陆,就是说我们之前获取 ...

  2. git使用详细过程

    1. Git概念 1.1. Git库中由三部分组成        Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而 ...

  3. Calendar add 方法 和set方法

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c = Calendar. ...

  4. SQL语句(二)创建带主键和约束的数据表

    内容摘要 创建带主键和约束的表 创建带组合主键和外键的表 1. 创建带主键和约束的表 Student (学生表) CREATE TABLE Student ( sclass ) NOT NULL, - ...

  5. linux4.10.8 内核移植(二)---初步裁剪、分区修改和文件系统

    一.初步裁剪 在内核根目录下 执行: make menuconfig 1.1 system type裁剪 选择 SAMSUNG S3C24XX SoCs Support 进入其中,这里是配置我们的单板 ...

  6. 基于802.11Fuzz技术的研究

    转自安全客 关于无线的Fuzz最开始接触了解时,国内基本毛线都搜不到.经过几个月的资料搜集和学习,将大约全网的fuzz资料整理翻译分析并读懂写下,就为填补国内空白,也希望无线爱好者能多多交流. 在各个 ...

  7. Java基础编程题——打印九九乘法表

    package com.yangzl.basic; /** * 九九乘法表 * @author Administrator * */ public class Nine_Nine_Multiplica ...

  8. new和delete

    和 sizeof 类似,sizeof不是函数,它是一个操作符,它在编译期就完成了计算,在函数运行期间它已经是一个常数值了. int a; sizeof(int) = 4; sizeof(a) = 4; ...

  9. JavaScript之函数调用与被调用的上下文对象this

    不同的调用机制决定了函数上下文对象的不同: 1.  作为普通函数进行调用时,其上下文是全局对象window; 2.  作为(对象)方法进行调用时,其上下文对象时拥有该方法的对象; 3.  作为构造器( ...

  10. Java中eclipse与命令行向main函数传递参数

    我们知道main函数是java程序的入口,main函数的参数类型是String[]. 1.Eclipse中向main方法传递参数 例如: public class Mytest { public st ...