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的主要工作

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

数据存储位置及其特点:

  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

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

JavaWEB-01-MySQL基础的更多相关文章

  1. 01 mysql 基础一 (进阶)

    mysql基础一 1.认识mysql与创建用户 01 Mysql简介 Mysql是最流行的关系型数据库管理系统之一,由瑞典MySQLAB公司开发,目前属于Oracle公司. MySQL是一种关联数据库 ...

  2. MySql基础架构以及SQL语句执行流程

    01. mysql基础架构 SQL语句是如何执行的 学习一下mysql的基础架构,从一条sql语句是如何执行的来学习. 一般我们写一条查询语句类似下面这样: select user,password ...

  3. JavaWeb——MySQL基础

    内容索引 数据库的基本概念 MySQL数据库软件 安装 卸载 配置 SQL 数据库的基本概念 1. 数据库的英文单词: DataBase 简称 : DB 2. 什么数据库? * 用于存储和管理数据的仓 ...

  4. MYSQL 基础操作

    1.MySQL基础操作 一:MySQL基础操作 1:MySQL表复制 复制表结构 + 复制表数据 create table t3 like t1; --创建一个和t1一样的表,用like(表结构也一样 ...

  5. mysql基础之基本数据类型

    原文:mysql基础之基本数据类型 列类型学习 mysql三大列类型 整型 Tinyint/ smallint/ mediumint/int/ bigint(M) unsigned zerofill ...

  6. JavaWeb开发技术基础概念回顾篇

    JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...

  7. 服务管理之mysql基础

    目录 mysql基础 1. 关系型数据库介绍 1.1 数据结构模型 1.2 RDBMS专业名词 2. mysql安装与配置 2.1 mysql安装 2.2 mysql配置 3. mysql的程序组成 ...

  8. (3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb)

    (3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb) 关键词:mysql日志文件,mysqldumpslow分析工具 目录:日志文件的分类 1. ...

  9. Linux系统——MySQL基础(一)

    # 数据库 ## 数据库简单的分类:(1)关系型数据库:MySQL和Oracle.Postgresql(2)非关系型数据库:Memcached和Redis(3)消息队列中间件(4)搜索引擎数据库:El ...

  10. Linux服务-mysql基础篇

    目录 1. 关系型数据库介绍 1.1 数据结构模型 1.2 RDBMS专业名词 1.3 关系型数据库的常见组件 1.4 SQL语句 2. mysql安装与配置 2.1 mysql安装 2.2 mysq ...

随机推荐

  1. Intel CPU平台和架构介绍

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 服务器主板上数据传输流依次为CPU .内存.硬盘和网卡, ...

  2. 详解Kubernetes存储体系

    Volume.PV.PVC.StorageClass由来 先思考一个问题,为什么会引入Volume这样一个概念? " 答案很简单,为了实现数据持久化,数据的生命周期不随着容器的消亡而消亡. ...

  3. docker 灵活的构建 php 环境

    地址: https://github.com/ydtg1993/server           使用docker搭建灵活的线上php环境 有时候你可能不太需要一些别人已经集成了的包或者镜像      ...

  4. CRM项目的整理-----第二篇

    1.项目的登录 1.1 app创建二级路由 2.登录页面   http://www.jq22.com/

  5. MySQL8小时问题

    一.问题 获取MySQL连接,8小时内无请求自动断开连接. 二.解决 2.1 分析 MySQL服务器默认的"wait_timeout"是28800秒即8小时,意味着如果一个连接的空 ...

  6. 个人冲刺(三)——体温上报app(二阶段)

    冲刺任务:完成用户类.温度数据和第二页面类的编写 User.java package com.example.helloworld; class User { private String usern ...

  7. Linux版 MySql57安装教程

    这里介绍的是CentOS7.4安装mysql57的教程 创建MySQL文件包 使用mkdir -p 文件夹路径创建以下目录: 文件夹路径 用途 /usr/local/mysql MySQL安装路径 / ...

  8. 线性求 $i^i$ 的做法

    线性求 \(i^i\) 的做法 方便起见,我们记 \(f_i=i^i\),\(i\) 的最小质因子为 \(p=\mathrm{minp}(i)\),第 \(i\) 个质数为 \(\mathrm{pr} ...

  9. Java概论——JavaSE基础

    Java概论 Java特性和优势 简单性 面向对象 可移植性 高性能:即时编译 分布式:可处理TCP/IP协议的一些东西 动态性:通过反射机制使其具有动态性 多线程:良好的交互性和实时性 安全性:防病 ...

  10. Kubernetes client-go workqueue 源码分析

    概述Queue接口和结构体setAdd()Get()Done()DelayingQueue接口和结构体waitForNewDelayingQueuewaitingLoop()AddAfter()Rat ...