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表:
创建表: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
Region
要求:得到按区域划分的销售信息。 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
SELECT * FROM CARD SELECT * FROM BOOKS --创建表BORROW INSERT INTO BORROW SELECT 001,0002,'2006/12/10' SELECT * FROM BORROW --显示三个被创建的表 --------------------------------------------------------------------------------------- /* 1 列出emp表中各部门的部门号,最高工资,最低工资 2 列出emp表中各部门job为'CLERK'的员工的最低工资,最高工资 3 对于emp中最低工资小于1000的部门,列出job为'CLERK'的员工的部门号,最低工资,最高工资 4 根据部门号由高而低,工资有低而高列出每个员工的姓名,部门号,工资 5 写出对上题的另一解决方法 6 列出'张三'所在部门中每个员工的姓名与部门号 7 列出每个员工的姓名,工作,部门号,部门名 8 列出emp中工作为'CLERK'的员工的姓名,工作,部门号,部门名 9 对于emp中有管理者的员工,列出姓名,管理者姓名(管理者外键为mgr) 10 对于dept表中,列出所有部门名,部门号,同时列出各部门工作为'CLERK'的员工名与工作 11 对于工资高于本部门平均水平的员工,列出部门号,姓名,工资,按部门号排序 12 对于emp,列出各个部门中平均工资高于本部门平均水平的员工数和部门号,按部门号排序 13 对于emp中工资高于本部门平均水平,人数多与1人的,列出部门号,人数,按部门号排序 14 对于emp中低于自己工资至少5人的员工,列出其部门号,姓名,工资,以及工资少于自己的人数 |
问题描述:
本题用到下面三个关系表:
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. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期
--实现代码: 5. 查询书名包括"网络"关键词的图书,输出书号、书名、作者 --实现代码: 6. 查询现有图书中价格最高的图书,输出书名及作者 --实现代码: 7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出 --实现代码: 8. 将"C01"班同学所借图书的还期都延长一周 --实现代码: 9. 从BOOKS表中删除当前无人借阅的图书记录 --实现代码: 10. 如果经常按书名查询图书信息,请建立合适的索引 --实现代码: 11. 在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表) --实现代码: 12. 建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名) --实现代码: 13. 查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出 --实现代码: 14. 假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句 --实现代码: 15.1 将NAME最大列宽增加到10个字符(假定原为6个字符) --实现代码: 15.2 为该表增加1列NAME(系名),可变长,最大20个字符 --实现代码:
SELECT * FROM BORROW
WHERE RDATE
SELECT BNO,BNAME,AUTHOR FROM BOOKS
WHERE BNAME LIKE N'%网络%'
SELECT BNO,BNAME,AUTHOR FROM BOOKS
WHERE PRICE=(
SELECT MAX(PRICE) FROM BOOKS)
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
UPDATE b SET RDATE=DATEADD(Day,7,b.RDATE)
FROM CARD a,BORROW b
WHERE a.CNO=b.CNO
AND a.CLASS=N'C01'
DELETE A FROM BOOKS a
WHERE NOT EXISTS(
SELECT * FROM BORROW
WHERE BNO=a.BNO)
CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME)
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'数据库技术及应用'
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'
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
ALTER TABLE BOOKS ADD PRIMARY KEY(BNO)
ALTER TABLE CARD ALTER COLUMN NAME varchar(10)
ALTER TABLE CARD ADD 系名 varchar(20)