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
多表查询和符合查询在下一张