============================================================================================================
create table class(
id int primary key auto_increment,
name varchar(20)
);
create table student (
id int unique,
sn int primary key auto_increment,
name varchar(20) not null,
mail varchar(20) default 'qq',
class-id int,
foreign key (class_id) references class(id),
sex varchar(1) comment '性别', -- 字段说明
check (sex='男' or sex='女')
-- MySQL使用时不报错,但忽略该约束
);
insert into table1_name (column 1,2,....) select (column 1,2,....) from table2_name ;
// 创建一张用户表,设计有name姓名、email邮箱、sex性别、mobile手机号字段——可以将学生表student中的已知数据-查询相同数据-再插入到创建的用户表中;
①每个组函数接收一个参数;
②默认情况下,组函数忽略列值为null的行,不参与计算;
③有时,会使用关键字distinct剔除字段值重复的条数;
// 注意:
1)当使用组函数的select语句中没有group by子句时,中间结果集中的所有行自动形成一组,然后计算组函数;
2)组函数不允许嵌套,例如:count(max(…));
3)组函数的参数可以是列或是函数表达式;
4)一个SELECT子句中可出现多个聚集函数。
应用示例:
//成绩
create table exam(
id int,
name varchar(20),
chinese decimal(3,1),
math decimal(3,1),
english decimal(3,1)
);
// 计算学生人数(数据行数)
select count(*) from exam;
select sum(math) from exam;
select avg(math) from exam;
select max(chinese),min(chinese) from exam;
select column1, sum(column2), .. from table group by column1,column3;
// 应用示例:
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
role varchar(20) not null,
salary numeric(11, 2)
);
insert into emp(name, role, salary)
values ('老马哥', '服务员', 1000.20),
('化腾', '游戏陪玩', 2000.99),
('孙悟空', '游戏角色', 999.11),
('猪无能', '游戏角色', 333.5),
('沙和尚', '游戏角色', 700.33),
('老王', '董事长', 12000.66);
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件
例1: 得出李四同学的班级名称(学生表、班级表)
例2: 查询王五同学的各科成绩 (学生表、成绩表、课程表)
select sco.score,cou.name from student stu
join score scoon stu.id=sco.student_id
join course cou on sco.course_id=cou.id
and stu.name='王五';
SELECT
stu.sn,
stu.name,
sum( sco.score )
FROM
student stu join score sco on stu.id=sco.student_id
GROUP BY
sco.student_id;
-- 左外连接,表1完全显示
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;
例1:查询某同学Java的成绩比计算机基础分数低的分数情况
SELECT
s1.*,s2.score
FROM
score s1
JOIN score s2 ON s1.student_id = s2.student_id
AND s1.score < s2.score
AND s1.course_id = 1
AND s2.course_id = 3;
select stu.name,s1.score java,s2.score 计算机基础
from score s1
join score s2 on s1.student_id=s2.student_id
join student stu on stu.id=s1.student_id
join course c1 on c1.id=s1.course_id
join course c2 on c2.id=s2.course_id
and s1.score<s2.score and c1.name='java'
and c2.name='计算机基础';
1)在where条件语句中使用子查询:
例1:查询和王五同班的同学;
例2:查询Java和C语言课程的成绩;
// 使用 in 关键字 就也可以使用not in 关键字查询
// exists关键字——将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留。
// 带 ANY或 ALL的子查询语句: