数据库指令练习
实验**1 数据库的创建与修改**
- 在查询分析器中创建数据库,名称为Tushuguan1,数据文件的初始大小10Mb,增量2Mb,限制大小50Mb。
1 | create database tushuguan1 |
- 在查询分析器中,为Tushuguan1增加一个事务日志文件,名称为TushuguanL,文件的初始大小15Mb,增量1 Mb,限制大小30Mb。
1 | log on |
实验三** 数据表的创建与修改(2)**
二.实验内容****
- 在Tushuguan1中,在查询分析器中创建下面三个表,定义表中要求的约束。
学生信息表:student
字段名称**** | 数据类型**** | 说明**** |
---|---|---|
stuID | Into 标识列(10000,10) | 学生编号,主键 |
stuName | Varchar(10) | 学生名称, 不为空 |
major | Varchar(50) | 专业 默认值(‘计算机’),不为空 |
Sex | Char(2) | 性别,检查约束,不为空 |
1 | create table student( |
图书表:book
字段名称**** | 数据类型**** | 说明**** |
---|---|---|
BID | Int 标识列(10,1) | 图书编号,主键 |
title | char(50) | 书名 惟一性约束,不为空 |
author | char(20) | 作者 ,不为空 |
1 | create table book |
计算所得列:总价AS 单价*数量
“出版日期”为当前日期:出版日期Datetime DEFAULT(gettime())
出版社只能是。。。CHECK(出版社 IN(’浙大’,’电子’,’中央“))
借书信息表:borrow
字段名称**** | 数据类型**** | 说明**** |
---|---|---|
borrowID | char(10) | 借书编号,主键 |
stuID | int | 学生编号,外键 |
BID | Int | 图书编号,外键 |
T_time | datetime | 借书日期,不为空 |
B_time | datetime | 还书日期 |
1 | create table borrow( |
要求:
(1)在创建表时,约束定义在表的属性中。
(2)创建表时,列只定义数据类型,是否为空等。再修改表添加约束。
- 设置复合主键
新建学生信息表:student1
字段名称**** | 数据类型**** | 说明**** |
---|---|---|
stuID | Into 标识列(10000,10) | 学生编号 |
stuName | Varchar(10) | 学生名称 |
major | Varchar(50) | 专业 |
score1 | int | 成绩 |
利用T-SQL设置复合主键(学生编号+学生姓名)
CONSTRAINT 主键名 PRIMARY KEY(学生编号,学生姓名)
- 创建约束
创建score1列的成绩约束,要求在0-100之间。
1 | create table student1( |
- 在三个表中添加一些数据,查看外键约束中如果选中:级联更新和级联删除后,更新主键数据和删除主键数据的情况。
因为有外键约束 不能对表进行更新和删除
- 观察去掉级联删除选项后,删除主键数据(外键存在引用的数据)的情况。
去掉后 可以进行更新和删除
6. 用 T-SQL插入新纪录,观察各种约束的情况
- 数据表复制
(1)在当前库中,将“学生信息表”中的stuName和major列的数据复制到一个新表中。
1 | insert into temp (stuName,major) select stuName,major from student |
(2)在当前库中,将“学生信息表”中的stuName和major列的数据复制到一个新表中。在新表中stuName列的别名为“学生姓名”,major列的别名为“专业”。
select stuName as学生姓名,major as专业into student3
from student
1 |
(3)将“学生信息表”中的stuName和major列的数据复制到数据库“abc”的一个新表中。
insert intoabc.dbo.student4
select stuName,majorfrom tushuguan1.dbo.student
- 用 T-SQL删除纪录,观察各种约束的情况
(1)单表删除记录,如删除student表中 专业为计算机的。删除“借书信息表”中,借书日期2009-1-1以前的。
delete fromstudent where major=’计算机’
delete fromborrow where T_time<2009-1-1
(2) 多表删除,删除“张三”的借书记录。
delete
from borrow,student
where borrow.stuId=student.stuId
(3)多表删除,删除“张三”并书名为“abcd”的借书记录。
delete
from borrow,book
where borrow.stuId=(select stuID from student wherestuName=’张三’) andbook.title=’abcd’
实验四** 数据查询(1)**
一.实验目的****
学习使用SQL Server的查询语句,熟练掌握简单查询、排序、汇总函数、分组、HAVING和汇总等基本的查询操作。
1.基本语法
SELECT子句是SELECT语句的核心部分,虽然 SELECT 语句的完整语法较复杂,但是其主要的子句可归纳如下:
SELECT select_list
[INTO new_table_name]
FROM table_list
[WHERE search_conditions]
[GROUP BY group_by_list]
[HAVING search_conditions]
[ORDER BY order_list [ASC | DESC] ]
其中:
select_list**:**表示需要检索的字段的列表。它是一个逗号分隔的表达式列表,列表中可以包含数据源表或视图中的字段名称。也可能是其它表达式,在选择列表中使用 * 表达式指定返回源表中的所有列。在此子句中,可以使用DISTINCT和TOP等关键字来限制结果集的范围。
INTO new_table_name**:**指定使用检索出的结果集来创建新表。新表的名称为new_table_name。
FROM table_list**:** 指定检索数据的数据源表的列表。
WHERE search_conditions**:** WHERE子句是一个筛选,它定义了源表中的行要满足 SELECT 语句的要求所必须达到的条件。只有符合条件的行才向结果集提供数据。不符合条件的行中的数据不会被使用。
GROUP BY group_by_list**:**** ** GROUP BY 子句根据 group_by_list 列中的值将结果集分成组。
HAVING search_conditions**:** HAVING子句是应用于结果集的附加筛选。逻辑上讲,HAVING 子句从中间结果集对行进行筛选,这些中间结果集是用 SELECT 语句中的 FROM、WHERE 或 GROUP BY 子句创建的。HAVING 子句通常与 GROUP BY 子句一起使用。
ORDER BY order_list [ ASC | DESC ]**:** ORDERBY 子句定义结果集中的行排列的顺序。order_list 指定组成排序列表的结果集的列。ASC 和 DESC 关键字用于指定行是按升序还是按降序排序。
除了以上子句,SELECT语句中经常出现的关键字还包括UNION运算符、COMPUTE子句、FOR子句和OPTION等子句。
(1) 改变列的标题
可以为显示的列重新起一个标题,比如:
SELECT TOP 10 产品价格=定价FROM 产品表
或者利用 AS 关键词:
SELECT TOP 10 定价 AS产品价格 FROM 产品表
(2) 匹配查询条件
模式匹配符有两种:LIKE 和 NOT LIKE。它们主要用来进行模糊查询,判断列值是否与指定的字符串格式匹配。常用的 SQL Server 通配符有“%”和“_”
%**:**包含零个或更多字符的任意字符串。
_**(下划线):**任何单个字符。
(3) 汇总函数
汇总函数(例如 SUM、AVG、COUNT、COUNT()、MAX 和 MIN)在查询结果集中生成汇总值。汇总函数(除 COUNT() 以外)处理单个列中全部所选的值以生成一个结果值。汇总函数可以应用于表中的所有行、WHERE 子句指定的表的子集或表中一组或多组行。应用汇总函数后,每组行都将生成一个值。表1显示了汇总函数的语法及结果(expression 几乎总为列名)。
表1 汇总函数的语法
汇总函数 | 结果 |
---|---|
SUM([ALL | DISTINCT] expression) | 数字表达式中所有值的和 |
AVG([ALL | DISTINCT] expression) | 数字表达式中所有值的平均值 |
COUNT([ALL | DISTINCT] expression) | 表达式中值的个数 |
COUNT(*) | 选定的行数 |
MAX(expression) | 表达式中的最高值 |
MIN(expression) | 表达式中的最低值 |
(4)COMPUTE和COMPUTE BY 子句
生成合计作为附加的汇总列出现在结果集的最后。当与 BY 一起使用时,COMPUTE 子句在结果集内生成控制中断和分类汇总。可在同一查询内指定 COMPUTE BY 和 COMPUTE。格式为:
COMPUTE 汇总函数(汇总函数表达式) BY 分组字段
汇总函数表达式是对其执行计算的列名。汇总函数表达式必须是选择列表中的一个项目,在汇总函数表达式内不能使用在选择列表中指定的列的别名。
分组字段用来设置用于分类的字段名称、字段别名或表达式,而且这个字段别名必须出现在ORDER BY 子句中。
如果使用 COMPUTE BY,则必须也使用 ORDER BY 子句。表达式必须与在 QRDER BY 后列出的子句相同或是其子集,并且必须按相同的序列。
2.操作实例演示
以下是某公司的产品销售数据库(ProductSales)中的产品表(Product)和销售表(Sales),产品表为主表,销售表为子表,表结构和存储的数据如表2、表3所示:
表**2 产品表,主表**
产品编号(主键) | 产品名称(唯一性约束) | 定价 |
---|---|---|
1 | HP1200打印机 | 2000 |
2 | LX360兼容机 | 4800 |
3 | IBM 350笔记本 | 11000 |
4 | IBM 360笔记本 | 12000 |
表**3 销售表,子表**
产品号(外键) | 客户名称 | 购买数量 | 销售单价 |
---|---|---|---|
2 | 河北工大 | 10 | 4500 |
1 | 河北工大 | 25 | 1600 |
3 | 天津大学 | 10 | 11000 |
2 | 天津大学 | 30 | 4600 |
1 | 天津大学 | 20 | 1800 |
3 | 河北大学 | 40 | 10000 |
3 | 南开大学 | 20 | 10500 |
编写SQL语句实现以下要求的查询:
(1)查询出单笔购买数量大于15的客户名称、购买数量、销售单价信息;
select **客户名称,购买数量,销售单价** from **销售表** where **购买数量**>15
(2)查询出产品号,客户名称,购买数量,按产品号排序。
select **产品号,客户名称,购买数量** from **销售表** order by **产品号**
(3)查询出产品号,客户名称,购买数量,产品号升序,购买数量降序
select **产品号,客户名称,购买数量** from **销售表** order by **产品号,购买数量** desc
(4)查询出购买数量最多(单笔)前三位的记录。
select top 3 *from **销售表** order by **购买数量** desc
(5)查询出所有商品的全部销售金额。
select sum(**购买数量*****销售单价*) as *销售总额** from **销售表**
(6)查询销售单价最高和最低的记录。
select max(**销售单价*) as *最高单价,min(销售单价*)as *最低单价** from **销售表**
(7)查询总共有多少笔销售记录。
select count(*) as**记录数** from **销售表**
(8)查询客户姓名、对应客户的平均每笔购买数量。
select **客户名称,avg(购买数量*) as *平均购买量** from **销售表** group by **客户名称**
(9)查询出每种产品最高价高于2000的产品号和最高单价。
select **产品号, max(销售单价*) from *销售表** group by **产品号** having max(**销售单价**)>2000
(10)查询出全部销售记录,并汇总总销售量和销售记录数。
select * from **销售表** compute sum(**购买数量),count(购买数量**)
(11) 查询 “产品表”中产品名称含有IBM的记录。
select * from **产品表** WHERE **产品名称** like ‘%IBM%’
三.实验内容****
创建表2、表3所示的产品表和销售表,编写SQL语句实现以下的要求:
- 查询出销售单价最低(单笔)的前50%的记录。
select top 50 percent * from sale
order by 销售单价
- 查询出产品号,客户名称,购买数量,产品号升序,客户名称降序。
select 产品号,客户名称,购买数量 from sale
order by 产品号,客户名称 desc
- 查询所有商品的销售总数。
select 产品号,sum(购买数量) as 销售总数 from sale
group by 产品号
- 查询共有几家客户(不重复)。
select count(distinct 客户名称) as 客户数from sale
- 查询客户姓名、对应客户的销售总金额。
select 客户名称,sum(购买数量*销售单价) as 销售总金额from sale group by客户名称
- 查询每种产品的产品号和相应的每单位的平均销售单价。
select 产品号,avg(销售单价)as 平均销售单价from sale group by 产品号
- 查询每种产品中每个客户购买的最高销售单价。
select distinct产品号,max(销售单价)as 最高销售单价from sale groupby 产品号
- 查询出全部销售记录,并汇总每种产品的总销售量和销售记录数。
select * fromsale computesum(购买数量) ,count(购买数量)
- 查询产品号,客户名称,购买数量,销售单价,(购买数量*销售单价) as 销售额,并汇总每种产品的销售数量和总销售额。
select 产品号,客户名称,购买数量,销售单价,(购买数量*销售单价) as 销售额from sale
compute sum(购买数量),sum(购买数量*销售单价)
- 查询 “销售表”的客户名称字段中以“大学”结尾的记录
select * from sale where 客户名称like ‘%大学’
- 查询购买数量最高和最低的记录。
select * from sale compute max(购买数量),min(购买数量)
实验**5 数据查询(2)**
一.实验目的****
学习使用SQL Server的查询语句,掌握内连接、外连接和交叉连接,掌握子查询。
(一)基本语法
1.内联接
内联接是用比较运算符比较要联接列的值的联接。格式为:
** 数据表1 INNER JOIN 数据表2 ON 联接表达式**
此内联接称为相等联接。它返回两个表中的所有列,但只返回在联接列中具有相等值的行。在内连接中,所有表是平等的,没有主次之分。
当创建内联接时,包含 NULL 的列不与任何值匹配,因此不包括在结果集内。空值不与其它的空值匹配。
2.外联接
与内连接相对,参与外连接的表有主次之分。以主表的每一行数据去匹配从表中的数据列,符合连接条件的数据将直接返回到结果集中,对那些不符合连接条件的列,将被填上NULL值后再返回到结果集中。
外连接可以分为左(向外)连接、右(向外)连接和完整外部连接三类。
(1)左联接
格式为:
数据表**1 LEFT JOIN 数据表2 ON 联接表达式**
左连接以连接(JOIN)子句左侧的表为主表,主表中所有记录都将出现在结果集中。如果主表中的记录在右表中没有匹配的数据,则结果集中右表的列值为NULL。在WHERE子句中,可以使用*=符号定义左连接。
(2)右联接
格式为:
** 数据表1 RIGHT JOIN 数据表2 ON 联接表达式**
右连接以连接(JOIN)子句右侧的表为主表,主表中所有记录都将出现在结果集中。如果主表中的记录在左表中没有匹配的数据,则结果集中左表的列值为NULL。在WHERE子句中,可以使用=*符号定义右连接。
(3)完整外联接
格式为:
** 数据表1 FULL JOIN 数据表2 ON 联接表达式**
完整外部连接包括连接表中的所有行,无论它们是否匹配。
3.交叉联接
格式为:
** 数据表1 CROSS JOIN 数据表2 **
在交叉连接查询中,两个表中的每两行都可能互相组合成为结果集中的一行。交叉联接不使用WHERE子句。数学上,交叉联接就是笛卡儿集。第一个表的行数乘以第二个表的行数等于笛卡儿集的大小。
4.嵌套查询
嵌套查询是指在一个外层查询中包含有一个内查询。即在WHERE子句中包含一个形如SELECT-FROM-WHERE的查询块,此查询块称为子查询或嵌套查询。
子查询在WHERE语句中的一般用法:
** SELECT … FROM 表1 WHERE字段1 >(子查询)**
括号中嵌入的查询称为子查询,外面的查询称为父查询或外部查询,外查询称为主查询。
一般情况下,套查询在执行时由里向外处理,每个子查询是在上一级外部查询处理之前完成,主查询要用到子查询的结果。即先用内查询挑选出部分数据,作为外查询的数据来源或搜索条件。将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个。
子查询还常和UPDATE、INSERT、DELETE一起使用,语法类似于SELECT语句。
(1)带有IN或NOT IN谓词的子查询
在嵌套查询中,子查询的结果往往是一个集合,IN或NOT IN关键字用于确定给定的值是否包含在子查询返回的结果集合中。
l IN后面的子查询可以返回多条记录
l 常用IN替换等于(=)的比较子查询
(2)带有EXISTS或 NOT EXISTS谓词的子查询
EXISTS表示存在量词,带有EXISTS的子查询不返回任何实际数据,它只得到逻辑值“真”或“假”。 EXISTS子查询的语法:
** IF EXISTS (子查询)**
** 语句**
如果子查询的结果非空,即记录条数1条以上,则EXISTS (子查询)将返回真(true),否则返回假(false)。
EXISTS也可以作为WHERE 语句的子查询,其语法是:
WHERE [NOT] EXISTS (**子查询**)
当子查询的查询结果集合为非空时,外层的WHERE子句返回真值,否则返回假值。NOT EXISTS与此相反。
含有IN的查询通常可用EXISTS表示,但反过来不一定。
5.合并查询
合并查询UNION 运算符将两个或多个 SELECT 语句的结果组合成一个结果集,该结果集包含联合查询中的所有查询的全部行。使用UNION运算符组合两个查询的结果集的两个前提是:
l 所有查询结果中的列数和列的顺序必须相同;
l 对应列的数据类型必须兼容。
合并查询经常用来返回明细和统计信息。因为明细和统计信息需要分别统计,所以可以使用合并查询将它们统一到一个结果集中。
注意事项:
l UNION 的结果集列名与 UNION 运算符中第一个 SELECT 语句的结果集中的列名相同。另一个 SELECT 语句的结果集列名将被忽略。
l 默认情况下,UNION 运算符从结果集中删除重复的行。如果使用 ALL 关键字,那么结果中将包含所有行并且将不删除重复的行。
l 合并查询中只能使用一个ORDER BY子句,它对整个结果集起作用。如果分别为每个SELECT语句指定ORDER BY子句,将会出现错误。
(二)操作实例演示
以下是某公司的产品销售数据库中的产品表、销售表和库存表,产品表为主表,销售表和库存表为子表,表结构和存储的数据如表1、表2和表3 所示:
表**1 产品表,主表**
产品编号(主键) | 产品名称(唯一性约束) | 定价 |
---|---|---|
1 | HP1200打印机 | 2000 |
2 | LX360兼容机 | 4800 |
3 | IBM 350笔记本 | 11000 |
4 | IBM 360笔记本 | 12000 |
表**2 销售表,子表**
产品号(外键) | 客户名称 | 购买数量 | 销售单价 |
---|---|---|---|
2 | 河北工大 | 10 | 4500 |
1 | 河北工大 | 25 | 1600 |
3 | 天津大学 | 10 | 11000 |
2 | 天津大学 | 30 | 4600 |
1 | 天津大学 | 20 | 1800 |
3 | 河北大学 | 40 | 10000 |
3 | 南开大学 | 20 | 10500 |
表**3 库存表(原始的库存表,包括上面销售表的数量)**
产品编号(主键) | 库存数量 |
---|---|
1 | 200 |
2 | 320 |
3 | 160 |
4 | 500 |
编写SQL语句实现以下要求的查询:
(1)查询出每笔销售记录的产品名称、客户名称、销售单价(分别用where 子句 和 join 实现)
select a1.**产品名称,a2.客户名称,a2.销售单价** from **产品表** as a1,**销售表** as a2 WHERE a1.**产品编号=a2.产品号**
select a1.**产品名称,a2.客户名称,a2.销售单价** from **产品表** as a1 inner join **销售表** as a2 on a1.**产品编号=a2.产品号**
(2)查询出每笔销售的产品名称、销售数量和剩余库存数量。(用where用inner join )
select a1.**产品名称,a2.购买数量,a3.库存数量-a2.购买数量** as **剩余库存** from **产品表** as a1,**销售表** as a2,**库存表** as a3 WHERE a1.**产品编号=a2.产品号** and a2.**产品号=a3.产品编号**
select a1.**产品名称,a2.购买数量,a3.库存数量-a2.购买数量** as **剩余库存** from (**产品表** as a1 inner join **销售表** as a2 on a1.**产品编号=a2.产品号** )inner join **库存表** as a3 on a2.**产品号=a3.产品编号**
(3)查看产品名称和客户名称的交叉查询的结果
select a1.**产品名称,a2.客户名称** from **产品表** as a1 cross join **销售表** as a2
(4)查询出销售单价最高和最低的销售记录。用“UNION”连接查询结果集。
select * from **销售表** where **销售单价** in (select max(**销售单价*) from *销售表** union select min(**销售单价*) from *销售表**)
方法四
select *
from sale
where 销售单价in((select top 1 销售单价
from sale orderby 销售单价desc)
union
(select top 1 销售单价
from sale orderby 销售单价))
方法一
select *
from sale
where 销售单价= (select top 1 销售单价
from sale orderby 销售单价desc)
union
select *
from sale
where 销售单价= (select top 1 销售单价
from sale orderby 销售单价)
方法二
select *
from sale
where 销售单价= (select max(销售单价)
from sale )
union
select *
from sale
where 销售单价= (select min(销售单价)
from sale )
方法三
select * from sale where 销售单价in (select max(销售单价) from sale
union select min(销售单价) fromsale)****
(5)查询出已经销售出的产品名称。
select * from **产品表** where **产品编号** in (select **产品号** from **销售表**)
(6)如果某种产品的总销售数量超过了50,则所有产品库存增加50,否则,增加10。
if exists(selectsum(**购买数量*) from *销售表** group by **产品号** having sum(**购买数量**)>50)
** update 库存表 set 库存数量=库存数量+50**
else
** update 库存表 set 库存数量=库存数量+10**
三.实验内容****
创建表1、表2和表3所示的产品表、销售表和库存表,编写SQL语句实现以下的要求:
- 查询出单笔售数量大于15的客户名称、产品名称、销售数量信息;(分别用where字句 和join 实现)
select 客户名称,产品名称,购买数量as 销售数量from product,sale
where product.产品编号=sale.产品号and 购买数量>15
select 客户名称,产品名称,购买数量as 销售数量from product joinsale
on product.产品编号=sale.产品号 and 购买数量>15
- 查询每种产品的销售记录,列出产品名称和销售数量。(分别左连接和右连接)(分别用where 字句 和 join 实现)
select 产品名称,购买数量as 销售数量from product leftjoin sale onproduct.产品编号=sale.产品号
select 产品名称,购买数量as 销售数量from product rightjoin sale onproduct.产品编号=sale.产品号
select 产品名称,购买数量as 销售数量from product,sale
where product.产品编号=sale.产品号
- 在销售表添加一条记录, 8,相机,30,2100。查看完全外连接的结果。
insert intosale
values (8,’相机’,30,2100)
- 查询出销售单价最高的销售记录。
select * from sale where 销售单价in (select max(销售单价) from sale)
select * from sale where 销售单价in (select top 1 销售单价from sale orderby 销售单价desc)
此处最好不要用“=” 因为可能有多条记录
- 查询出销售单价最高和最低的销售记录的产品名称、客户名称、销售单价。
select 产品名称,客户名称,销售单价
from sale,product
where product.产品编号=sale.产品号and 销售单价= (select max(销售单价)
from sale )
union
select 产品名称,客户名称,销售单价
from sale,product
where product.产品编号=sale.产品号and 销售单价= (select min(销售单价)
from sale )
- 查看产品表中产品编号和产品名称与销售表中客户名称和购买数量的交叉查询的结果。
select 产品编号,产品名称,客户名称,购买数量
from product crossjoin sale
- 查询出没有销售的产品名称。
select 产品名称from product
where 产品编号not in (select distinct 产品号from sale)
- 如果某种产品的总销售数量超过了50,则该种产品库存增加50,其余的产品库存增加10(子查询where字句中分别用exists和in 来实现)。
if exists(select sum(购买数量) from sale group by 产品号having sum(购买数量)>50)
update kucun set 库存数量=库存数量+50
else
update kucun set 库存数量=库存数量+10
实验七** 视图、索引的建立与使用**
一.实验目的****
掌握使用创建视图的方法,了解如何应用视图有选中地查看所需数据,并熟悉通过视图操作数据表中数据的方法。
掌握创建索引的方法。
二.实验内容****
以下是某公司的产品销售数据库中的产品表、销售表和库存表,产品表为主表,销售表和库存表为子表,表结构和存储的数据如表1、表2和表3 所示。
创建销售数据库及表、表2和表3所示的产品表、销售表和库存表,编写T-SQL语句实现以下要求:
- 创建视图,包含列:产品名称=产品表.产品名,客户名称=销售表.客户名称,销售数量=销售表.购买数量,购买数量>12,分别在(企业管理器和用T-SQL)实现。
create viewpr_sa
as
select product.产品名称as 产品名称,sale.客户名称,sale.购买数量as 销售数量
from product,sale
where product.产品编号=sale.产品号and 购买数量>12
- 查询(1)中的视图,查询出每种产品的销售总量
select sum(销售数量)as 销售总量from pr_sa
group by 产品名称。
- 销售表中对客户名称建立索引(企业管理器和T-SQL),填充因子30,并查询客户名称为“河北工大”的记录。
create
index in_name onsale(客户名称)
with pad_index,fillfactor=30
select * from sale where 客户名称=’河北工大’
- 产品表中对产品名称建立唯一索引(非聚集索引),并查询包含“IBM”的记录。
create unique
index in_product onproduct(产品名称)
select 产品名称from product
where 产品名称like ‘%IBM%’
- 对产品表的产品名称和定价列建立复合索引。
create indexin_fuhe on product(产品名称,定价)
数据库文件分为:1、主数据文件(每个数据库有且只有一个主数据文件 .mdf)2、次数据文件(.ndf 一个数据库可以有多个次数据文件,也可以没有)3、日志文件(.ldf 可有一个或多个日志文件 )