目录
SQL语言基本概念
SQl(structured query language)结构化的查询语言,是一种在数据库管理系统中查询或对数据库里面的数据进行更改的语言
SQL语言的构成
SQL语言是集DDL、DQL、DML、DCL为一体的数据库语言
1、数据定义语言DDL(Database Definition Language):主要用来定义逻辑结构,包括定义基表、索引、视图。Create(创建)、Alter(修改)、Drop(删除)
模式的定义和删除,包含着Database、Table、View、Index、完整性约束条件等
2、数据库操作语言DML(Database Manipulation Language):用SQL语言改变数据库中的数据。Insert、Delete、Update、Select
3、数据库控制语言DCL(Database Control Language): 对表和视图的授权(Grant、Revoke)、完整性规则的描述以及事务开始和结束的控制语句等
SQL语言的特点
1、综合统一:SQL语言可以完成数据库生命周期的全部活动,包括定义关系模式、录入数据、建立数据库、查询、更新、维护、数据库重构、数据库安全)
2、高度非过程化:关注的是做什么,而不是怎么做
3、面向集合的操作方式
4、以同一种语法结构提供多种使用方式(交互式的SQL语言、嵌入式的SQL语言)
5、语言简洁、易学易用
数据库定义语言DDL
SQL的基本数据类型
char(n):长度为n的字符串
varchar(n):最大长度为n的变长字符
int/integer:整型(4B)
smallint:短整型(2B)
bigint:长整型(8B)
float(n):可选精度的浮点数,精度至少为n为数字
decimal(p,d):p指一共有几位数字(不包含小数点和符号),d指小数点后面有几位。eg:decimal(3,2) 2.13
date:日期,包含年月日,格式YYYY- MM- DD
time:时间,包含一日的时分秒,格式HH-MM- SS
timestamp:时间戳(毫秒),从1920-01-01-00-00-00 到现在
模式的定义和删除
1、模式的定义
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;
例子:为用户ZHANG定义一个学生-课程模式S-T
CREATE SCHEMA S-T AUTHORIZATION ZHANG;
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>]
模式是什么呢,所以可以在后面跟上表的定义子句或者视图的定义子句或者授权的定义子句
例子:为用户ZHANG创建一个模式TEST,并且在其中定义一个表TAB1
CREATE SCHEMA TEST AUTHORIZATION ZHANG;
CREATE TABLE TAB1(COL1 INT,
COL2 SMALLINT,
COL3 CHAR(20),
COL4 DECIMAL(5,2)
);
2、模式的删除
DROP SCHEMA <模式名> <RESTRICT|CASCADE>;
DROP SCHEMA TEST CASCADE;
RESTRICT(限制):模式的删除是有限制的,如果该模式下属的数据库对象(表、视图),则拒绝该模式的删除
CASCADE(级联):模式的删除是没有限制的,删除模式的同时将该模式中的数据库对象全部删除
基本表的定义、删除、修改
1、基本表的定义
CREATE TABLE<表名>(<列名><列的属性>[列级完整性约束]
[,<列名><列的属性>[列级完整性约束]]
…
[,<表级完整性约束>]);
CREATE TABLE STUDENT(S# char(20) PRIMARY KEY,
SNAME VARCHAR(255),
SAGE INT);
对于表的完整性约束条件都被存在数据字典中,当用户对数据库进行操作时,由数据库自动检查该操作是否违背完整性约束
当完整性约束涉及多个属性列时,需要将该完整性约束定义在表的基础上,也就是将该完整性约束定义在表级完整性约束
当完整性约束只涉及一个属性列时,可以定义在列级也可也定义在表级
2、基本表的修改
Alter Table <表名>
[Add [cloumn] <新列名><数据类型>[完整性约束] ]
[Add <表级完整性约束>]
[Drop [column] <列名> [restrict|cascade]]
[Drop constraint <完整性约束名> [restrict|cascade]]
[Alter column <列名><数据类型>];
例子:向student表中增加“入学时间”列,数据类型为日期类
ALTER TABLE studen ADD s_entrance DATE;
例子:将student表中年龄的数据类型由字符型改成整型
ALTER TABLE student ALTER COLUMN s_age int;
例子:向course表中的课程名称增加必须取值唯一性的约束条件
ALTER TABLE course ADD Unique(Cname);
3、删除表
DROP TABLE <表名> [restrict|cascade];
索引
1、建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名> (<列名>[<次序>] [, <列名> [<次序>] …])
(1)、Unique:每个索引对应唯一一个元组(数据记录); Claster:聚簇索引,一个所以对应多个元组
(2)、ON <表名>:<表名>是建立索引的基本表的名称,建立一个索引可以在一个表的一列或者多列上建立
(3)、<次序>:索引值的排列次序,可以是ASC:升序,也可以是:DESC:降序。默认是ASC
例子:给SC表按学号升序和课程号降序建立唯一索引
CREATE UNIQUE SCno ON Course (Sno ASC, Cno DESC);
2、修改索引
ALTER INDEX <旧的索引名> RENAME TO <新的索引名>;
3、删除索引
DROP INDEX <索引名>;
数据字典
数据字典就是关系数据库管理模型的一组系统表,里面存储这关系数据库的定义信息,包括着关系模式定义、表定义、视图定义、索引定义、完整性约束定义、用户访问数据库权限的定义、统计信息等。
数据库操纵语言 DML
下面经常会用到的数据库
1、创建课程学习数据库SCT
CREATE DataBase SCT;
2、向表中追加元组
INSERT INTO 表名[(列名[,列名]...)] VALUES (值[,值],...);
3、检索学生表中的所有信息
SELECT * FROM Student;
4、检索学生表中的所有学生的姓名和年龄
SELECT Sname,Sage FROM Student;
5、检索学生表中所以年龄小于等于19岁的学生的年龄及姓名
SELECT Sname, Sage FROM Student
WHERE Sage <= 19;
6、检索教师表中所有工资小于1500元或者工资大于2000元并且是03系的教师名称
SELECT Tname FROM Teacher
WHERE (Salary < 1500 or Salary > 2000) and D# = '03' ;
结果唯一性问题 DISTINCT
9、求学过001号课程或002号课程的学生的学号
SELECT DISTINCT S# FROM SC
WHERE C# = '001' OR C# = '002';
distinct : 可以去除搜索结果中的重复数据
10、在选课表中,检索成绩大于80分的所有学号
SELECT DISTINCT S# FROM SC
WHERE SCORE > 80;
重名值处理 AS
11、求就学过001号课程又学过002号课程的学生学号
SELECT S# FROM SC SC1,SC SC2
WHERE SC1.S# = SC2.S# AND SC1.C# = '001' AND SC2.C# = '002';
where sc sc1, sc sc2:取别名
结果排序问题 ORDER BY
12、按学号由小到大的顺序显示出所有学生的学号及姓名
SELECT S#,Sname FROM Student
ORDER BY S# ASC;
13、检索002号课程大于80分的所有同学学号并按成绩由高到低显示
SELECT S# FROM SC
WHERE C# = '002' AND Score > 80
ORDER BY Score DESC;
模糊查询问题LIKE
列名 [not] like ‘字符串’
“%” :匹配零个或多个字符
“_”:匹配任意单个字符
“ \ ”:转义字符,去掉一些特殊字符的特定含义,使其作为普通的字符看待 eg:“%” 去匹配字符%;“_” 去匹配字符 _
14、检索所有姓张的学生姓名和学号
SELECT S#,Sname FROM Student
WHERE Sname LIKE '张%';
15、检索名字为张某某的所有同学姓名
SELECT Sname FROM Student
WHERE Sname LIKE '张_ _';
16、检索名不姓张的所有同学姓名
SELECT Sname FROM Student
WHERE Sname NOT LIKE '张%';
多表联合查询
17、按"001"号课程成绩由高到低顺序显示所有学生的姓名
SELEC Sname FROM Student, SC
WHERE SC.C# = '001' AND SC.S# = Student.S#
ORDER BY SC.Score DESC;
不等值连接
** 18、求有薪水差额的任意两位教师**
SELECT T1.teacher1, T2.teacher2 FROM Teacher T1, Teacher T2
WHERE T1.Salary > T2.Salary;
SQL语言进行增删改
一、INSERT
(1)单一元组新增命令形式
INSERT INTO 表名 [(列名 [,列名]…)]
VALUES (值 [, 值]…);
(2)批数据新增命令形式:插入子查询结果中的若干条元组
IINSERT INTO 表名 [(列名 [,列名]…)]
子查询;
**19、新建立的TABLE:St(S#, Sname),Student表中的学生姓名最后一个字为伟的学生插入该新的表中
INSERT INTO St(S#, Sname)
SELECT S#,Sname FROM Student
WHERE Sname LIKE '%伟';
20、新建table:ST(S#, Sname, avgScore),将检索到的同学的平均成绩新增到该表
INSERT INTO ST(S#, Sname, avgScore)
SELECT S#, Sname, AVG(Score) FROM Student, SC
WHERE Student.S# = SC.S#
GROUP BY Student.S#;
二、DELETE
DELEETE FROM 表名 [WHERE 条件表达式]
若没有WHERE,则将所有元组删除
20、删除98030101号同学所选的所有课程
DELETE FROM SC WHERE S# = '98030101';
21、删除所有自动控制的同学
DELETE FROM Stuedent
WHERE D# IN (SELECT D# FROM Dept
WHERE Dname = '自动控制');
22、删除有四门不及格课程的所有同学
DELETE FROM Student
WHERE S# IN (SELECT S# FROM SC
WHERE Score < 60
GROUP BY S# HAVING COUNT(*) >= 4);
三、UPDATE
UPDATE 表名
SET 列名 = 表达式|(子查询)
[[,列名 = 表达式|(子查询)]…]
[WHERE 条件表达式];
如果没有where更新所有元组
SQL 复杂查询和视图
(NOT) IN 子查询
23、列出选修001号课程的学生的学号和姓名
法一:
SELECT S#, Sname FROM Student, SC
WHERE Student.S# = SC.S# AND SC.C# = '001';
法二:
SELECT S#,Sname FROM Student
WHERE S# IN (SELECT S# FROM SC
WHERE C# = '001');
24、求既学过001号课程,又学过002号课程的学生的学号
SELECT S# FROM SC
WHERE C# = '001' AND S# IN (SELECT S# FROM SC
WHERE C# = '002');
25、列出没有学过李明老师教授课程的所有同学的姓名
SELECT Sname FROM Student
WHERE S# NOT IN (SELECT S# FROM SC,Course
WHERE SC.C# = Course.C# AND T# IN(
SELCT T# FROM Teacher
WHERE Tname = '李明'));
SELCT S# FROM Student
WHERE S# NOT IN(
SELECT S# FROM SC, Course, Teacher
WHERE SC.C# = Course.C# AND Course.T# = Teacher.T# AND Teacher.Tname ='李明');
相关子查询:在嵌套查询中,子查询的查询条件依赖父查询,则称为相关子查询
非相关子查询:在嵌套查询中,子查询的查询条件不依赖父查询,则称为非相关子查询
θ some 与 θ all 子查询
θ是比较运算符:=, <, >, <=, >=, <>
26、找出001号可成绩最高的所有学生的学号
SELECT S# FROM SC
WHERE C# = '001' AND Score >= ALL (SELECT Score FROM SC
WHERE C# = '001');
27、找出98030101号同学成绩最低的课程号
SELECT C# FROM SC
WHERE S# = '98030101' AND Score <= ALL (SELECT Score FROM SC
WHERE S# = '98030101');
28、找出张三同学成绩最低的课程号
SELECT C# FROM SC,Student S
WHERE SC.S# = S.S# AND S.Sname = '张三' AND Score <= ALL(SELECT Score FROM SC
WHERE S# = SC.S#);
(NOT) EXISTS子查询
29、检索学过001号教师主讲的所有的课程的所有同学姓名
不存在001号教师主讲的课,该同学没有学过
SELECT Sname FROM Student S
WHERE NOT EXISTS(SELECT * FROM Course C
WHERE T# = '001' AND NOT EXISTS(SELECT * FROM SC
WHERE C# = C.C# AND S# = S.S#));
30、列出没有学过李明老师讲授的任何一门课程的所有同学的姓名
不存在李明老师的任何一门课程,该同学学过
SELECT Sname FROM Student S
WHERE NOT EXISTS(SELECT * FROM Teacher T, Couser C, SC
WHERE T.T# = C.T# AND T.Tname = '李明' AND EXISTS(SELECT * FROM SC
WHERE S#=S.S# AND C# = C.C#));
31、列出至少学过98030101号同学学过的所有课程的同学的学号
不存在98030101号同学学过的课程,该同学没有学过
SELECT DISTINCT S# FROM SC SC1
WHERE NOT EXISTS(SELECT * FROM SC SC2
WHERE S#='98030101' AND NOT EXISTS(SELECT * FROM SC SC3
WHERE S#=SC1.S# AND C#=SC2.C#));
结果计算
32、求有差额(差额>0)的任意两位教师的薪水差额
SELECT T1.Tname AS tearcher1, T2.Tname AS teacher2, T1.Salary - T2.Salary
FROM Teacher T1, Teacher T2
WHERE T1.Salary > T2.Salary;
聚集函数
COUNT, SUM, AVG, MAX, MIN
33、求每位学生的平均成绩
SELECT S#, AVG(Score) FROM SC
GROUP BY S#;
34、求不及格课程超过两门的同学的学号
SELECT S# FROM SC
WHERE Score < 60
GROUP BY S# HAVING COUNT(*) > 2;
HAVING子句和WHERE子句表达条件的区别:
1、每一行检查是否满足条件 用WHERE子句
2、每一组检查是否满足条件 用HAVING子句
并-差-交
子查询 {Union [ALL] | Intersect [ALL] | Except [ALL] 子查询}
(1)不带ALL:自动删除重复元组; 带ALL:保留重复元组
35、已知两个表:Customers(CID, Cname, City, Discnt) ; Agents(AID, Aname, City, Percent)求客户所在或者代理商所在的城市
SELECT City FROM Customers
Union
SELECT City FROM Agents;
空值的处理
空置被用一种特殊的符号NULL来标记,空值不能进行运算
空值检测:IS [NOT] NULL
检测出年龄为空的学生学号:
SELECT S# FROM Student WHERE Sage IS NULL;
上述条件不能写成Sage = NULL
,因为空值不能进行运算
…