Java Web开发中,MySQL基础操作有哪些?

2026-04-28 13:592阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计9364个文字,预计阅读时间需要38分钟。

Java Web开发中,MySQL基础操作有哪些?

JavaWeb技术内容涵盖数据库存储(MySQL)、JDBC、Maven等,项目使用Mybatis进行管理。前端涉及HTML、CSS、JavaScript、Ajax及Vue、Element UI等。后端核心技术包括Tomcat、Http、Servlet、Request、Response、JSP、Cookie、Session等。

JavaWeb内容
  • 数据库 – 数据存储
    • MySQL
    • JDBC
    • Maven — 项目管理工具
    • Mybatis
  • 前端 — 为了前端哥们沟通
    • HTML+CSS
    • JavaScript
    • Ajax + Vue + Element
  • Web核心
    • Tomcat + Http + Servlet
    • Request + Response
    • JSP
    • Cookie + Session
    • FIlter + Listener
    • 综合案例
内容
  • MySQL
    • MySQL
    • Navicat
  • SQL
    • DQL-数据记录查询操作
0. 课程导入

JavaWeb相关技术可用于网站开发,网站开发主要分为三部分:

  • 网页:展示数据

  • 后台程序:逻辑处理,JavaWeb的主要工作

  • 数据库:存储和管理数据

数据存储位置及其特点:

  1. 内存:操作快,但是不安全
  2. 文件:相对安全;在并发环境下数据可以不准确;每次读写基本上都要把文件内容全部加载到内存,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 ServerMicroSoft微软 公司收费的中型的数据库。C#、.net 等语言常使用
  • PostgreSQL:开源免费中小型的数据库
  • DB2IBM 公司的大型收费数据库产品
  • SQLite:嵌入式的微型数据库。如:作为 Android 内置数据库
  • MariaDB:开源免费中小型的数据库
1.4 SQL

英文:Structured Query Language结构化查询语言。

在各种数据库管理软件中,使用SQL完成对数据库中数据的各种操作。

1.5 数据库分类
  • 数据库的分类:

    • 关系型数据库。传统的数据库,OracleMySQLSQLServerDB2,数据(表与表)之间有关联。
    • 非关系型数据库。新型的内存数据库,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内置库简介

  1. infomation_shema:视图,可以理解为虚拟表,保存数据库中各种信息
  2. mysqlMySQL中核心内容存在里面,用户、密码、权限等
  3. performance_schema:保存性能相关信息
  4. 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 常见的类型

使用细节

  • 图中红色加粗的为常用的数据类型

  • DOUBLEFlOAT分别表示单双精度浮点型

    • 只能进行非精确运算,能表示的范围较小。不适用财务、高速、航天等领域。
    • 可以指定精度,格式如下: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表修改

对表修改要慎重,除了新增列之外,一般不会修改,因为可能会影响到之前数据和代码的运行。

新增列会用,且使用频率相对较高。比较重要。

新需求需要添加列/字段的解决方案

  1. 在需要的时候添加一个列/字段

    1. 在数据库设计之初,就预留多列冗余字段。

-- 使用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-添加记录
  • 注意

    1. 添加的数据的个数和类型,一定要和指定字段的数量、类型保持一致。
    2. 除数字外,其他类型的值要使用引号包裹(建议单引号,可以双引号),特别是字符串和日期
    3. 列名如果是关键字,要使用``包裹
  • 添加记录工作中用法

    为了可读性、兼容性、健壮性等考虑,建议使用添加指定列方式

    1. 冗余字段可以排除
    2. 后期添加的资源不会对之前的数据SQL产生影响
  • 数据库字段设计思路

    1. 设计之初就预留好冗余字段,当前可以没用,之后如果有需要可以被征用。推荐第一种
    2. 设计之初不预留冗余字段,以后业务需要的时候,添加额外的字段。

    不管使用哪种设计方式,在做增删改查的时候,如果能够指定列,就尽量指定;而非操作所有的数据列。

  • 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 分页限定

按照上面关键词出现的情况不同(最根本原因是根据查询的需求不同),查询可以分为如下几类:

  1. 基本查询
  2. 条件查询(WHERE
  3. 聚合查询(聚合函数)
  4. 分组查询(GROUP BY
  5. 排序查询(ORDER BY
  6. 分页查询(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

Java Web开发中,MySQL基础操作有哪些?

-- 模糊查询 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

  • WHEREHAVING区别

    • 执行时机不一样: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;

本文共计9364个文字,预计阅读时间需要38分钟。

Java Web开发中,MySQL基础操作有哪些?

JavaWeb技术内容涵盖数据库存储(MySQL)、JDBC、Maven等,项目使用Mybatis进行管理。前端涉及HTML、CSS、JavaScript、Ajax及Vue、Element UI等。后端核心技术包括Tomcat、Http、Servlet、Request、Response、JSP、Cookie、Session等。

JavaWeb内容
  • 数据库 – 数据存储
    • MySQL
    • JDBC
    • Maven — 项目管理工具
    • Mybatis
  • 前端 — 为了前端哥们沟通
    • HTML+CSS
    • JavaScript
    • Ajax + Vue + Element
  • Web核心
    • Tomcat + Http + Servlet
    • Request + Response
    • JSP
    • Cookie + Session
    • FIlter + Listener
    • 综合案例
内容
  • MySQL
    • MySQL
    • Navicat
  • SQL
    • DQL-数据记录查询操作
0. 课程导入

JavaWeb相关技术可用于网站开发,网站开发主要分为三部分:

  • 网页:展示数据

  • 后台程序:逻辑处理,JavaWeb的主要工作

  • 数据库:存储和管理数据

数据存储位置及其特点:

  1. 内存:操作快,但是不安全
  2. 文件:相对安全;在并发环境下数据可以不准确;每次读写基本上都要把文件内容全部加载到内存,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 ServerMicroSoft微软 公司收费的中型的数据库。C#、.net 等语言常使用
  • PostgreSQL:开源免费中小型的数据库
  • DB2IBM 公司的大型收费数据库产品
  • SQLite:嵌入式的微型数据库。如:作为 Android 内置数据库
  • MariaDB:开源免费中小型的数据库
1.4 SQL

英文:Structured Query Language结构化查询语言。

在各种数据库管理软件中,使用SQL完成对数据库中数据的各种操作。

1.5 数据库分类
  • 数据库的分类:

    • 关系型数据库。传统的数据库,OracleMySQLSQLServerDB2,数据(表与表)之间有关联。
    • 非关系型数据库。新型的内存数据库,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内置库简介

  1. infomation_shema:视图,可以理解为虚拟表,保存数据库中各种信息
  2. mysqlMySQL中核心内容存在里面,用户、密码、权限等
  3. performance_schema:保存性能相关信息
  4. 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 常见的类型

使用细节

  • 图中红色加粗的为常用的数据类型

  • DOUBLEFlOAT分别表示单双精度浮点型

    • 只能进行非精确运算,能表示的范围较小。不适用财务、高速、航天等领域。
    • 可以指定精度,格式如下: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表修改

对表修改要慎重,除了新增列之外,一般不会修改,因为可能会影响到之前数据和代码的运行。

新增列会用,且使用频率相对较高。比较重要。

新需求需要添加列/字段的解决方案

  1. 在需要的时候添加一个列/字段

    1. 在数据库设计之初,就预留多列冗余字段。

-- 使用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-添加记录
  • 注意

    1. 添加的数据的个数和类型,一定要和指定字段的数量、类型保持一致。
    2. 除数字外,其他类型的值要使用引号包裹(建议单引号,可以双引号),特别是字符串和日期
    3. 列名如果是关键字,要使用``包裹
  • 添加记录工作中用法

    为了可读性、兼容性、健壮性等考虑,建议使用添加指定列方式

    1. 冗余字段可以排除
    2. 后期添加的资源不会对之前的数据SQL产生影响
  • 数据库字段设计思路

    1. 设计之初就预留好冗余字段,当前可以没用,之后如果有需要可以被征用。推荐第一种
    2. 设计之初不预留冗余字段,以后业务需要的时候,添加额外的字段。

    不管使用哪种设计方式,在做增删改查的时候,如果能够指定列,就尽量指定;而非操作所有的数据列。

  • 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 分页限定

按照上面关键词出现的情况不同(最根本原因是根据查询的需求不同),查询可以分为如下几类:

  1. 基本查询
  2. 条件查询(WHERE
  3. 聚合查询(聚合函数)
  4. 分组查询(GROUP BY
  5. 排序查询(ORDER BY
  6. 分页查询(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

Java Web开发中,MySQL基础操作有哪些?

-- 模糊查询 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

  • WHEREHAVING区别

    • 执行时机不一样: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;