SQL基本操作及示例

转自: http://hi.baidu.com/suningin/blog/item/5f93a3efe4bddd16fdfa3c9f.html

1. 表的建立

   create table 表名 [表约束]

      (列名1 数据类型 [缺省值1,列约束1]

      列名2 数据类型 [缺省值2,列约束2]

       …

    列名n 数据类型 [缺省值n,列约束n]);

        [TABLESPACE 表空间名称]

        [STORAGE (存贮的子句)]

        [ENABLE 约束名]

        [DISABLE 约束名]

注意:a)使用SQL语句创建的数据库表格和表格中列的名称必须以字母开头,后面可以使用字母,数字或下划线,名称的长度不能超过30个字符。

        b)SQL语言中较为常用的数据类型为:

            char(size):固定长度字符串,其中括号中的size用来设定字符串的最大长度。Char类型的最大长度为255字节。

            varchar(size):可变长度字符串,最大长度由size设定。

            number(size):数字类型,其中数字的最大位数由size设定。

            Date:日期类型。

            number(size,d):数字类型,size决定该数字总的最大位数,而d则用于设定该数字在小数点后的位数。

        c)较为常用的列的限制条件:unique、not null和primary key等。

2.插入数据

INSERT INTO 表名[(列名1,)]

VALUES(1,值2,…,值n)

[子查询]

3.修改数据

UPDATE 表名 SET 列名1=表达式1,列名2=表达式2,…

WHERE 条件;

4.删除数据

DELETE FROM 表名 WHERE 条件;

5.查询语句

SELECT 表名1.列名1,表名2.列名2 FROM 表名/视图名/数据库链名 WHERE 条件

START WITH条件 CONNECT BY 条件]

[GROUP BY表达式[,表达式] [HAVING条件]

[UNION|UNION ALL |INTERSECT|MINUS]SELECT命令

[ORDER BY{表达式|位置} [ASC|DESC] [, {表达式|位置[ASC|DESC]}]]

注意:a)在where条件从句中可以使用以下一些运算符来设定查询标准:=,<,>,<=,<=,<=。此外,LIKE运算符在where条件从句中也非常重要。LIKE运算符的功能非常强大,通过使用LIKE运算符可以设定只选择与用户规定格式相同的记录。此外,我们还可以使用通配符“%”用来代替任何字符串。注意,字符串必须被包含在单括号内。

b)其它关键字:DISTINCT、运算函数(AVG、SUM、MAX、MIN)、COUNT(指定字段所包含的记录数目)、GROUP BY(一般应用于同时查询多个字段并对字段进行算术运算的SQL命令中)、HAVING(对由sum或其它集合函数运算结果的输出进行限制)、ALIAS(别名,直接放置在各自对应名称的后面,中间用空格分开,在From语句中)。

结合使用例:

 SELECT COUNT(DISTINCT store_name) FROM Store_Information;

SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name  HAVING SUM(sales) 〉1500;

6.表结构的修改

  a、增加新列:

    ALTER TABLE 表名 ADD(新列名 数据类型(长度))ALTER TABLE STUDENT ADD (DEPARTMENT CHAR(8));增加已有列的数据类型。

    例如: ALTER TABLE STUDENT ADD (DEPARTMENT CHAR(8));

b、增加已有列的数据类型。

    例如:ALTER TABLE STUDENT MODIFY(NAME VARCHAR2(25));

7.表的删除

   DROP TABLE表名;

练习:

例如:对于STUDENT表:

NO NAME AGE
1001 AE 12
1002 BT 14

创建表:CREATE TABLE STUDENT (

     NO number(3) NOT NULL,

    NAME VARCHAR(16) NOT NULL,

    AGE number(3),NOT NULL)

插入数据:INSERT INTO STUDENT VALUES(1001,‘AE’,12);

修改数据:UPDATE STUDENT SET AGE=16 WHERE NAME=‘BT’;

删除数据:DELETE FROM STUDENT WHERE NAME='BT';

查询数据:

(1) 查询年纪为12的学生姓名;

SELECT STUDENT.NAME FROM STUDENT WHERE AGE=12;

(2) 查询年纪在12至16岁之间的学生姓名;

SELECT STUDENT.NAME FROM STUDENT WHERE AGE BETWEEN 12 AND 16;

(3) 查询年纪在12至16岁之间的学生姓名;

SELECT STUDENT.NAME FROM STUDENT WHERE AGE NOT BETWEEN 12 AND 16;

(4) 查询所有姓名以A开头的学生的姓名;

SELECT STUDENT.NAME FROM STUDENT WHERE NAME LIKE 'A%';

(5) 列出所有学生年纪的和,年纪的平均值,最大值,最小值,最大值与最小值之间的差值;

SELECT AVG(AGE), SUM(AGE), MAX(AGE), MIN(AGE), MAX(AGE)-MIN(AGE);

(6) 将所有学生按学号顺序升序排列;

SELECT * FROM STUDENT ORDER BY NO DESC;

(7) 将所有学生按学号顺序升序排列;

SELECT * FROM STUDENT ORDER BY NO ASC;

 

例二:连接多个数据表

Store_Information

Store_Name

Sales

Date

Los Angeles

$1500

Jan-10-2000

San Diego

$250

Jan-11-2000

Los Angeles

$300

Jan-12-2000

Boston

$700

Jan-12-2000

Region

Region_Name

Store_Name

East

Boston

East

New York

West

Los Angeles

West

San Diego

要求:得到按区域划分的销售信息。

SELECT A1.region_name REGION, SUM(A2.Sales) SALES

FROM Geography A1, Store_Information A2

WHERE A1.store_name = A2.store_name

GROUP BY A1.region_name

使用了alias,简化了sql语句。查询结果显示为:

REGION SALES

East $700

West $2050

-----------------------------------------------------------------------------------------------------------

转自:http://blog.csdn.net/accp_fangjian/archive/2006/11/13/1381265.aspx

--试题3
--问题描述:
--本题用到下面三个关系表:
--CARD     借书卡。   CNO 卡号,NAME  姓名,CLASS 班级
--BOOKS    图书。     BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数
--BORROW   借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期
--备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。
--要求实现如下15个处理:
--  1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束。
--  2. 找出借书超过2次的读者,输出借书卡号及所借图书次数。
--  3. 查询借阅了"Eclipse入门"一书的读者,输出姓名及班级。
--  4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期。
--  5. 查询书名包括"网络"关键词的图书,输出书号、书名、作者。
--  6. 查询现有图书中价格最高的图书,输出书名及作者。
--  7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。
--  8. 将"C01"班同学所借图书的还期都延长一周。
--  9. 从BOOKS表中删除当前无人借阅的图书记录。
--  10.如果经常按书名查询图书信息,请建立合适的索引。
--  11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。
--  12.建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)。
--  13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。
--  14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句。
--  15.对CARD表做如下修改:
--    a. 将NAME最大列宽增加到10个字符(假定原为6个字符)。
--    b. 为该表增加1列NAME(系名),可变长,最大20个字符。


--创建表CARD
CREATE TABLE CARD(CNO CHAR(3),NAME VARCHAR(20),CLASS VARCHAR(20))
INSERT INTO CARD SELECT 001,'方健','三年二班'
go
INSERT INTO CARD SELECT 002,'李勇','三年一班'
UNION ALL
SELECT 003,'张雪','三年三班'
UNION ALL
SELECT 004,'赵云','三年三班'
UNION ALL
SELECT 005,'李树鹏','三年四班'
UNION ALL
SELECT 006,'李会文','三年四班'

SELECT * FROM CARD
--创建表BOOKS
CREATE TABLE BOOKS(BNO CHAR(4),BNAME VARCHAR(30),AUTHOR VARCHAR(20),PRICE INT,QUANTITY INT)
INSERT INTO BOOKS SELECT '0001','JAVA编程思想','小java',88,200
UNION ALL
SELECT '0002','C++编程思想','小c',68,300
UNION ALL
SELECT '0003','SQLSERVER概论','小s',50,220
UNION ALL
SELECT '0004','Eclipse入门','小e',40,160
UNION ALL
SELECT '0005','COBOL入门到精通','小cobol',30,200

SELECT * FROM BOOKS

--创建表BORROW
--  1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束。
CREATE TABLE BORROW(
 CNO INT FOREIGN KEY REFERENCES CARD(CNO),
 BNO INT FOREIGN KEY REFERENCES CARD(CNO),
 RDATE DATETIME,
 PRIMARY KEY(CNO,BNO))

INSERT INTO BORROW SELECT 001,0002,'2006/12/10'
INSERT INTO BORROW SELECT 003,0005,'2006/11/30'
INSERT INTO BORROW SELECT 003,0004,'2006/11/20'
INSERT INTO BORROW SELECT 004,0003,'2006/12/20'
INSERT INTO BORROW SELECT 001,0003,'2006/11/10'
INSERT INTO BORROW SELECT 004,0002,'2006/12/20'
INSERT INTO BORROW SELECT 004,0004,'2006/12/20'
INSERT INTO BORROW SELECT 003,0001,'2006/12/11'
INSERT INTO BORROW SELECT 002,0001,'2006/12/15'

SELECT * FROM BORROW

--显示三个被创建的表
SELECT * FROM CARD
SELECT * FROM BOOKS
SELECT * FROM BORROW
--  2. 找出借书超过2次的读者,输出借书卡号及所借图书次数。
SELECT C.NAME,NUM as '借书次数' FROM (SELECT CNO,COUNT(BNO) NUM FROM BORROW GROUP BY CNO HAVING COUNT(BNO)>2) R,CARD C
WHERE R.CNO=C.CNO
--  3. 查询借阅了"Eclipse入门"一书的读者,输出姓名及班级。
SELECT NAME,CLASS FROM CARD WHERE CNO IN(
 SELECT BR.CNO FROM BOOKS B,BORROW BR WHERE B.BNO=BR.BNO AND B.BNAME='Eclipse入门')
--网上实现代码:
SELECT * FROM CARD c
WHERE EXISTS(
    SELECT * FROM BORROW a,BOOKS b WHERE a.BNO=b.BNO AND b.BNAME=N'Eclipse入门' AND a.CNO=c.CNO)
--  4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期。
SELECT * FROM BORROW WHERE RDATE--  5. 查询书名包括"思想"关键词的图书,输出书号、书名、作者。
SELECT BNO,BNAME,AUTHOR FROM BOOKS WHERE BNAME LIKE N'%网络%'
--  6. 查询现有图书中价格最高的图书,输出书名及作者。
SELECT BNAME,AUTHOR FROM BOOKS WHERE PRICE = (SELECT MAX(PRICE) FROM BOOKS)
--  7. 查询当前借了"Eclipse入门"但没有借"JAVA编程思想"的读者,输出其借书卡号,并按卡号降序排序输出。
SELECT CNO FROM BORROW WHERE BNO=(SELECT BNO FROM BOOKS WHERE BNAME='Eclipse入门')
AND CNO not in (
SELECT CNO FROM BORROW WHERE BNO=(SELECT BNO FROM BOOKS WHERE BNAME='JAVA编程思想'))
ORDER BY CNO DESC
--OR
SELECT * FROM BORROW BR1 WHERE BNO IN (SELECT BNO FROM BOOKS WHERE BNAME='Eclipse入门')
AND NOT EXISTS (
SELECT * FROM BORROW BR2 WHERE BR1.CNO=BR2.CNO AND BNO IN (SELECT BNO FROM BOOKS WHERE BNAME='JAVA编程思想'))
ORDER BY CNO DESC
--网上实现代码:
SELECT * FROM BORROW BR1,BOOKS B1 WHERE BR1.BNO=B1.BNO AND B1.BNAME=N'Eclipse入门'
AND NOT EXISTS(
SELECT * FROM BORROW BR2,BOOKS B2 WHERE BR2.CNO=BR1.CNO AND BR2.BNO=B2.BNO AND B2.BNAME=N'JAVA编程思想')
ORDER BY BR1.CNO DESC
--  8. 将"三年三班"同学所借图书的还期都延长一周。
UPDATE BORROW SET RDATE=DATEADD(WK,1,RDATE) WHERE CNO IN (SELECT CNO FROM CARD WHERE class='三年三班')
--网上实现代码:
UPDATE b SET RDATE=DATEADD(Day,7,b.RDATE) FROM CARD a,BORROW b WHERE a.CNO=b.CNO AND a.CLASS=N'三年三班'
--  9. 从BOOKS表中删除当前无人借阅的图书记录。
DELETE B FROM BOOKS B WHERE NOT EXISTS(SELECT * FROM BORROW BR WHERE B.BNO=BR.BNO)
--or
DELETE BOOKS WHERE BNO NOT IN (SELECT BNO FROM BORROW)
--  10.如果经常按书名查询图书信息,请建立合适的索引。
CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME)
--  11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"SQLSERVER概论",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。
CREATE TRIGGER T_BORROW ON BORROW FOR INSERT,UPDATE
AS
IF @@ROWCOUNT>0 AND N'SQLSERVER概论'=(SELECT B.BNAME FROM INSERTED I,BOOKS B WHERE I.BNO=B.BNO AND B.BNAME=N'SQLSERVER概论')
 SELECT * INTO BORROW_SAVE FROM INSERTED
--网上实现代码:
CREATE TRIGGER TR_SAVE ON BORROW FOR INSERT,UPDATE
AS
IF @@ROWCOUNT>0
INSERT BORROW_SAVE SELECT i.* FROM INSERTED i,BOOKS b WHERE i.BNO=b.BNO AND b.BNAME=N'SQLSERVER概论'
--  12.建立一个视图,显示"三年三班"学生的借书信息(只要求显示姓名和书名)。
CREATE VIEW V_CARD
AS
SELECT C.NAME,C.CLASS,B.BNAME,B.AUTHOR,BR.RDATE FROM CARD C,BOOKS B,BORROW BR
WHERE C.CNO=BR.CNO AND B.BNO=BR.BNO AND C.CLASS='三年三班'
--网上实现代码:
CREATE VIEW V_VIEW
AS
SELECT a.NAME,b.BNAME
FROM CARD C,BOOKS B,BORROW BR
WHERE C.CNO=BR.CNO AND BR.BNO=B.BNO AND C.CLASS=N'三年三班'
--  13.查询当前同时借有"C++编程思想"和"Eclipse入门"两本书的读者,输出其借书卡号,并按卡号升序排序输出。
SELECT CNO FROM BOOKS B,BORROW BR
WHERE B.BNO=BR.BNO AND (B.BNAME=N'C++编程思想' OR B.BNAME=N'Eclipse入门')--括号必须加,否则语意就变了,加括号后和B.BNAME IN(N'C++编程思想',N'Eclipse入门')语意等价
GROUP BY CNO HAVING COUNT(CNO)=2
ORDER BY CNO
--网上实现代码:
SELECT a.CNO FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO AND b.BNAME IN(N'C++编程思想',N'Eclipse入门')
GROUP BY a.CNO HAVING COUNT(*)=2
ORDER BY a.CNO
--  14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句。
ALTER TABLE BOOKS ADD PRIMARY KEY(BNO)
--  15.对CARD表做如下修改:
--    a. 将NAME最大列宽增加到30个字符(假定原为20个字符)。
ALTER TABLE CARD ALTER COLUMN NAME varchar(30)
--    b. 为该表增加1列NAME(系名),可变长,最大20个字符。
ALTER TABLE CARD ADD '系名' varchar(20) --添加的列名(汉字或字母)如果加引号会出错
ALTER TABLE CARD ADD 系名 varchar(20)
--添加删除列
ALTER TABLE CARD ADD aaa varchar(20)
ALTER TABLE CARD DROP column aaa

---------------------------------------------------------------------------------------

/*
建表:
dept:
 deptno(primary key),dname,loc
emp:
 empno(primary key),ename,job,mgr,sal,deptno
*/

1 列出emp表中各部门的部门号,最高工资,最低工资
select max(sal) as 最高工资,min(sal) as 最低工资,deptno from emp group by deptno;

2 列出emp表中各部门job为'CLERK'的员工的最低工资,最高工资
select max(sal) as 最高工资,min(sal) as 最低工资,deptno as 部门号 from emp where job = 'CLERK' group by deptno;

3 对于emp中最低工资小于1000的部门,列出job为'CLERK'的员工的部门号,最低工资,最高工资
select max(sal) as 最高工资,min(sal) as 最低工资,deptno as 部门号 from emp as b
where job='CLERK' and 1000>(select min(sal) from emp as a where a.deptno=b.deptno) group by b.deptno

4 根据部门号由高而低,工资有低而高列出每个员工的姓名,部门号,工资
select deptno as 部门号,ename as 姓名,sal as 工资 from emp order by deptno desc,sal asc

5 写出对上题的另一解决方法
(请补充)

6 列出'张三'所在部门中每个员工的姓名与部门号
select ename,deptno from emp where deptno = (select deptno from emp where ename = '张三')

7 列出每个员工的姓名,工作,部门号,部门名
select ename,job,emp.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno

8 列出emp中工作为'CLERK'的员工的姓名,工作,部门号,部门名
select ename,job,dept.deptno,dname from emp,dept where dept.deptno=emp.deptno and job='CLERK'

9 对于emp中有管理者的员工,列出姓名,管理者姓名(管理者外键为mgr)
select a.ename as 姓名,b.ename as 管理者 from emp as a,emp as b where a.mgr is not null and a.mgr=b.empno

10 对于dept表中,列出所有部门名,部门号,同时列出各部门工作为'CLERK'的员工名与工作
select dname as 部门名,dept.deptno as 部门号,ename as 员工名,job as 工作 from dept,emp
where dept.deptno *= emp.deptno and job = 'CLERK'

11 对于工资高于本部门平均水平的员工,列出部门号,姓名,工资,按部门号排序
select a.deptno as 部门号,a.ename as 姓名,a.sal as 工资 from emp as a
where a.sal>(select avg(sal) from emp as b where a.deptno=b.deptno) order by a.deptno

12 对于emp,列出各个部门中平均工资高于本部门平均水平的员工数和部门号,按部门号排序
select count(a.sal) as 员工数,a.deptno as 部门号 from emp as a
where a.sal>(select avg(sal) from emp as b where a.deptno=b.deptno) group by a.deptno order by a.deptno

13 对于emp中工资高于本部门平均水平,人数多与1人的,列出部门号,人数,按部门号排序
select count(a.empno) as 员工数,a.deptno as 部门号,avg(sal) as 平均工资 from emp as a
where (select count(c.empno) from emp as c where c.deptno=a.deptno and c.sal>(select avg(sal) from emp as b where c.deptno=b.deptno))>1
group by a.deptno order by a.deptno

14 对于emp中低于自己工资至少5人的员工,列出其部门号,姓名,工资,以及工资少于自己的人数
select a.deptno,a.ename,a.sal,(select count(b.ename) from emp as b where b.salwhere (select count(b.ename) from emp as b where b.sal5

 

问题描述:
本题用到下面三个关系表:
CARD     借书卡。   CNO 卡号,NAME  姓名,CLASS 班级
BOOKS    图书。     BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数 
BORROW   借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期
备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。
要求实现如下15个处理:
  1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束。
  2. 找出借书超过5本的读者,输出借书卡号及所借图书册数。
  3. 查询借阅了"水浒"一书的读者,输出姓名及班级。
  4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期。
  5. 查询书名包括"网络"关键词的图书,输出书号、书名、作者。
  6. 查询现有图书中价格最高的图书,输出书名及作者。
  7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。
  8. 将"C01"班同学所借图书的还期都延长一周。
  9. 从BOOKS表中删除当前无人借阅的图书记录。
  10.如果经常按书名查询图书信息,请建立合适的索引。
  11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。
  12.建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)。
  13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。
  14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句。
  15.对CARD表做如下修改:
    a. 将NAME最大列宽增加到10个字符(假定原为6个字符)。
    b. 为该表增加1列NAME(系名),可变长,最大20个字符。

1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束

--实现代码:
CREATE TABLE BORROW(
    CNO int FOREIGN KEY REFERENCES CARD(CNO),
    BNO int FOREIGN KEY REFERENCES BOOKS(BNO),
    RDATE datetime,
    PRIMARY KEY(CNO,BNO))

2. 找出借书超过5本的读者,输出借书卡号及所借图书册数

--实现代码:
SELECT CNO,借图书册数=COUNT(*)
FROM BORROW
GROUP BY CNO
HAVING COUNT(*)>5

3. 查询借阅了"水浒"一书的读者,输出姓名及班级

--实现代码:
SELECT * FROM CARD c
WHERE EXISTS(
    SELECT * FROM BORROW a,BOOKS b 
    WHERE a.BNO=b.BNO
        AND b.BNAME=N'水浒'
        AND a.CNO=c.CNO)

4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期

--实现代码:
SELECT * FROM BORROW 
WHERE RDATE

5. 查询书名包括"网络"关键词的图书,输出书号、书名、作者

--实现代码:
SELECT BNO,BNAME,AUTHOR FROM BOOKS
WHERE BNAME LIKE N'%网络%'

6. 查询现有图书中价格最高的图书,输出书名及作者

--实现代码:
SELECT BNO,BNAME,AUTHOR FROM BOOKS
WHERE PRICE=(
    SELECT MAX(PRICE) FROM BOOKS)

7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出

--实现代码:
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO AND b.BNAME=N'计算方法'
    AND NOT EXISTS(
        SELECT * FROM BORROW aa,BOOKS bb
        WHERE aa.BNO=bb.BNO
            AND bb.BNAME=N'计算方法习题集'
            AND aa.CNO=a.CNO)
ORDER BY a.CNO DESC

8. 将"C01"班同学所借图书的还期都延长一周

--实现代码:
UPDATE b SET RDATE=DATEADD(Day,7,b.RDATE)
FROM CARD a,BORROW b
WHERE a.CNO=b.CNO
    AND a.CLASS=N'C01'

9. 从BOOKS表中删除当前无人借阅的图书记录

--实现代码:
DELETE A FROM BOOKS a
WHERE NOT EXISTS(
    SELECT * FROM BORROW
    WHERE BNO=a.BNO)

10. 如果经常按书名查询图书信息,请建立合适的索引

--实现代码:
CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME)

11. 在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)

--实现代码:
CREATE TRIGGER TR_SAVE ON BORROW
FOR INSERT,UPDATE
AS
IF @@ROWCOUNT>0
INSERT BORROW_SAVE SELECT i.*
FROM INSERTED i,BOOKS b
WHERE i.BNO=b.BNO
    AND b.BNAME=N'数据库技术及应用'

12. 建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)

--实现代码:
CREATE VIEW V_VIEW
AS
SELECT a.NAME,b.BNAME
FROM BORROW ab,CARD a,BOOKS b
WHERE ab.CNO=a.CNO
    AND ab.BNO=b.BNO
    AND a.CLASS=N'力01'

13. 查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出

--实现代码:
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO
    AND b.BNAME IN(N'计算方法',N'组合数学')
GROUP BY a.CNO
HAVING COUNT(*)=2
ORDER BY a.CNO DESC

14. 假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句

--实现代码:
ALTER TABLE BOOKS ADD PRIMARY KEY(BNO)

15.1 将NAME最大列宽增加到10个字符(假定原为6个字符)

--实现代码:
ALTER TABLE CARD ALTER COLUMN NAME varchar(10)

15.2 为该表增加1列NAME(系名),可变长,最大20个字符

--实现代码:
ALTER TABLE CARD ADD 系名 varchar(20)


你可能感兴趣的:(DB)