============================================================================================================
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;
// 计算这个9个人的数学总分和数学平均分
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='王五';
例3:查询三个学生的总成绩(学生表、成绩表)
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;
例2:查询Java比计算机基础分数低的同学及分数
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的子查询语句: