SQL 语言——SELECT 查询操作

实验目的:

-了解查询的概念和方法;
	-掌握 SQL Server 集成管理器查询子窗口中执行 SELECT 操作的方法;
	-掌握 SELECT 语句在单表查询中的应用;
	-掌握 SELECT 语句在多表查询中的应用;
	-掌握 SELECT 语句在复杂查询中的应用。

实验要求:

实验内容:

1、 背景知识

2、 利用 SQL 语句创建数据库及表和插入记录

  (1) 在 SQL Server Management Studio 的查询子窗口中(要以具有相应操作权限的某用 户登录)执行如下命令创建数据库。需要说明的是不同数据库系统其创建的数据库 命令或方式有所不同。 CREATE DATABASE jxgl
  (2) 刷新数据库目录后,选择新出现的 jxgl 数据库,在 SQL 操作窗口中,创建 Student、 SC、Course 三个表及表记录。 利用 CREATE、INSERT、CHECK、DEFAULT、PRIMARY KEY、FPREIGN KEY、CONSTRAINT、 IN、UNION、EXISTS、WHERE、GROUP BY、ORDER BY、UNIQUE 等 SQL 命令在 SQL 操作 窗口编写 SQL 语句进行表结构的定义和记录的插入,主要包含以下三个表:


表2-1 学生表(Student)表结构

字段名

数据类型

长度

是否允许为空值

说明

Sno

字符型(char)

5

×

学号,主键

Sname

字符型(varchar)

20

×

姓名

Ssex

字符型(char)

2

性别,默认”男“

Sage

短整型(smallint)


年龄

Sdept

字符型(varchar)

8


系名

表 2-2 课程表(Course)表结构

字段名

数据类型

长度

是否允许为空值

说明

Cno

字符型(char)

4

×

课程号,主键

Cname

字符型(varchar)

20

×

课程名

Cpno

字符型(char)

4


先行课

Ccredit

精确值型(numeric)

numeric(2,1)


学分

表 2-3 学生选课表(SC)表结构

字段名

数据类型

长度

是否允许为空值

说明

Sno

字符型(char)

5

×

学号,外键

Cno

字符型(char)

20

×

课程号,外键

Grade

精确值型(decimal)

decimal(4,1)


成绩,0~100之间

学生表:Student(Sno,Sname,Ssex,Sage,Sdept) Sno 为主键
说明:Sno 学号,Sname 姓名,Ssex 性别,Sage 年龄,Sdept 所在系
表中现有记录为:

Sno

Sname

Ssex

Sage

Sdept

98001

钱横


18

CS

98002

王林


19

CS

98003

李民


20

IS

98004

赵三


16

MA

98005

钱力


25

PH

98006

曹莉


16

MA

98007

孙慧


22

PH

课程表:Course(Cno,Cname,Cpno,Credeit) Cno 为主键
说明:Cno 课程号,Cname 课程名,Cpno 先行课,Ccredit 学分
表中现有记录为

Cno

Cname

Cpno

Ccredit

1001

数据库系统

1005

4

1002

数学分析

NULL

2

1003

信息系统导论

1001

3.5

1004

操作系统_原理

1006

3

1005

数据结构

1007

4

1006

数据处理基础

NULL

4

1007

C 语言

1006

3

学生选课表:SC(Sno,Cno,Grade) Sno,Cno 为主键
说明:Sno 学号,Cno 课程号,Grade 成绩
表中现有记录为:

Sno

Cno

Grade

98001

1001

87

98001

1002

67

98001

1003

90

98001

1004

97

98002

1002

95

98002

1003

88

98003

1002

57

98003

1004

54

98004

1001

87

98004

1002

95

98004

1003

81

98004

1004

79

98004

1005

47

98004

1006

92

98004

1007

71

98005

1002

48

98005

1005

NULL

3、 单表查询

(1) 查询考试成绩大于等于 90 的学生的学号。
(2) 查询年龄大于 23 岁的男学生的学号和姓名。
(3) 查询年龄大于 18 岁,并不是信息系(IS)与数学系(MA)的学生的姓名和性别。
(4) 查询以“操作系统_”开头,且倒数第二个汉字为“原”字的课程的详细情况。 (5) 查询选修了课程的学生人数。
(6) 根据系统当前时间和学生年龄,查询学生出生日期(要求以特定输出:年-月-日)。

建表的SQL语句:
	create table Student(
	Sno char(5) not null primary key,	-- 学号,主键
	Sname varchar(20) not null,			-- 姓名
	Ssex char(2) default('男'),			-- 性别,默认为男
	Sage smallint,						-- 年龄
	Sdept varchar(8),					-- 系名
	)
	go
	
	create table Course(
		Cno char(4) not null primary key,	-- 课程号,主键
		Cname varchar(20) not null,			-- 课程名
		Cpno char(4),						-- 先行课
		Ccredit numeric(2,1),				-- 学分
	)
	
	create table SC(
		Sno char(5) not null,				-- 学号,外键
		Cno char(4) not null,				-- 课程号,外键
		Grade decimal(4,1),					-- 成绩
	)
	--向学生表(Student)中插入数据
	insert into Student values ('98001','钱横','男',18,'CS')
	insert into Student values ('98002','王林','女',19,'CS')
	insert into Student values ('98003','李民','男',20,'IS')
	insert into Student values ('98004','赵三','女',16,'MA')
	insert into Student values ('98005','钱力','男',25,'PH')
	insert into Student values ('98006','曹莉','女',16,'MA')
	insert into Student values ('98007','孙慧','女',22,'PH')
	
	select * 
	from Student
	--向课程表(Course)中插入数据
	insert into Course values('1001','数据库系统','1005',4)
	insert into Course values('1002','数学分析',null,2)
	insert into Course values('1003','信息系统导论','1001',3.5)
	insert into Course values('1004','操作系统原理','1006',3)
	insert into Course values('1005','数据结构','1007',4)
	insert into Course values('1006','数据处理基础',null,4)
	insert into Course values('1007','C语言','1006',3)
	
	select *
	from Course
	--向选课表(SC)中插入数据
	insert into SC values('98001','1001',87)
	insert into SC values('98001','1002',67)
	insert into SC values('98001','1003',90)
	insert into SC values('98001','1004',97)
	insert into SC values('98002','1002',95)
	insert into SC values('98002','1003',88)
	insert into SC values('98003','1002',57)
	insert into SC values('98003','1004',84)
	insert into SC values('98004','1001',87)
	insert into SC values('98004','1002',95)
	insert into SC values('98004','1003',81)
	insert into SC values('98004','1004',79)
	insert into SC values('98004','1005',47)
	insert into SC values('98004','1006',92)
	insert into SC values('98004','1007',71)
	insert into SC values('98005','1002',48)
	insert into SC values('98005','1005',null)
	
	select *
	from SC
----------------------单表查询----------------------
--1.查询考试成绩大于等于 90 的学生的学号
select SC.Sno
from SC
where Sc.Grade >= 90

--2.查询年龄大于 23 岁的男学生的学号和姓名
select Student.Sno,Student.Sname
from Student
where Student.Sage > 23

--3.查询年龄大于 18 岁,并不是信息系(IS)与数学系(MA)的学生的姓名和性别
select Student.Sname,Student.Ssex
from Student
where Student.Sage > 18
and Student.Sdept not in('IS','MA')

--4.查询以“操作系统_”开头,且倒数第二个汉字为“原”字的课程的详细情况
select *
from Course
where Course.Cname like '操作系统%原_'

--5.查询选修了课程的学生人数
select distinct count(*) as 选秀课程人数
from Course

--6.根据系统当前时间和学生年龄,查询学生出生日期(要求以特定输出:年-月-日)
select year(GETDATE())
select Student.Sname,(year(GETDATE()) - Student.Sage) as 出生年份
from Student

多表查询和符合查询在下一张