MySQL数据库-查询

目录

1. 表的设计

1.1 一对一

1.2一对多 

1.3 多对多

 2.增加

3.查询

3.1 聚合查询

3.1.1 聚合函数

 count:

SUM:

AVG :

MAX: 

 MIN:

 3.2 GROUP BY子句

4.2 联合查询

4.2.1 内连接  

 4.2.2 外连接

4.2.3自连接

4.2.4.子查询  

4.2.5合并查询


1. 表的设计

三大范式:

1.1 一对一

MySQL数据库-查询_第1张图片

1.2一对多 

MySQL数据库-查询_第2张图片

1.3 多对多

MySQL数据库-查询_第3张图片

 创建课程表

-- 创建课程表
DROP TABLE IF EXISTS course;
CREATE TABLE course (
  id INT PRIMARY KEY auto_increment,
  name VARCHAR ( 20 )
);

创建学生课程中间表,考试成绩表 

-- 创建课程学生中间表:考试成绩表
DROP TABLE IF EXISTS score;
CREATE TABLE score (
  id INT PRIMARY KEY auto_increment,
score DECIMAL ( 3 , 1 ),
  student_id int ,
course_id int ,
FOREIGN KEY (student_id) REFERENCES student(id),
FOREIGN KEY (course_id) REFERENCES course(id)
);

 2.增加

  插入查询结果
INSERT INTO table_name [( column [, column ...])] SELECT ...
案例:创建一张用户表,设计有 name 姓名、 email 邮箱、 sex 性别、 mobile手机号字段。需要把已有的学生数据复制进来,可以复制的字段为 name qq_mail
-- 创建用户表
DROP TABLE IF EXISTS test_user;
CREATE TABLE test_user (
  id INT primary key auto_increment,
  name VARCHAR ( 20 ) comment ' 姓名 ' ,
  age INT comment ' 年龄 ' ,
  email VARCHAR ( 20 ) comment ' 邮箱 ' ,
sex varchar ( 1 ) comment ' 性别 ' ,
mobile varchar ( 20 ) comment ' 手机号 '
);

3.查询

3.1 聚合查询

3.1.1 聚合函数

常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:
COUNT([DISTINCT] expr):            返回查询到的数据的数量
SUM([DISTINCT] expr):                 返回查询到的数据的 总和,不是数字没有意义
AVG([DISTINCT] expr) :                 返回查询到的数据的 平均值,不是数字没有意义
MAX([DISTINCT] expr) :                返回查询到的数据的 最大值,不是数字没有意义
MIN([DISTINCT] expr) :                  返回查询到的数据的 最小值,不是数字没有意义
 count:
统计班级共有多少同学
SELECT COUNT (*) FROM student;
SELECT COUNT ( 0 ) FROM student;
统计班级收集的 qq_mail 有多少个, qq_mail NULL 的数据不会计入结果
SELECT COUNT (qq_mail) FROM student;  
SUM:
统计数学成绩总分
SELECT SUM (math) FROM exam_result;
不及格 < 60 的总分,没有结果,返回 NULL
SELECT SUM (math) FROM exam_result WHERE math < 60 ;
AVG :
-- 统计平均总分
SELECT AVG (chinese + math + english) 平均总分 FROM exam_result;
MAX: 

-- 返回英语最高分
SELECT MAX (english) FROM exam_result;
 MIN:
-- 返回 > 70 分以上的数学最低分
SELECT MIN (math) FROM exam_result WHERE math > 70 ;

 3.2 GROUP BY子句

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查 询时,SELECT 指定的字段必须是 分组依据字段 ,其他字段若想出现在 SELECT 中则必须包含在聚合函数中。
select column1, sum(column2), .. from table group by column1,column3;

4.2 联合查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:
MySQL数据库-查询_第4张图片

初始化测试数据:

insert into classes(name, `desc
( ' 计算机系 2019 1 ' , ' 学习了计算机
( ' 中文系 2019 3 ' , ' 学习了中国传统
( ' 自动化 2019 5 ' , ' 学习了机械自动
insert into student(sn, name, qq_mail, classes_id) values
( '09982' , ' 黑旋风李逵 ' , '[email protected]' , 1 ),
( '00835' , ' 菩提老祖 ' , null , 1 ),
( '00391' , ' 白素贞 ' , null , 1 ),
( '00031' , ' 许仙 ' , '[email protected]' , 1 ),
( '00054' , ' 不想毕业 ' , null , 1 ),
( '51234' , ' 好好说话 ' , '[email protected]' , 2 ),
( '83223' , 'tellme' , null , 2 ),
( '09527' , ' 老外学中文 ' , '[email protected]' , 2 );
insert into course(name) values
( 'Java' ),( ' 中国传统文化 ' ),( ' 计算机原理 ' ),( ' 语文 ' ),( ' 高阶数学 ' ),( ' 英文 ' );
insert into score(score, student_id, course_id) values
-- 黑旋风李逵
( 70.5 , 1 , 1 ),( 98.5 , 1 , 3 ),( 33 , 1 , 5 ),( 98 , 1 , 6 ),
-- 菩提老祖
( 60 , 2 , 1 ),( 59.5 , 2 , 5 ),
-- 白素贞
( 33 , 3 , 1 ),( 68 , 3 , 3 ),( 99 , 3 , 5 ),
-- 许仙
( 67 , 4 , 1 ),( 23 , 4 , 3 ),( 56 , 4 , 5 ),( 72 , 4 , 6 ),
-- 不想毕业
( 81 , 5 , 1 ),( 37 , 5 , 5 ),
--好好说话
( 56 , 6 , 2 ),( 43 , 6 , 4 ),( 79 , 6 , 6 ),
-- tellme
( 80 , 7 , 2 ),( 92 , 7 , 6 );

4.2.1 内连接  

语法

select 字段 from 1 别名 1 [inner] join 2 别名 2 on 连接条件 and 其他条件 ;
select 字段 from 1 别名 1, 2 别名 2 where 连接条件 and 其他条件 ;

 4.2.2 外连接

语法

-- 左外连接,表 1 完全显示
select 字段名   from 表名 1 left join 表名 2 on 连接条件 ;
-- 右外连接,表 2 完全显示
select 字段 from 表名 1 right join 表名 2 on 连接条件 ;

4.2.3自连接

语法

先查询 计算机原理 “Java” 课程的 id
select id,name from course where name= 'Java' or name= ' 计算机原理 ' ;
-- 再查询成绩表中, 计算机原理 成绩比 “Java” 成绩 好的信息
SELECT
s1.*
FROM
score s1,
score s2
WHERE
s1 .student_id = s2 .student_id
AND s1 .score < s2 .score
AND s1 .course_id = 1
AND s2 .course_id = 3 ;
-- 也可以使用 join on 语句来进行自连接查询
SELECT
s1.*
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 ;

4.2.4.子查询  

语法

 
-- 单行子查询
  select ... from 1 where 字段 1 = (select ... from ...);
-- [NOT] IN
select ... from 1 where 字段 1 in (select ... from ...);
  -- [NOT] EXISTS
  select ... from 1 where exists (select ... from ... where 条件 );
  -- 临时表: form 子句中的子查询
  select ... from 1 (select ... from ...) as tmp where 条件

4.2.5合并查询

-- UNION :去除重复数据
select ... from ... where 条件
union
select ... from ... where 条件
-- UNION ALL :不去重
select ... from ... where 条件
union all
select ... from ... where 条件
-- 使用 UNION UNION ALL 时,前后查询的结果集中,字段需要一致
SQL 查询中各个关键字的执行先后顺序: from > on> join > where > group by > with > having >
select > distinct > order by > limit

你可能感兴趣的:(java,数据库,数据库,mysql)