灵魂的一般是学识,另一半是骨子里的涵养!

    

SQL Server中的查询语句总结

对于关系型数据库,不同的数据库系统有写细节不一样,下面以SQL Server为例,使用SQL语句总结SQL Server中的常用的查询语句:
sql03.png

一.先建立一个大学数据库

create database college
go

use college
go

create table department(
dept_name varchar(20),
building varchar(20),
budget numeric(8,2),
primary key (dept_name)
)

create table course(
course_id varchar(20),
title varchar(20),
dept_name varchar(20)
primary key (course_id),
foreign key (dept_name) references department
)

create table instructor(
ID varchar(20),
name varchar(20),
dept_name varchar(20),
salary numeric(8,2),
primary key (ID),
foreign key (dept_name)references department
)

create table section(
course_id varchar(20),
sec_id varchar(20),
semester varchar(20),
year numeric(4,0),
building varchar(20),
room_number varchar(20),
time_slot_id varchar(20),
primary key (course_id,sec_id,semester,year),
foreign key (course_id) references course
)

create table teaches(
ID varchar(20),
course_id varchar(20),
sec_id varchar(20),
semester varchar(20),
year numeric(4,0),
primary key (ID,course_id,sec_id,semester,year),
foreign key (course_id,sec_id,semester,year) references section,
foreign key (ID) references instructor
)

create table student(
ID varchar(20),
name varchar(20),
dept_name varchar(20),
tot_cred varchar(20),
primary key (ID),
foreign key (dept_name) references department
)

create table takes(
ID varchar(20),
course_id varchar(20),
sec_id varchar(20),
semester varchar(20),
year numeric(4,0),
grade numeric(3,0),
primary key (ID,course_id,sec_id,semester,year),
foreign key (course_id,sec_id,semester,year) references section
)

go

二.进行查询

1.单关系查询
(1)简单查询一个字段:

select name instructor

(2)使用distinct关键字屏蔽重复的结果:

select distinct dept_name from instructor

(3)使用all关键字不去除重复结果:

select all dept_name from instructor

2.多关系查询
(1)多个表查询多个字段并使用where关键字做筛选条件

select name,instructor.dept_name,building
from instructor,department
where instructor.dept_name = department.dept_name

3.多表连接查询
使用join关键字对两个表进行连接查询,以下使用对两个表进行连接查询
(1)外连接:
a.坐外连接:left join 或 left outer join,左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL)。

select name,course_id
from instructor left join teaches
on instructor.ID=teaches.ID

b.右外连接:right join 或 right outer join,右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。

select name,course_id
from instructor right join teaches
on instructor.ID=teaches.ID

c.完全外连接: full join 或 full outer join,完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL)。

select name,course_id
from instructor full join teaches
on instructor.ID=teaches.ID

(2)内连接:join 或 inner join,inner join 是比较运算符,只返回符合条件的行。

--a.内连接查询
select name,course_id
from instructor inner join teaches
on instructor.ID=teaches.ID

--b.此时,a中内连接代码等同于以下代码
select name,course_id
from instructor,teaches
where instructor.ID=teaches.ID

4.嵌套子查询
嵌套子查询,子查询一般作为where的条件。
(1)使用嵌套子查询的方式查询2009秋季开课和2010年春季开课的课程:

select distinct course_id 
from section 
where semester = 'Fall' and year = 2009 and
course_id in (
select course_id 
from section 
where semester = 'Sprint' and year = 2010 
)

not exists操作符(除操作符,表示除外),使用not exists关键字查询结果集中是否不存在元组,如:"关系A包含关系B",可以使用"not exists (B except A)",即B不包含A。
(2)使用not exists关键字查询“所有选修Biology系开课的所有课程的学生”:

select S.ID,S.name
from student as S 
where not exists(
(select course_id from course where dept_name = 'Biology')
except
(select T.course_id from takes as T where S.ID = T.ID)
)

分析如下:
a.以下代码找出所有开课课程:

(select course_id from course where dept_name = 'Biology')

b.找出所有S.ID选修的课程

(select T.course_id from takes as T where S.ID = T.ID)

最后代码联合起来,外层的select就实现了判断每个学生选修的课程是否包含'Biology'系开的课。即SQL语句查询了所有学生,再通过where not exists结构筛选出符合条件的学生。

尊重作者知识版权,转载请声明出处!

本文原创首发自微信订阅号:极客开发者up,禁止转载!

评论已关闭

  关于博主

欢迎关注博主的微信订阅号 “极客开发者up” ,第一时间接收文章更新!

  近期评论

  • 暂无评论

你是否在某个夜深人静的时刻,静静地听着Bressanone,思念着某人。—— by 小宇

每个人心里都有一段伤痕,时间才是最好的疗剂。

人总是珍惜未得到的,而遗忘了所拥有的。

退一步,并不象征我认输;放手,并不表示我放弃;微笑,并不意味我快乐!

人海中再回首,朋友真诚依旧,生命里重逢,心境平和温柔,往事如风,岁月如歌,漫漫人生路,苍桑几许,幸福几何!