基础的SQL笔记
作者:cmscn 日期:2008-11-09
建立数据库:
Create database<数据库名>
如:create database 教学
创建表:
Create table<表名>(<列名1><数据类型>,<列名2><数据类型>,…,<列名n><数据类型>,primary key(<主码>),foreign key(〈外码〉)references 表名(<外码>))
如:create table 成绩
(学号 char(6) not null,课程编号 char(8) not null,分数numeric(8,2),primary key(学号,课程编号),foreign key(学号) references 学生(学号),foreign key(课程编号) references 课程(课程编号))
注——常见的数据类型:
修改表结构(添加属性):
Alter table<表名>add<新属性名><域类型>
如:Alter table 系 add 电话号码 char(8)
修改属性的性质:
Alter table <表名> alter column <属性名><新的域类型>
如:Alter table 系alter column 电话号码 char(13)
删除一个属性:
Alter table <表名> drop column <属性名>
如:Alter table 系drop column 电话号码
删除表
Drop table <表名>
如:Drop table 教工
创建索引
Create<unique> index <索引号>on <表名>(<索引关键字>)
如:create unique index scodex on 教工(教工号)
插入数据(三种情况)
(1)insert into <表名> values (<值1>,<值2>,…,< 值n>)
如:Insert into 系values(102,’管理科学’)
(2)insert into <表名>(<列名表>) values (<值列表>)
如:Insert into 系(系编号,系名)values(102,’管理科学’)
(3)insert into <表名>(<列名表>)select<列名表>form<表名>
如:insert into 酬金(教工姓名,工资)select 姓名,工资from教工
更新数据
Update<表名>set <列名1>=<新值1>,<列名2>=<新值2>,…,< 列名n>=<新值n>where<条件表达式>
如: update 教工 set工资=工资*1.1 where 职称=’教授’
删除数据
Delete from <表名>where<条件表达式>
如:delete from 教工 where 教工号=’2001’(没有指明where删除所有数据)
查询操作
Select<*/distinct(消除重复)/as(对输出的重命名,可包含表达式)>
From <表名1>,<表名2>,…,<表名m>
Where<条件表达式>
如:select 课程名,学时/17 as学分 from 课程
Select R.姓名,R.工资
From 教工 R,教工 S
Where R.工资<S.工资 and S.姓名=’江滔’
字符串操作
% ‘表示任意子字符串
_ ‘表示任何一个字符
字符串操作符like
如:select 姓名
from 教工
where 姓名like ‘王_平’
几个特殊的运算符
<not>between and
排列显示顺序
Select <列名1>,<列名2>,…,< 列名n>
From <表名1>,<表名2>,…,<表名m>
Where<条件表达式>
order by <列表名>[desc][asc]
集合查询
(select a,b,c from R) union <all 保留重复> (select a,b,c from S) ‘并操作
(select a,b,c from R) intersect <all 保留重复> (select a,b,c from S) ‘交操作
(select a,b,c from R) except <all 保留重复> (select a,b,c from S) ‘差操作
集聚函数
Select <avg(平均值) / sum(总和) / max(最大值) / min(最小值) / count<* / distinct (记数<所有行 / 唯一且非空)>
如:select count(distinct (学号)) as 人数 from 成绩
Group by 和 having
格式:Select <列名1>,<列名2>,…,< 列名n>
From <表名1>,<表名2>,…,<表名m>
Where<条件表达式>
[group by <分组表达式>]
[having <筛选条件表达式>]
如:select 性别,count(*)
From 学生
Group by 性别
如:select 学号,count(课程编号),avg(分数)
From 成绩
Where 分数>=60
Group by 学号
Having count(课程编号)>2 and avg(分数)>70 ‘分组后再筛选
空值(is null 和is not null)集聚函数(sum avg min max忽略null)
如:select 帐号,姓名
From 贷款
Where 金额is null ‘找出表中金额为空的帐号和姓名
嵌套查询
select A.学号
from 成绩 A
where A.课程号=’C1’ and A.分数>=
(select avg(B.分数)
from 成绩 B
where B.课程号=’C1’)
(1) 不相关子查询
where <表达式e>[not] in(R)
如:select 学号 姓名
from 学生
where 学号 <not> in
(select 学号
From 成绩
Where 课程编号=
(select 课程编号
From 课程
Where 课程名称=’计算机’))
(2) 相关子查询(子查询需要根据外查询提供的数据运行)
Where [not] exists (R)
如:select 姓名
From 学生A
Where 90<=
(select 分数
From 成绩B
Where A.学号=B.学号and B.课程编号=’c2’)
ANY、ALL、SOME量词
select 姓名
From 学生A
Where 工资>any / all / some
(select 分数
From 成绩B
Where A.学号=B.学号and B.课程编号=’c2’)
视图(视图是一个虚表,他的数据来自一个或多个基本表,或者来自其他的视图)
格式:
创建视图
create view <视图名> as〈查询语句〉
删除视图
Drop view <视图名>