JavaWEB-01-MySQL基础
JavaWeb
内容
- 数据库 – 数据存储
MySQL
JDBC
Maven
— 项目管理工具Mybatis
- 前端 — 为了前端哥们沟通
HTML+CSS
JavaScript
Ajax + Vue + Element
Web
核心Tomcat + Http + Servlet
Request + Response
JSP
Cookie + Session
FIlter + Listener
- 综合案例
内容
MySQL
`MySQL`概念- 基本环境工具安装
MySQL
`MySQL`下载安装及基本配置Navicat
`Navicat`下载安装及基本配置
SQL
`SQL`语法- DDL-数据库CRUD操作
- DDL-数据表CRUD操作
- DML-数据记录CUD操作
- DQL-数据记录查询操作 ==DQL-数据记录查询操作==
0. 课程导入
JavaWeb
相关技术可用于网站开发,网站开发主要分为三部分:
网页:展示数据
后台程序:逻辑处理,
JavaWeb
的主要工作数据库:存储和管理数据
数据存储位置及其特点:
- 内存:操作快,但是不安全
- 文件:相对安全;在并发环境下数据可以不准确;每次读写基本上都要把文件内容全部加载到内存,
IO
性能会非常差。
上述两种情况,都不适合做数据稳定安全的大量存储。
数据库可以克服上述缺点完成数据存储。
1. 数据库相关概念
1.1 数据库
数据库
数据库英文名是
DataBase
,简称DB
。数据库:能够高效的持久化存储和管理海量数据的仓库。
MySQL
是关系型数据库。
1.2 数据库管理系统
概念
管理数据库的软件系统。
英文:
DataBase Management System
,简称DBMS
通过数据库管理系统对数据库进行各种增删改查的操作。我们平时说的MySQL
数据库其实是MySQL
数据库管理系统。两者关系如图所示:
1.3 常见的数据库(管理系统)
简单的介绍:
Oracle
:收费的大型数据库,Oracle
甲骨文公司的产品MySQL
: 开源免费的中小型数据库。后来Sun
公司收购了MySQL
,而Sun
公司又被Oracle
甲骨文收购SQL Server
:MicroSoft
微软 公司收费的中型的数据库。C#、.net
等语言常使用PostgreSQL
:开源免费中小型的数据库DB2
:IBM
公司的大型收费数据库产品SQLite
:嵌入式的微型数据库。如:作为Android
内置数据库MariaDB
:开源免费中小型的数据库
1.4 SQL
英文:Structured Query Language
结构化查询语言。
在各种数据库管理软件中,使用SQL
完成对数据库中数据的各种操作。
1.5 数据库分类
数据库的分类:
- 关系型数据库。传统的数据库,
Oracle
、MySQL
、SQLServer
、DB2
,数据(表与表)之间有关联。 - 非关系型数据库。新型的内存数据库,
Redis
,数据之间没有关联,所有数据都存在一起,可以理解成一个大Map
。
总结:数据之间存在关系的数据库,就是关系型数据库。关系型数据库中
MySQL
等更准确的说是数据库管理系统。- 关系型数据库。传统的数据库,
关系型数据库优点
- 都是使用表结构,格式一致,易于维护。
- 使用通用的
SQL
语言操作,使用方便,可进行复杂查询。 - 数据存储在磁盘中,可以持久化存储,安全且性能高。
1.6 库
英文名是 DataBase
,简称DB
。
一个数据库管理系统可以管理很多数据库,每个数据库中存放的都是一些相关的数据。
每个数据库我们都简称为库,和1.1
中的数据库概念一致。
MySQL
中,一个库对应文件系统中data
目录中一个同名文件夹。
1.7 表
多个类似的数据存在一起,为了方便维护,存在一个类似于表格的结构中,该结构就是数据库表。
是数据存储的基本单位,结构为二维表格(行列两个纬度的数据表),类似于Excel
中表格。
MySQL
中,一个表对应文件系统中的多个同名不同后缀的文件。
英文:table
1.8 记录
每行数据作为一个整体,存在表中,每行数据也被称为一条记录。
英文:row
1.9 各个概念之间的关系
MySQL
数据库可以看做是一个大的仓库,类比生活中概念:
数据库中概念 | 生活中概念 | 备注 |
---|---|---|
数据库管理系统 | 京东自营杭州仓进销存管理系统/杭州仓管理账本 | |
库 | 仓库中每一个小的空间(房间) | |
表 | 房间中的货架 | |
每一条数据/记录 | 货架上的每一个货品 |
2. 相关软件安装
MySQL
安装:见当天“资料–>MySQL
安装”文件夹中《MySQL安装文档.md
》文档
Navicat
安装:见软件分项目录
3. SQL
及其语法
3.1 SQL
英文:Structured Query Language
,结构化查询语言,定义了操作所有关系型数据库的规则。
在数据库管理软件中,使用SQL
完成对数据库中数据的各种操作。
方言:每个数据库在某些特定的功能上语法稍有不同,此为方言。
3.1 基本语法
通用语法
SQL
语句可以单行或多行书写语句,以;
结尾- 单行注释:-- 注释内容(--和内容之间有空格)
- 多行注释:/* 注释内容 */
- 可使用空格和缩进来增强语句的可读性
MySQL
语法- 单行注释:# 注释内容(中间可以没有空格)
- 不区分大小写。但是关键字建议使用大写,可以提高代码的可读性。
SQL
语法分类DDL(Data Definition Language)
:数据定义语言。用来操作数据库,表,列等。DML(Data Manipulation Language)
:数据操作语言。用来对数据库中表的记录(数据)进行增删改
。DQL(Data Query Language)
:数据查询语言。用来查询
数据库中表的记录(数据)。DCL(Data Control Language)
:数据控制语言。用来定义数据库的访问权限和安全级别,及创建用户。
3.2 DDL
-库操作
DDL(Data Definition Language)
:数据定义语言。用来操作数据库,表,列等。
MySQL
内置库简介
infomation_shema
:视图,可以理解为虚拟表,保存数据库中各种信息mysql
:MySQL
中核心内容存在里面,用户、密码、权限等performance_schema
:保存性能相关信息sys
:保存系统相关信息
库操作相关的DDL
/*
查询所有数据库
标准语法:
SHOW DATABASES;
*/
-- 查询所有数据库
-- MySQL默认的客户端工具中,语法要求严格,语句的结束必须写;
-- 但是Navicat这个第三方工具中在语句末尾可以不写分号
-- 写前几个字幕之后,Navicat会有提示,上下键选中之后按Tab选择
-- 选中要运行的语句,点击上面的运行按钮/按Ctrl + R 就可以运行了。
SHOW DATABASES;
/*
创建数据库,创建之前如果存在,就报错。
标准语法:
CREATE DATABASE 数据库名称;
*/
-- 创建db1数据库
CREATE DATABASE db1;
/*
创建数据库时判断,如果不存在则创建,存在就不创建但是不报错。
标准语法:
CREATE DATABASE IF NOT EXISTS 数据库名称;
*/
-- 创建数据库db2(判断,如果不存在则创建)
CREATE DATABASE IF NOT EXISTS db2;
/*
删除数据库,如果不存在,就报错。
标准语法:
DROP DATABASE 数据库名称;
*/
-- 删除db1数据库
DROP DATABASE db1;
/*
删除数据库判断、如果存在则删除,不存在就不删除但是不报错。
标准语法:
DROP DATABASE IF EXISTS 数据库名称;
*/
-- 删除数据库db2,如果存在
DROP DATABASE IF EXISTS db2;
/*
使用数据库(切换数据库)
标准语法:
USE 数据库名称;
*/
-- 使用db1数据库
USE db1;
/*
查询当前使用的数据库
标准语法:
SELECT DATABASE();
*/
-- 查询当前正在使用的数据库
SELECT DATABASE();
Navicat
图形化切库
3.3 DDL
-表查询
-- 使用mysql数据库
USE mysql;
/*
查询所有数据表
标准语法:
SHOW TABLES;
*/
-- 查询库中所有的表
SHOW TABLES;
/*
查询表结构
标准语法:
DESC 表名;
*/
-- 查询user表结构
DESC USER;
Navicat
图形界面操作
3.4 DDL
-表新增
注意
列名表名等标识符,可以使用``包裹,避免被错误的识别成关键字
SQL
语句/*
创建数据表
标准语法:
CREATE TABLE [IF NOT EXISTS] 表名(
列名/字段名 数据类型 ,
列名 数据类型 ,
...
列名 数据类型
);
*/
-- 创建一个 tb_user 商品表(用户编号、用户名、密码)
-- 列名表名,可以使用``包裹,避免被错误的识别成关键字
CREATE TABLE `tb_user`(
`id` INT,
`username` VARCHAR(20),
`password` VARCHAR(32)
); -- 查看product表详细结构
DESC tb_user;
3.5 数据类型
3.5.1 常见的类型
使用细节
图中红色加粗的为常用的数据类型
DOUBLE
和FlOAT
分别表示单双精度浮点型- 只能进行非精确运算,能表示的范围较小。不适用财务、高速、航天等领域。
- 可以指定精度,格式如下:
score double(总长度,小数点位数)
DECIMAL
:用字符串形式存储运算以提高精度,但是会消耗较多的空间和运算性能- 小技巧:
INT/BIGINT
可以进行精确运算。小数数据可以方法10^N倍之后存入数据库,使用的时候再缩小同样倍数
DATE
:日期类型。包含年月日,格式yyy-MM-dd
DATETIME
:日期时间类型。包含年月日时分秒,格式yyy-MM-dd HH:mm:ss
TIMESTAP
:时间戳类型,包含年月日时分秒,格式为:yyyy-MM-dd HH:mm:ss
- 如果不给该类型为时间戳的字段赋值、或赋值为null,,则默认使用当前系统时间自动赋值。比较适合用作记录操作/创建时间等场景。
- 受字节数限制,最大值为
2038-01-19 11:14:07
3.5.2 案例练习
需求
/*
需求:设计一张学生表,请注重数据类型、长度的合理性
1. 编号
2. 姓名,姓名最长不超过10个汉字
3. 性别,因为取值只有两种可能,因此最多一个汉字
4. 生日,取值为年月日
5. 入学成绩,小数点后保留两位
6. 邮件地址,最大长度不超过64
7. 家庭联系电话,不一定是手机号码,可能会出现-等字符
8. 学生状态(用数字表示,正常、休学、毕业...)
*/
SQL
代码-- 添加前先删除,避免报错
DROP TABLE IF EXISTS student; -- 按照要求,创建表
CREATE TABLE student(
`id` INT,
`name` VARCHAR(10),
`gender` CHAR(1),
`birthday` DATE,
`score` DOUBLE(5,2),
`email` VARCHAR(64),
`tel` VARCHAR(15),
`status` TINYINT
); -- 查看表结构
DESC student;
3.6 DDL
表修改
对表修改要慎重,除了新增列之外,一般不会修改,因为可能会影响到之前数据和代码的运行。
新增列会用,且使用频率相对较高。比较重要。
新需求需要添加列/字段的解决方案
在需要的时候添加一个列/字段
- 在数据库设计之初,就预留多列冗余字段。
-- 使用mysql数据库
USE db1;
-- 查询库中所有的表
SHOW TABLES;
-- 查询stu表结构
DESC student;
/* ******************************************
修改表名
标准语法:
ALTER TABLE 旧表名 RENAME TO 新表名;
******************************************
*/
-- 修改student表名为stu
ALTER TABLE student RENAME TO stu;
-- 查询库中所有的表,查看是否修改成功
SHOW TABLES;
-- 修改前,查询一下stu表结构
DESC stu;
/* ******************************************
给表添加列(重点)
标准语法:
ALTER TABLE 表名 ADD 列名 数据类型;
新需求需要添加列的解决方案
1. 在需要的时候添加一个列
2. 在数据库设计之初,就预留多列冗余字段。
******************************************
*/
-- 给product2表添加一列color
ALTER TABLE stu ADD address VARCHAR(50);
-- 修改后,查询一下stu表结构
DESC stu;
/* ******************************************
修改表中列的数据类型
标准语法:
ALTER TABLE 表名 MODIFY 列名 数据类型;
******************************************
*/
-- 将color数据类型修改为int
ALTER TABLE stu MODIFY address CHAR(50);
-- 修改后,查询一下stu表结构
DESC stu;
/* ******************************************
修改表中列的名称和数据类型
标准语法:
ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型;
******************************************
*/
-- 将color修改为address
ALTER TABLE stu CHANGE address addr VARCHAR(30);
-- 修改后,查询一下stu表结构
DESC stu;
/* ******************************************
删除表中的列
标准语法:
ALTER TABLE 表名 DROP 列名;
******************************************
*/
-- 删除address列
ALTER TABLE stu DROP addr;
-- 修改后,查询一下stu表结构
DESC stu;
3.7 DDL
-表删除
/*
删除表,如果存在就删除,不存在则会报错。
标准语法:
DROP TABLE 表名;
*/
-- 删除stu表
DROP TABLE stu;
/*
删除表时限判断,如果存在则删除,不存在也不报错。
标准语法:
DROP TABLE IF EXISTS 表名;
*/
-- 删除stu表,如果存在则删除
DROP TABLE IF EXISTS stu;
注意:
- 对表和库做增删时,如果可以进行健壮性判断(
if exists / if not exists
),就加上。 - 但是这两条只是健壮性的判断条件,让你的
SQL
语句少报错,不会影响SQL
语句的执行效果
3.8 DML
-添加记录
注意
- 添加的数据的个数和类型,一定要和指定字段的数量、类型保持一致。
- 除数字外,其他类型的值要使用引号包裹(建议单引号,可以双引号),特别是字符串和日期
- 列名如果是关键字,要使用``包裹
添加记录工作中用法
为了可读性、兼容性、健壮性等考虑,建议使用添加指定列方式。
- 冗余字段可以排除
- 后期添加的资源不会对之前的数据
SQL
产生影响
数据库字段设计思路
- 设计之初就预留好冗余字段,当前可以没用,之后如果有需要可以被征用。推荐第一种
- 设计之初不预留冗余字段,以后业务需要的时候,添加额外的字段。
不管使用哪种设计方式,在做增删改查的时候,如果能够指定列,就尽量指定;而非操作所有的数据列。
SQL
语句-- 查询所有数据
SELECT * FROM stu; /*
为指定列添加数据
标准语法:
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);
*/
-- 给指定列添加数据
INSERT INTO stu (id, NAME) VALUES (1, '张三'); /*
给全部列添加数据
标准语法:
INSERT INTO 表名 VALUES (值1,值2,值3,...);
*/
-- 给所有列添加数据,列名的列表可以省略的
INSERT INTO stu (
id, -- 编号
NAME,-- 姓名
sex, birthday, score, email, tel, STATUS
)
VALUES
(
2,
'李四',
'男',
'1999-11-11',
88.88,
'lisi@itcast.cn',
'13888888888',
1
); INSERT INTO stu
VALUES
(
2,
'李四',
'男',
'1999-11-11',
88.88,
'lisi@itcast.cn',
'13888888888',
1
); /*
批量添加所有列数据
标准语法:
INSERT INTO 表名 VALUES (值1,值2,值3,...),(值1,值2,值3,...),(值1,值2,值3,...);
INSERT INTO 表名(列名1, 列名2, 列名3,...) VALUES (值1,值2,值3,...),(值1,值2,值3,...),(值1,值2,值3,...);
*/
INSERT INTO stu
VALUES
(
2,
'李四',
'男',
'1999-11-11',
88.88,
'lisi@itcast.cn',
'13888888888',
1
),(
2,
'李四',
'男',
'1999-11-11',
88.88,
'lisi@itcast.cn',
'13888888888',
1
),(
2,
'李四',
'男',
'1999-11-11',
88.88,
'lisi@itcast.cn',
'13888888888',
1
);
3.9 DML
-修改记录
注意事项
删除/修改时,一定要根据业务需要在修改和删除语句后面通过
where
关键字,添加条件,否则会造成整个表中数据受影响。SQL
语句-- 查询stu表中所有记录
SELECT * FROM stu; /*
修改记录
标准语法(中括号表示可选):
UPDATE 表名 SET 列名1=值1,列名2=值2,… [WHERE 条件] ;
*/
-- 将张三的性别改为女
UPDATE stu SET sex = '女' WHERE `name` = '张三';-- 将张三的生日改为 1999-12-12 分数改为99.99 -- 将张三的生日改成1999-12-12,分数改为99.99
UPDATE stu SET birthday = '1999-12-12', score = 99.99 WHERE NAME = '张三'; -- 注意:如果update语句没有加where条件,则会将表中所有数据全部修改!
UPDATE stu SET sex = '女';
3.10 DML
-删除记录
注意事项
删除/修改时,一定要根据业务需要在修改和删除语句后面通过
where
关键字,添加条件,否则会造成整个表中数据受影响。
删除从实现方式上分为两种,一种是物理删除,一种是逻辑删除。
物理删除
调用
delete
语句真的把数据删掉。逻辑删除
本质是更新。
逻辑删除,依赖于一个额外的字段(eg:
isDeleted
是否删除)。删除操作变更新:
delete from xxx where id = yyy
==>update xxx set isDeleted=1 where id = yyy
查询所有变成按条件查询:如果查询所有
未删除的
数据,只需要在查询的语句中添加一个条件where isDeleted = 0
SQL语句
-- 查询stu表中所有记录
SELECT * FROM stu; /*
删除记录
标准语法(中括号表示可选):
DELETE FROM 表名 [WHERE 条件] ;
*/
-- 删除张三记录
DELETE FROM stu WHERE NAME = '张三'; -- 注意:如果delete语句没有加where条件,整个表的数据将会被清空
DELETE FROM stu;
3.11 DQL
数据查询语言
DQL(Data Query Language)
:数据查询语言。用来查询
数据库中表的记录(数据)。
- 使用频率最高,工作中该系列的
SQL
语句占比90%以上。 - 最复杂、最难的
SQL
语句。查询方式、查询条件、需求等多种多样。
详情见章节4
4. DQL
数据查询语言
DQL(Data Query Language)
:数据查询语言。用来查询
数据库中表的记录(数据)。
- 使用频率最高,工作中该系列的
SQL
语句占比90%以上。 - 最复杂、最难的
SQL
语句。查询方式、查询条件、需求等多种多样。
4.1 语法及分类
SELECT [DISTINCT]
字段列表 [[AS] 别名]
FROM
表名列表
-- 下面的关键字(子句)不要求都出现。但是只要出现了,必须是下面的顺序,否则语法错误。
WHERE
分组前的条件列表
GROUP BY
分组字段列表
HAVING
分组后的过滤条件
ORDER BY
排序字段列表
LIMIT
分页限定
按照上面关键词出现的情况不同(最根本原因是根据查询的需求不同),查询可以分为如下几类:
- 基本查询
- 条件查询(
WHERE
) - 聚合查询(聚合函数)
- 分组查询(
GROUP BY
) - 排序查询(
ORDER BY
) - 分页查询(
LIMIT
)
4.2 初始化数据
建表及初始化数据语句
-- 删除stu表
drop table if exists stu; -- 创建stu表
CREATE TABLE stu (
id int, -- 编号
name varchar(20), -- 姓名
age int, -- 年龄
sex varchar(5), -- 性别
address varchar(100), -- 地址
math double(5,2), -- 数学成绩
english double(5,2), -- 英语成绩
hire_date date -- 入学时间
); -- 添加数据
INSERT INTO stu(id,NAME,age,sex,address,math,english,hire_date)
VALUES
(1,'马运',55,'男','杭州',66,78,'1995-09-01'),
(2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');
4.3 基础查询
也可以称为查询所有。
结果集
查询出来的是所有符合要求的结果集合,简称结果集(
ResultSet
)。字段名的区别
/*
查询全部记录
标准语法:
SELECT * FROM 表名;
查询出来的结果称为结果集(ResultSet)。
不建议使用select *
1. 冗余字段会被查出来,后期添加的字段也会被查出来
2. select * 的性能低于 select 字段名列表
*/
-- 基础查询 ================
-- 查询所有人的姓名和年龄
SELECT
`NAME`, -- 姓名
age -- 年龄
FROM
stu;
-- 查询所有人的所有信息。
-- 可以列出所有的字段名,
-- 也可以使用*号代替所有字段名。但是非常不推荐使用。
-- 查询stu表中所有记录
SELECT * FROM stu;
-- 查询所有人的地址
SELECT address FROM stu;
-- 查询所有人的地址并去除重复记录
SELECT DISTINCT address FROM stu;
-- 查询有人的姓名 、英语成绩、英语成绩,并起别名
SELECT `NAME` AS '姓名', math AS '数学成绩', english '英语成绩' FROM stu;
-- 查询有人的姓名 、英语成绩、英语成绩,部分起别名
SELECT `name` , math , english '英语成绩' FROM stu;
4.4 条件查询1
精确条件查询/等值匹配查询。
注意事项
NULL <> NULL
模糊查询性能较低
条件规则
符号 功能 > 大于 < 小于 >= 大于等于 <= 小于等于 = 等于 <> 或 != 不等于 BETWEEN ... AND ... 在某个范围之内(都包含) IN(...) 多选一 LIKE 占位符 模糊查询 _单个任意字符 %0到多个任意字符 IS NULL 是NULL IS NOT NULL 不是NULL AND 或 && 并且 OR 或 || 或者 NOT 或 ! 非,不是 SQL
语句/*
条件查询
标准语法:
SELECT 列名列表 FROM 表名 WHERE 条件; 在SQL中,null是一个占位符,而非数据,所以null <> null.
要进行null或者非null的判断,就使用IS NULL 或者 IS NOT NULL
*/
-- 查询stu表中所有记录
SELECT * FROM stu; -- 条件查询 =====================
-- 1.查询年龄大于20岁的学员信息
SELECT * FROM stu WHERE age > 20; -- 2.查询年龄大于等于20岁的学员信息
SELECT * FROM stu WHERE age >= 20; -- 3.查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息
SELECT * FROM stu WHERE age >= 20 && age <= 30;
SELECT * FROM stu WHERE age >= 20 AND age <= 30;
SELECT * FROM stu WHERE age BETWEEN 20 AND 30; -- 4.查询入学日期在'1998-09-01' 到 '1999-09-01' 之间的学员信息
SELECT * FROM stu WHERE hire_date BETWEEN '1998-09-01' AND '1999-09-01'; -- 5. 查询年龄等于18岁的学员信息
SELECT * FROM stu WHERE age = 18; -- 6. 查询年龄不等于18岁的学员信息
SELECT * FROM stu WHERE age != 18;
SELECT * FROM stu WHERE age <> 18; -- 7. 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
SELECT * FROM stu WHERE age = 18 OR age = 20 OR age = 22;
SELECT * FROM stu WHERE age IN (18,20 ,22); -- 8. 查询英语成绩为 NULL的学员信息
-- 注意: SQL中 null不等于null,所以不能使用=和!=进行和NULL的等值判断。
-- 需要使用 IS / IS NOT
-- SELECT * FROM stu WHERE englISh = NULL; -- 无法查询出英语成绩为null的数据
SELECT * FROM stu WHERE englISh IS NULL;
SELECT * FROM stu WHERE englISh IS NOT NULL;
4.5 条件查询2
模糊条件查询。
要查询的条件不是通过=
这些精确的符号连接,而是使用like
。
-- 模糊查询 LIKE =====================
/*
通配符:
(1)_:代表单个任意字符
(2)%:代表任意个数字符
*/
-- 1. 查询姓'马'的学员信息
SELECT * FROM stu WHERE name LIKE '马%';
-- 2. 查询第二个字是'花'的学员信息
SELECT * FROM stu WHERE name LIKE '_花%';
-- 3. 查询名字中包含 '德' 的学员信息
SELECT * FROM stu WHERE name LIKE '%德%';
-- 4. 查询名字为两个字的所有学员信息
SELECT * FROM product WHERE name LIKE '__';
4.6 排序查询
其实就是对查询的结果集,在数据库层面,进行排序。
排序分为两类
升序 ASC 默认的顺序
降序 DESC
注意:多字段排序
如果存在多个排序字段,当第一个条件(一样)无法有效排序时,才会使用后面的条件。
如果使用
where
做条件筛选,需要先使用where
进行筛选,然后再使用order by
排序。
SQL
语句/*
排序查询
标准语法:
SELECT 列名 FROM 表名 [WHERE 条件] ORDER BY 列名1 排序方式1,列名2 排序方式2;
排序方式:
ASC:升序排列(默认值)
DESC:降序排列
*/
-- 1.查询学生信息,按照年龄升序排列
SELECT * FROM stu ORDER BY age ; -- 2.查询学生信息,按照数学成绩降序排列
SELECT * FROM stu ORDER BY math DESC ; -- 3.查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
SELECT * FROM stu ORDER BY math DESC , english ASC ;
4.7 聚合查询
概念
将一列数据作为一个整体,进行纵向计算/统计。
聚合查询通过各种聚合函数实现。
聚合函数
函数名 功能 注意 count(列名) 统计数量 一般选值没有 null
的列max(列名) 求最大值 min(列名) 求最小值 sum(列名) 求和 avg(列名) 求平均值 语法
SELECT 聚合函数名(列名) FROM 表;
注意
NULL
是占位符,不参与任何聚合函数运算。SQL
语句/*
聚合查询
标准语法:
SELECT 聚合函数名(列名) FROM 表名 [WHERE 条件]; 聚合函数:
count 统计数量
列名选择
1. 主键
2. * (推荐)
max 求最大值
min 求最小值
sum 求和
avg 求平均值 */ -- 查询stu表中所有记录
SELECT * FROM stu; -- 1. 统计班级一共有多少个同学
SELECT COUNT(*) FROM stu; -- 2. 查询数学成绩的最高分
SELECT MAX(math) FROM stu; -- 3. 查询数学成绩的最低分
SELECT MIN(math) FROM stu; -- 4. 查询统计数学成绩的总分
SELECT SUM(math) FROM stu; -- 5. 查询统计数学成绩的平均分
SELECT AVG(math) FROM stu; -- 6. 查询英语成绩的最低分
SELECT MIN(english) FROM stu; -- 65.00 -- 把NULL替换为数字0,使用IFNULL(判断的字段,如果为NULL字段取值)
SELECT MIN(IFNULL(english,0)) FROM stu;
4.8 分组查询
对查询结果进行分组统计汇总,需要配合聚合函数方有效。
分组查询语法
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤]…;
注意
分组查询语句中目标字段列表中一般只包含聚合函数和分组字段
MySQL5.6
及以后版本中要求,分组查询时,查询的目标字段列表中只能包含分组列和聚合函数,否则会报语法错误MySQL5.5
及以前版本中,分组查询时,查询的目标字段列表可以包含非聚合函数和分组字段,但是查询其他字段无任何意义
执行顺序
WHERE
> 聚合函数 >HAVING
WHERE
和HAVING
区别执行时机不一样:
WHERE
是分组之前进行筛选,不满足WHERE
条件,则没机会参与分组;而HAVING
是分组之后对结果进行过滤。可判断的条件不一样:
WHERE
不能使用表字段外的字段进行判断(包括表字段的聚合函数),HAVING
不能使用目标字段列表外的字段作为条件-- WHERE 不能使用表字段外的字段进行判断(包括表字段的聚合函数)
SELECT sex, AVG(math) mathAvg ,COUNT(*) sexCount FROM stu WHERE mathAvg >10 GROUP BY sex HAVING sexCount > 2; -- HAVING 不能使用目标字段列表外的字段作为条件
SELECT sex, AVG(math), COUNT(*) FROM stu WHERE math > 70 GROUP BY sex HAVING english >10;
SQL
语句/*
分组查询
标准语法:
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤]…;
注释事项:
分组查询语句中目标字段列表中一般只包含聚合函数和分组字段
MySQL5.6及以后版本中要求,分组查询时,要查询的列中只能包含分组列和聚合函数,否则会报语法错误
MySQL5.5及以前版本中,分组查询时,查询的目标字段列表可以包含非聚合函数和分组字段,但是查询其他字段无任何意义
*/
-- 查询stu表中所有记录
SELECT * FROM stu ; /*
分组查询一般会配合聚合函数一同出现
书写技巧:
1. 先写分组的条件,不写查询的列
2. 按照需求添加要查询的列 */
-- 1. 查询男同学和女同学各自的数学平均分
SELECT sex, AVG(math) FROM stu GROUP BY sex; -- MySQL5.7中要求,分组查询时,要查询的列中只能包含分组列和聚合函数,否则会报语法错误
-- MySQL5.6及以前,分组查询时,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
SELECT `name`, sex, AVG(math) FROM stu GROUP BY sex; -- 2. 查询男同学和女同学各自的数学平均分,以及各自人数
SELECT sex, AVG(math),COUNT(*) FROM stu GROUP BY sex; -- 3. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
SELECT sex, AVG(math),COUNT(*) FROM stu WHERE math > 70 GROUP BY sex; -- 4. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个的。
SELECT sex, AVG(math),COUNT(*) FROM stu WHERE math > 70 GROUP BY sex HAVING COUNT(*) > 2;
4.9 分页查询
要查询的数据量比较大时,为了降低服务器压力(数据库服务器的查询压力、应用服务器的内存占用压力),提高用户体验,可以分批次查询出部分数据,此为分页查询。
基础语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询记录个数
起始索引
- 最小起始索引为0
- 起始索引计算公式:起始索引 = (当前页码 - 1) * 每页显示的记录数
不同数据库实现分页的方言不同,常见数据库对应方言如下:
MySQL:LIMIT
Oracle:rownumber
SQL Server:top
SQL
语句/*
分页查询:
基础语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询记录个数
起始索引:最小起始索引为0,起始索引 = (当前页码 - 1) * 每页显示的记录数
注意:
不同数据库实现分页的方言不同,常见数据库对应方言如下:
MySQL:LIMIT
Oracle:rownumber
SQL Server:top */
-- 查询stu表中所有记录
SELECT * FROM stu ;
-- 1. 从0开始查询,查询3条数据
SELECT * FROM stu LIMIT 0 , 3; -- 2. 每页显示3条数据,查询第1页数据
SELECT * FROM stu LIMIT 0 , 3;
SELECT * FROM stu LIMIT 3;
-- 3. 每页显示3条数据,查询第2页数据
SELECT * FROM stu LIMIT 3 , 3;
-- 4. 每页显示3条数据,查询第3页数据
SELECT * FROM stu LIMIT 6 , 3;
JavaWEB-01-MySQL基础的更多相关文章
- 01 mysql 基础一 (进阶)
mysql基础一 1.认识mysql与创建用户 01 Mysql简介 Mysql是最流行的关系型数据库管理系统之一,由瑞典MySQLAB公司开发,目前属于Oracle公司. MySQL是一种关联数据库 ...
- MySql基础架构以及SQL语句执行流程
01. mysql基础架构 SQL语句是如何执行的 学习一下mysql的基础架构,从一条sql语句是如何执行的来学习. 一般我们写一条查询语句类似下面这样: select user,password ...
- JavaWeb——MySQL基础
内容索引 数据库的基本概念 MySQL数据库软件 安装 卸载 配置 SQL 数据库的基本概念 1. 数据库的英文单词: DataBase 简称 : DB 2. 什么数据库? * 用于存储和管理数据的仓 ...
- MYSQL 基础操作
1.MySQL基础操作 一:MySQL基础操作 1:MySQL表复制 复制表结构 + 复制表数据 create table t3 like t1; --创建一个和t1一样的表,用like(表结构也一样 ...
- mysql基础之基本数据类型
原文:mysql基础之基本数据类型 列类型学习 mysql三大列类型 整型 Tinyint/ smallint/ mediumint/int/ bigint(M) unsigned zerofill ...
- JavaWeb开发技术基础概念回顾篇
JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...
- 服务管理之mysql基础
目录 mysql基础 1. 关系型数据库介绍 1.1 数据结构模型 1.2 RDBMS专业名词 2. mysql安装与配置 2.1 mysql安装 2.2 mysql配置 3. mysql的程序组成 ...
- (3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb)
(3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb) 关键词:mysql日志文件,mysqldumpslow分析工具 目录:日志文件的分类 1. ...
- Linux系统——MySQL基础(一)
# 数据库 ## 数据库简单的分类:(1)关系型数据库:MySQL和Oracle.Postgresql(2)非关系型数据库:Memcached和Redis(3)消息队列中间件(4)搜索引擎数据库:El ...
- Linux服务-mysql基础篇
目录 1. 关系型数据库介绍 1.1 数据结构模型 1.2 RDBMS专业名词 1.3 关系型数据库的常见组件 1.4 SQL语句 2. mysql安装与配置 2.1 mysql安装 2.2 mysq ...
随机推荐
- HCNP Routing&Switching之代理ARP
前文我们了解了端口隔离相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16186451.html:今天我们来聊一聊ARP代理相关话题: 端口隔离之破解之 ...
- 看看JDK1.7与1.8的内存模型差异
JDK1.7与1.8的区别的内存模型差异? jsk1.7的内存模型: 堆分为初生代和老年代,大小比例为1:2,初生代又分为eden.from.to三个区域,大小比例为8:1:1 方法区:有代码区.常量 ...
- 设置Linux系统的交叉编译环境
1.在Linaro官网上获得交叉编译工具 网址:http://releases.linaro.org/components/toolchain/gcc-linaro/ 从Linaro官网上能找到4.9 ...
- mask-image实现聚光灯效果
大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...
- C++ 栈内存与堆内存小探究
实验方式:尝试以不同方式创建超大号二维数组 测试代码: #include <iostream> using namespace std; const int maxn=1000000; c ...
- 一文读懂 Kubernetes 容器网络
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 在Kubernetes中要保证容器之间网络互通,网络至关 ...
- 精华!一张图进阶 RocketMQ
前 言 大家好,我是三此君,一个在自我救赎之路上的非典型程序员. "一张图"系列旨在通过"一张图"系统性的解析一个板块的知识点: 三此君向来不喜欢零零散散的知识 ...
- JUC的数据库连接池小练习
JUC练习数据库连接池实现 通过一个连接数组来充当连接池 一个原子的标记数组 通过cas来保持多线程下的安全,用synchronized来进行暂停和唤醒 @Slf4j public class MyC ...
- 组织:IEEE
电气和电子工程师协会(IEEE,全称是Institute of Electrical and Electronics Engineers)是一个美国的电子技术与信息科学工程师的协会,是世界上最大的非营 ...
- 111_Power Pivot 24小时维度:累计、同比、环比相关
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 今天有朋友讨论怎么做每天24小时维度的工作量计算(运营类企业,每天24小时都在运营)需求如下: 1.从0时到23 ...