文章目录
- 一、数据定义
- 1、基本表的定义、删除与修改
- 2、索引的建立于删除(了解)
- 二、数据查询(会其中一种)
- 1、单表查询
- (1)这里出现重复元组,怎么处理??
- (2)between。。。。and
- (3)语法IN
- (4) 拓展
- (5)字符
- like
- 姓氏 % _ p95
- (6)关于空值的讨论
- (7)多重查询
- (8) order by子句
- (9)聚集函数
- (10)group by子句
- 2、连接查询
- 3、嵌套查询(exist不考)
- 三、数据更新
- 1、插入数据
- 2、修改数据
- 3、删除数据
- 四、空值的处理
- 五、视图
- 1、视图的定义
前言:本章正式学习sql语言的语法,学习完本章之后,要能够对基本表进行增删改查,定义视图。
一、数据定义
1、基本表的定义、删除与修改
这里需要注意的是列级完整型约束条件与表级完整性约束。
看几个例子:
1、建立student基本表
CREATE TABLE STUDENT
(
SNO CHAR(9) PRIMARY KEY, //这里是列级完整性约束,说明sno是主码
SNAME CHAR(20) UNIQUE, //表示SNAME是唯一值
SSEX CHAR(2),
SAGE SMALLINT,
SDEPT CHAR(20)
);
2、建立课程表
CREATE TABLE COURSE
(
CNO CHAR(4) PRIMARY KEY,
CNAME CHAR(40) NOT NULL,
CPNO CHAR(4),
CCREDIT SMALLINT,
FOREIGN KEY(CPNO) REFERENCES COUESE(CNO)
/*表级完整性约束,CPNO是外码,被参照表是course,被参照列是cno*/
);
本例子说明参照表与被参照表可以是一样的。
3、建立学生选课表
CREATE TABLE SC
(
SNO CHAR(10),
CON CHAR(4),
GRADE SMALLINT,
PRIMARY KEY (SNO,CNO),/*主码是由属性组构成,两个属性共同构成主码*/
FOREIGN KEY (SNO) REFERENCES STUDENT(SNO),
/*sno为外码,student为被参照表*/
FOREIGN KEY (CNO) REFERENCES COURSE (CNO),
/*cno为外码,course是被参照表*/
CHECK(GRADE BETWEEN 0 AND 100)
);
基本表的修改:
定义格式:
(1)增加基本表的属性
/*ALTER TABLE (表名) ADD (属性名) (属性类型);*/
ALTER TABLE STU ADD BIRTHDAY DATE;
(2)修改基本表某些属性类型
/*ALTER TABLE (表名) ALTER COLUMN (属性名) (属性类型);*/
ALTER TABLE STU ALTER COLUMN SNO INT;
(3)增加基本表某些属性约束条件
/*ALTER TABLE (属性名) ADD (约束条件)(属性名)*/
ALTER TABLE STU ADD UNIQUE(SNO);
基本的删除:
DROP TABLE <表名> [RESTRICT|CASCADE];
/*
当用restrict时,视图不会一起删除
当用cascade时,视图会一起被删除
*/
2、索引的建立于删除(了解)
索引是内模式的范畴,而基本表是模式(逻辑模式,概念模式),视图时外模式或子模式的范畴。
书上p88;
二、数据查询(会其中一种)
1、单表查询
说明:别名起在原属性后面;
(1)这里出现重复元组,怎么处理??
SELECT DISTINCT SNO FROM SC;
/*这里在sno属性前面加上了约束项,distinct即为去重重复元组,否则就默认all,显示所有*/
(2)between。。。。and
注意:这里查询的where语句,不要和基本表的定义中的cheak()子句搞混!!!
如果要查找不在20~23岁的学生,则按照下面写:
SELECT SNAME,SDEPT,SAGE
FROM STUDENT
WHERE SAGE NOT BETWEEN 20 AND 23;
在前面加上not即可;
(3)语法IN
SELECT SNAME,SSEX
FROM STUDENT
WHERE SDEPT IN('CS','MA','IS');
/*
要是这里题目是不在这些系里面的学生,只需要把最后一个where子句改了即可
WHERE SDEPT NOT IN('CS','MA','IS');
*/
(4) 拓展
这里说一下,有两个语句的区别,效率哪一高,大家判断一下?
SELECT *
FROM STU;
SELECT SNAME,SAGE
FROM STU;
这里我们认为时第二种效率高一些,无需知道原因,了解即可!
(5)字符
like
/*like与“=”是一样的作用*/
SELECT *
FROM STU
WHERE SNO='21230202';
WHERE SNO LIKE '21230202';
姓氏 % _ p95
(6)关于空值的讨论
(7)多重查询
SELECT SNAM
FROM STUDENT
WHERE SDEPT='CS' AND SAGE<20;
解释:这里用的是“or”,是指,“或者”的意思,三个系别的学生全部投影出来!
(8) order by子句
SELECT SNO,GRADE
FROM SC
WHERE CNO=‘3’
ORDER BY GRADE DESC;/*降序:desc,升序:asc,这里升序可不写,因为默认就是升序*/
SELECT *
FROM STUDENT
ORDER BY SDEPT,SAGE DESC;
/*
说明:这里出现sdept是升序,sgae是降序,那么他们内部逻辑是什么,是同时起作用还是有先后???
【分析】
当sdept一直时,此时才会看sage
即为,sdept一致的前提下,sage再按照降序来排序。
*/
(9)聚集函数
(10)group by子句
group by (属性);
将属性分组,即将相同的属性值放在一起,即一个组;
说明:按照学号分组,并且having后面加上聚集函数,来约束,寻找选修课程大于等于三的学号。聚集函数是作用在已经分好组的上面!!
特别注意:这里需要说明一下,select后面跟着的属性要与group by后面的一致。
2、连接查询
(1)
SELECT <>
FROM<>
WHERE <表名1>.<属性名1>==<表名2>.<属性名2>
这里的where通过如上格式将两个表连接起来,等于号左右是两个表的公共属性;
(2)
在where子句中也可以连接和查询一起加约束。
3、嵌套查询(exist不考)
此查询可以分为两步:
第一步查询刘晨的系名
第二步来用IN
合并为:
SELECT SNAME,SNO,SDEPT
FROM STUDENT
WHERE SDEPT IN(
SELECT SDEPT
FROM STUDENT
WHERE SNAME='刘晨'
);
这里也可以用连接查询:
select student.sno,sname
from student,course,sc
where student.sno=sc.sno and sc.sno=course.sno and cname='信息系统';
三、数据更新
1、插入数据
INSERT
INTO()
VALUES()
stu(sname,ssex,sno)
例子:
(1)在stu表里面加入一个学生,姓名,韩,性别,男,学号2123
INSERT
INTO STU(sname,ssex,sno)/*括号里面可写可不写,因为这里插入的数据与原关系模式属性一致*/
VALUES (‘韩’,‘男’,2123);
(2)在stu表里面加入一个学生,姓名,韩,性别,男
INSERT
INTO STU(sname,ssex)
VALUES (‘韩’,‘男’);/*这里再第三个属性显示时,会自动补上null*/
INSERT
INTO STU(sname,ssex,sno)/*如果这里是关系里面全部属性,而学号还不知道,则在插入时加上null*/
VALUES (‘韩’,‘男’,null);
2、修改数据
update <table>
set
where
例子1:修改一个名为张三的学生的学号
UPDATE STU
SET SNO='2222'
WHERE SNAME=张三;
例子2:将所有同学分数加10分
UPDATE SC
SET SGRADE=SGRADE + 10;
3、删除数据
DELETE FROM <TABLE>
WHERE
例子:删除张三的信息
DELETE FROM STU
WHERE SNAME=ZHANGSAN;
DELETE FROM STU;/*删除所有学生*/
四、空值的处理
五、视图
1、视图的定义
CREATE VIEW
AS <子查询>
注意:子查询一般用于连接查询,因为只要from后面跟着两个或两个以上的表,就要用连接查询,把他们的公共属性连接起来。