-- 列出学生信息表中年龄最大的学生信息
select max ( stu_age ) 最大年龄 from stuinfo
-- 列出学生信息表中最大学号的学生信息
select max ( stu_id ) from stuinfo
-- 求最小值 : min 函数 格式: min ( 字段 )
-- 列出学生信息表中年龄最小的学生信息
select min ( stu_age ) 最小年龄 from stuinfo
-- 列出学生信息表中最小学号的学生信息
select min ( stu_id ) 最小学号 from stuinfo
-- 计数 : count 函数 格式: count ( 字段 )
-- 计算出学生信息表中学生的数量
select * from stuinfo
select count ( stu_name ) from stuinfo
select count ( stu_age ) from stuinfo
-- 计算出班级编号为 12345 的学生的人数
select count ( stu_id ) from stuinfo where cla_id = '12345'
select count ( * ) from stuinfo where cla_id = '12345'
-- 创建一个科目表
create table km (
id int identity ( 1 , 1 ) , -- 序号
km_id int primary key not null , -- 课程号
km_name varchar ( 10 ) -- 课程名称
)
insert into km values ( 1 , ' 语文 ' ) , ( 2 , ' 数学 ' ) , ( 3 , ' 英语 ' ) , ( 4 , ' 计算机 ' )
-- 创建一个成绩表
create table cj (
id int identity ( 1 , 1 ) ,
stu_id varchar ( 20 ) references stuinfo ( stu_id ) ,
km_id int references km ( km_id ) ,
cj int check ( cj >= 0 and cj <= 100 ) not null
)
insert into cj values ( '10001' , 1 , 80 ) , ( '10001' , 2 , 75 ) , ( '10001' , 3 , 90 ) ,
( '10001' , 4 , 95 ) , ( '10002' , 1 , 88 ) , ( '10002' , 2 , 98 ) , ( '10002' , 3 , 70 ) ,
( '10002' , 4 , 95 ) , ( '10003' , 1 , 30 ) , ( '10003' , 2 , 55 ) , ( '10003' , 3 , 91 ) , ( '10003' , 4 , 92 ) ,
( '10004' , 1 , 83 ) , ( '10004' , 2 , 85 ) , ( '10004' , 3 , 70 ) , ( '10004' , 4 , 65 )
select * from km
select * from cj
-- 查询学生为 10001 学生的平均成绩
select avg ( cj ) 平均成绩 from cj where stu_id = '10001'
-- 查询学生为 10001 学生的总成绩
select sum ( cj ) 总绩 from cj where stu_id = '10001'
-- 查询每个学生的总成绩
select stu_id 学号 , sum ( cj ) 总成绩 from cj group by stu_id
-- 查询每门课程平均成绩
select km_id 课程号 , avg ( cj ) 平均成绩 from cj group by km_id
-- 查询每门课程最高成绩
select km_id 课程号 , max ( cj ) 平均成绩 from cj group by km_id
-- 列出学生的总成绩大于 350 分的学生的信息
-- 使用 group by 进行分组时,如果需要用到条件语句,后面只能使用 having 做条件表达式关键字,不能使用
where
select stu_id 学号 , sum ( cj ) 总成绩 from cj group by stu_id having sum ( cj ) > 350
-- 列出每门课程的平均成绩
select km_id 课程号 , avg ( cj ) 平均成绩 from cj group by km_id
select * from class
select * from stuinfo
-- 将学生信息表中 id 编号为 7 到 9 的学生的班级修改为 1234
update stuinfo set cla_id = '1234' where id between 7 and 9
3、连接查询
use student
/*
连接查询:
连接查询主要应用在两张及以上有数据关联的数据查询过程中。
连接查询的分类:内连接、外连接、交叉连接
内连接:指的两表所查询结果是一样的;
左外连接:指的是查询的结果以左表为准,如果右表没有内容,则显示 null
右外连接:指的是查询的结果以右表为准,如果左表没有内容,则显示 null
全外连接:指的是查询的结果为全部结果,即两个表的所有行,如果一个没有,则显示空值。
*/
-- 案例:查询学生的总成绩,要求显示学生的姓名,总成绩
-- 查看学生信息表
select * from stuinfo
-- 查看科目信息表
select * from km
-- 查看成绩信息表
select * from cj
-- 案例:查询学生的总成绩,要求显示学生的学号,总成绩
select stu_id 学号 , sum ( cj ) 总成绩 from cj group by stu_id
select stu_name,cj,km_name from stuinfo st,cj,km where st .stu_id = cj .stu_id and
km .km_id = cj .km_id
/*
内连接:
select 字段 from 表 1 inner join 表 2 on 条件表达式(表 1 和表 2 相同的字段)
*/
-- 列出有成绩学生的所有信息及成绩信息
select st. * ,cj from stuinfo st inner join cj on st .stu_id = cj .stu_id
select st. * ,cj from stuinfo st join cj on st .stu_id = cj .stu_id
/*
左外连接:
select 字段 from 表 1 left join 表 2 on 条件表达式(表 1 和表 2 相同的字段)
右外连接:
select 字段 from 表 1 right join 表 2 on 条件表达式(表 1 和表 2 相同的字段)
全外连接
select 字段 from 表 1 full join 表 2 on 条件表达式(表 1 和表 2 相同的字段)
*/
-- 左连接
select st. * ,cj from stuinfo st left join cj on st .stu_id = cj .stu_id
-- 右连接
select st. * ,cj from stuinfo st right join cj on st .stu_id = cj .stu_id
select * from class
-- 插入一条数据
insert into stuinfo ( stu_id,stu_name,stu_sex,stu_age,stu_tel,stu_add )
values ( '10010' , ' 张飞 ' , ' 男 ' , 20 , '133235' , ' 二七区 ' )
-- 左连接:以左表为主,左表 stuinfo, 右表为 class
select * from stuinfo -- 左表
select * from class -- 右表
-- 左连接
select * from stuinfo st left join class cl on st .cla_id = cl .cla_id
-- 右连接:
select * from stuinfo st right join class cl on st .cla_id = cl .cla_id
-- 全连接
select * from stuinfo st full join class cl on st .cla_id = cl .cla_id
-- 内连接
select * from stuinfo st inner join class cl on st .cla_id = cl .cla_id
select * from stuinfo st join class cl on st .cla_id = cl .cla_id where
cl .cla_id = '12345'
select stu_name,st .cla_id from stuinfo st,class cl where st .cla_id = cl .cla_id
-- 修改学生张三的班级编号信息
update stuinfo set cla_id = NULL where stu_id = '10001'
-- 查询学生的成绩,要求显示学生的姓名,所选课程的名称,成绩
select stu_name 学生姓名 , km_name 课程名称 ,cj 成绩 from stuinfo st
join cj on st .stu_id = cj .stu_id
join km on cj .km_id = km .km_id
-- 查询学生的成绩,要求显示学生的姓名,所选课程的名称,成绩,以内连接实现
select cla_name 班级名称 ,stu_name 学生姓名 , km_name 课程名称 ,cj 成绩 from stuinfo st
join cj on st .stu_id = cj .stu_id
join km on cj .km_id = km .km_id
join class cl on st .cla_id = cl .cla_id
-- 查询学生的成绩,要求显示学生的姓名,所选课程的名称,成绩,以左外连接实现
select cla_name 班级名称 ,stu_name 学生姓名 , km_name 课程名称 ,cj 成绩 from stuinfo st
left join cj on st .stu_id = cj .stu_id
left join km on cj .km_id = km .km_id
left join class cl on st .cla_id = cl .cla_id
-- 查询学生的成绩,要求显示学生的姓名,所选课程的名称,成绩,以右外连接实现
select cla_name 班级名称 ,stu_name 学生姓名 , km_name 课程名称 ,cj 成绩 from stuinfo st
right join cj on st .stu_id = cj .stu_id
right join km on cj .km_id = km .km_id
right join class cl on st .cla_id = cl .cla_id
-- 查询学生的成绩,要求显示学生的姓名,所选课程的名称,成绩,以全外连接实现
select cla_name 班级名称 ,stu_name 学生姓名 , km_name 课程名称 ,cj 成绩 from stuinfo st
full join cj on st .stu_id = cj .stu_id
full join km on cj .km_id = km .km_id
full join class cl on st .cla_id = cl .cla_id
/* 交叉连接也叫笛卡尔积:
格式:
select 字段名 from < 表 A> cross join < 表 B> [where 条件表达式 ]
不带 where 条件,显示是两个表的行数的乘积,例如 A 表为 10 行, B 表为 5 行,则结果返回为 50 行
如果带 where 条件,则显示满足 where 条件的记录行
*/
-- 案例一 : 不带 where 条件
select * from stuinfo cross join class
-- 案例二:带上 where 条件
select * from stuinfo st cross join class cl where cl .cla_id = '12345' and
st .cla_id is not null