三张表:学生表,宿舍查房记录表(中间表),宿舍表;
思路分析:(中间表)通过学号与学生表联系,通过宿舍楼号与宿舍楼联系;
//创建学生(stu)表(学号(主键),姓名,宿舍号)
//创建宿舍(house)表(宿舍楼号(主键),宿舍号,学生学号,学生所在宿舍号)
//创建宿舍查房记录(h_record)表(中间表)(日期(主键),学生学号(外键),宿舍楼(外键),是否缺勤)
create table stu (id varchar(20) primary key,
name varchar(20),
h_id int
);
create table house(number int primary key,
s_id varchar(20),
h_id int
);
create table h_record(time timestamp primary key,
s_id varchar(20),
number int,
absence varchar(5),
foreign key (s_id) references stu(id),
foreign key (number) references house(number)
);
/*将学生表中的所有数据复制到用户表*/
insert into test_user(name, email) select name, qq_mail from student
select count(*) from student where id > 2;
select sum(列名) from student;
select avg(列名) from student;
select max(列名) from student;
select min(列名) from student;
注:
1.group up字段,分组查询,查询字段需要是分组字段,如果是非分组字段,需要使用最小粒度;
select * from student group by name;/*将学生表中名字一样的放在一组,*一般只使用分组列和计数列(count);
select role,max(salary),min(salary),avg(salary) from emp group by role
having avg(salary)<1500;/*先分组在写having条件*/
语法:
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
概念:外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。
语法:(left :左连接 right: 右连接)
-- 左外连接,表1完全显示
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;
drop table if exists A;
create table A(name varchar(32),
grade int
);
/*添加数据*/
insert into A VALUES('zhangshan',80),
('list',60),
('wangwu',84);
drop table if exists B;
create table B(name varchar(32),
age int
);
/*添加数据*/
insert into B VALUES('zhangshan',26),
('list',24),
('wangwu',26),
('wutian',26);
select B.name,A.grade,B.age
from A right join B
on A.name = B.name;