sql基本查询

数据库基本查询https://www.cnblogs.com/yank/p/3672478.html

大二数据库实验报告册:https://blog.csdn.net/qq_38409944/article/details/80424093

以这个数据库为例,说一些经典的查询语句:

create database XSGL
GO
use XSGL
GO
Create table student      --创建学生表
(sno char(8) primary key,        --(实体完整性)学生姓名
 sname char(8) not null unique, --学生姓名
 ssex char(2) default '男' check(ssex='男' or ssex='女'),  --性别给定默认值为'男',取值只能取‘男’或‘女’
 sage tinyint check(sage>13 and sage<50),
 sdept char(20))


create table course       --创建课程表 
(cno char(2) PRimary key,        --课程编号
 cname varchar(50),  --课程名称
 cpno char(2),       --先修课号
 ccredit tinyint)  --课程名

create table sc        --创建成绩表
(sno char(8),           --学生学号
 cno char(2),         --课程编号
 grade tinyint,           --成绩
 constraint pk_grade primary key(sno,cno),
 constraint fk_stuid foreign key(sno) references student(sno),
 constraint fk_course foreign key(cno) references course(cno),
 constraint ck_grade check(grade>=0 and grade<=100) )
go
insert into student(sno,sname, ssex,sage,sdept) values('95001', '李勇', '男', 20, 'CS')
insert into student(sno,sname, ssex,sage,sdept) values('95002', '刘晨', '女', 19, 'IS')
insert into student(sno,sname, ssex,sage,sdept) values('95003', '王敏', '女', 18, 'MA')
insert into student(sno,sname, ssex,sage,sdept) values('95004', '张立', '男', 19, 'IS')
insert into student(sno,sname, ssex,sage,sdept) values('95005', '刘云', '女', 18, 'CS ')
insert into course(cno, cname,ccredit,cpno) values('1', '数据库', 4, '5')
insert into course(cno, cname,ccredit,cpno) values('2', '数学', 6, null)
insert into course(cno, cname,ccredit,cpno) values('3', '信息系统', 3, '1')
insert into course(cno, cname,ccredit,cpno) values('4', '操作系统', 4, '6')
insert into course(cno, cname,ccredit,cpno) values('5', '数据结构', 4, '7')
insert into course(cno, cname,ccredit,cpno) values('6', '数据处理', 3, null)
insert into course(cno, cname,ccredit,cpno) values('7', 'PASCAL语言', 4, '6')
insert into sc(sno,cno,grade) values('95001', '1' ,92)
insert into sc(sno,cno,grade) values('95001', '2' ,85)
insert into sc(sno,cno,grade) values('95001', '3' ,88)
insert into sc(sno,cno,grade) values('95002', '2' ,90)
insert into sc(sno,cno,grade) values('95002', '3' ,80)
insert into sc(sno,cno,grade) values('95003', '2' ,85)
insert into sc(sno,cno,grade) values('95004', '1' ,58)
insert into sc(sno,cno,grade) values('95004', '2' ,85)

数据查询的SQL语句语法格式如下:

select [all | distinct]  表的列名或列表达式

from [表名或视图名]

[where <条件表达式>]

[group by 列名 [having 组条件表达式]]

[order by 列名 [asc | desc ]]

all或者*选项将显示所有的查询记录

distinct选项或默认使查询的结果只含不同的记录,取消后面相同的记录

group having  order by用法在第一篇博客中有介绍,这里不多说了

1,查询全体学生的详细记录

select * 
from student;

2,查询考试不及格的学生学号

select distinct sno ;distinct是限制选择条件,选择的是不同的
from sc where grade<60;

3,查询同时选修了1号课程和2号课程的学生学号

select Sno
from SC 
where Cno='1' and Son in (select Sno from SC where Cno='2');
;或者
where Cno='1' intersert select Sno from SC where Cno='2');
;INTERSECT对两个查询做交集。相当于and
select Sno

from sc where Cno='1'and Cno='2';
;这样写是错误的,因为在一个元组(即一行)中,只有一个选修课程,没有选修了一号课程和二号课程这样的

4,查询不是软件学院、计算机系的学生性别、年龄、系别

select ssex,sage,sdept
from student 
where sdept not in('CS','MA');

5,查询姓刘的学生情况

select * 
from student
where sname like '刘%';关于like的用法在第一篇博客中说的很明白

6、利用字符转换函数实现字符联接

select sname + '年龄为'+cast(sage as char(2))+'岁'
from student;
Select sname + '年龄为'+cast(sage as char(2))+'岁'
From student;
;写不写加号都可以,(我的2016版本写法都支持的)

7、查询每个系的系名及学生人数

select sdept,count(*) 
from student group by sdept;

group by是分组查询,这里是分各个系

8、查询每门课的间接先修课

select first.cno,second.cpno
from course first,course second
where first.cpno=second.cno 

9、选修了课程名为“数据库”的学生姓名和年龄

select sname,sage from student 
where sno in
(select sno from sc 
where cno in
(select cno from course
where cname='数据库'))

10、查询选修了3号课程的学生平均年龄

select AVG(sage) as avgsage
from student inner join sc on student.sno=sc.sno
where cno='3'

inner join连接两个表,

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

剩下的不想打了,看上面两篇博客把

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值