您的位置:首页 > 数据库

SQL基本语句

2020-04-06 07:15 1291 查看

1.SQL的定义功能

1.1 表结构的定义

建立数据库首先要定义表的结果,SQL中用于创建基本表的语句如下:

create table <表名>
(<列名> <数据类型> [,列级完整性约束条件]
[,表级完整性约束条件]
)

事实上SQL是不区分大小写的,create table也可以写成大写
下面给出一个例子

create table 学生
(学号 char(8),
姓名 char(8),
性别 char(2),
出生年份 smallint,
籍贯 char(8),
学院 char(15)
)

该语句创建了一个表,表名为学生,表中有学号,姓名,性别,出生年份,籍贯,学院这几个属性

1.2 表的约束条件的定义

表的约束条件主要是对属性的约束,在创建表时候,直接将该约束写在属性的后面即可

create table 学生
(学号 char(8)  NOT NULL UNIQUE,
姓名 char(8),
性别 char(2),
出生年份 smallint,
籍贯 char(8),
学院 char(15) default '计算机学院'
)

这里给出了学号属性的约束,即不能为空,不能有重复,SQL中还有一些其他的约束条件,可以根据具体问题,给属性加不同的约束
default是给一个默认值,对于学院这个属性,每一个元组的默认属性都是计算机学院,如果不是计算机学院,可以进行修改

1.3 主关键字和外部关键字的定义

create table 学生
(学号 char(8),
姓名 char(8),
性别 char(2),
出生年份 smallint,
籍贯 char(8),
学院 char(15),
primary key(学号))

这里定义了这个表的主关键字为学号

create table 成绩
(学号 char(8),
课程号 char(8),
成绩 smallint,
primary key(学号,课程号),
foreign key(学号) references 学生(学号),
foreign key(课程号) references 课程(课程号)
)

在这条语句中,定义了成绩表的关键字为学号和课程号,同时定义了该表的两个外部关键字学号和课程号,其中学号是学生表的主关键字,课程号为课程表的主关键字

1.4 基本表的修改和删除

1.修改基本表的关键字为alter
几个例子:
(1)在学生表中添加“年龄”属性

alter table 学生 add column 年龄 smallint,

(2)在学生表中删除“年龄”属性

alter table 学生 drop column 年龄,

(3)将课程表中的课程名长度修改为20位

alter table 课程 alter column 课程名 char(20),

2.删除基本表的关键字为drop

drop table 学生 cascade,

将学生表删除,cascade表示将该表和涉及到的对象全都删除

2.1 单表查询

投影运算

select 学院
from 学生

从学生表中找出学院,相当于关系代数中的投影运算

select distinct 学院
from 学生

distinct的可以使返回的结果不保留重复行

选择运算

select *
from 学习
where 成绩<60

where语句用于选择,可以是各种运算,select表示投影出学习表中的所有属性

对查询结果分组

select 学号,count(课程号) AS 选课人数
from 学习
group by 学号

group by 语句依据学号对查询的结果分组,学号相同为一组,学号不同为一组
分组后,如果要对组进行筛选,要用having语句

select 学号,count(课程号) AS 选课人数
from 学习
group by 学号having 选课人数>3

返回结果如下

如果不加group by 语句直接用having语句进行筛选,则会只有一个结果

这里可以看出,分组的目的是为了细化集函数(这里是count函数)的作用对象,如果没有分组,那么count函数将会作用于整个查询结果,最终只有一个返回值。分组之后,集函数将作用于每一个组,那么每一个组都将返回一个函数值。

对查询结果排序

select 学号,成绩
from 学习
where 课程号='C1'
order by 成绩 DESC

order by 表示按成绩排序,DESC是降序,ASC为升序

2.2 连接查询

1.内连接
1.ANSI方式
例如要查找每个学生每一科的学习情况可以这样写

select 学生.*,学习.*
from 学生 inner join 学习 on 学生.学号=学习.学号

inner join表示是内连接方式

2.theta方式
同样的问题也可以写成

select 学生.*,学习.*
from 学生,学习
where 学生.学号=学习.学号

可以得到同样的结果

2.自身连接查询
例:求每一门课程先修课的先修课(间接先修课)

select first.课程号 as 课程号,first.课程名 as 课程名,second.先修课程号 as 间接先修课
from 课程 as first ,课程 as second
where first.先修课程号=second.课程号

给“课程”这个表起了两个别名,分别为first和second,再对其做自身连接

3.左外连接
左外连接也有theta和ANSI两种方式,ANSI方式用outer join ,on等关键字配合连接条件使用

select 姓名,课程号,成绩
from 学生,学习
where 学习.学号(+)=学生.学号

在where语句中,等号的左边加上“+”号,表示是左外连接

另外一种写的方式

select 姓名,课程号,成绩
from 学生
left outer join 学习 on 学生.学号=学习.学号

左外连接的特点是:当右侧表中没有匹配的记录时,左表中的记录仍然会返回,右侧表中的值自动填充为NULL
在上述语句中,如果某个学生由于没有选课而没有成绩,也会把他姓名返回,但是课程号和成绩的的值为NULL

4.右外链接

右外连接也有theta和ANSI两种方式,ANSI方式用outer join ,on等关键字配合连接条件使用

select 姓名,课程号,成绩
from 学生,学习
where 学习.学号=(+)学生.学号

在where语句中,等号的右边加上“+”号,表示是右外连接

另外一种写的方式:

select 姓名,课程号,成绩
from 学生
right outer join 学习 on 学生.学号=学习.学号

右外连接的特点是:当左侧表中没有匹配的记录时,右表中的记录仍然会返回,左侧表中的值自动填充为NULL
在上述语句中,如果某个学生由于没有选课而没有成绩,也会把他姓名返回,但是课程号和成绩的的值为NULL

5.复合条件连接查询
例:查询课程号为“C1”且成绩大于60的学生的学号

select 学生.学号,课程号,成绩
from 学生,学习
where 学生.学号=学习.学号 and 成绩>60 and 课程号='C1'

用ANSI 方式连接时,写法如下

select 学生.学号,课程号,成绩
from 学生
join 学习 on 学生.学号=学习.学号
and 成绩>60 and 课程号='C1'

例:查询每个学生以及其选修的课程名和成绩

select 学生.学号,学习.课程号,成绩
from 学生,学习,课程
where 学生.学号=学习.学号 and 学习.课程号=课程.课程号
select 学生.学号,学习.课程号,成绩
from 学生
join 学习 on 学生.学号=学习.学号
join 课程 on 课程.课程号=学习.课程号

6.集合运算连接查询
SQL中有提供了集合运算符:union,intersect,except分别对应关系代数中的并,交,差。用于两个查询直接,每个查询都要用圆括号括起来

(select 学号,课程号,成绩
from 学习
where 课程号='C1')
union
(select 学号,课程号,成绩
from 学习
where 课程号='C2'
)

union自动去掉重复的元组,如果想显示全部的结果,应该用union all

intersect和except的用法和union一样。
需要注意的是,不同的DBMS支持的集合运算不同,MySql只支持并运算

  • 点赞
  • 收藏
  • 分享
  • 文章举报
半城烟火、 发布了3 篇原创文章 · 获赞 0 · 访问量 70 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: