今日内容

  • MySQL概念
  • 基本环境工具安装
    • MySQL下载安装及基本配置
    • Navicat下载安装及基本配置
  • SQL语法
    • DDL-数据库CRUD操作
    • DDL-数据表CRUD操作
    • DML-数据记录CUD操作
    • DQL-数据记录查询操作

0. 课程导入

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

  • 网页:展示数据

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

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

以往数据存储位置(数据集合/txt文件)及其特点:

  1. 内存:操作快,但是不安全
  2. 文件:相对安全;在并发环境下数据可以不准确;每次读写基本上都要把文件内容全部加载到内存,IO性能会非常差。

上述两种情况,都不适合做数据稳定安全的大量存储。

数据库可以克服上述缺点完成数据存储。

1. 数据库相关概念

1.1 数据库

  • 数据库

    数据库:能够高效的持久化存储和管理海量数据的仓库。MySQL是关系型数据库。

    数据库英文名是 DataBase,简称DB

  • 数据库的分类:

    • 关系型数据库。传统的数据库,OracleMySQLSQLServerDB2,数据(表与表)之间有关联。
    • 非关系型数据库。新型的内存数据库,Redis等,数据之间没有关联,所有数据都存在一起,可以理解成一个大map。

    总结:数据之间存在关系的数据库,就是关系型数据库。关系型数据库中MySQL等更准确的说是数据库管理系统。

  • 关系型数据库优点

    • 都是使用表结构,格式一致,易于维护。
    • 使用通用的 SQL 语言操作,使用方便,可进行复杂查询。
    • 数据存储在磁盘中,可以持久化存储,安全。

1.2 数据库关系系统

  • 概念

    关系数据库的管理软件。

    英文:DataBase Management System,简称 DBMS

通过数据库管理系统数据库进行各种增删改查的操作。我们平时说的MySQL数据库其实是MySQL数据库管理系统。两者关系如图所示:

1.3 库

英文名是 DataBase,简称DB

数据库关系系统可以管理很多数据库,每个数据库中存放的都是相关的一些数据。

每个数据库我们都称为库,和1.1中的数据库概念一致。

MySQL中,一个库对应文件系统中一个同名文件夹。

1.4 表

多个类似的数据存在一起,为了方便维护,存在一个类似于表格的结构中,该结构就是数据库表。

是数据的基本单位,结构为二维表格(行列两个纬度的数据表),类似于Excel中表格。

MySQL中,一个表对应文件系统中的多个同名不同后缀的文件。

英文:table

1.5 记录

每组数据作为一个整体,存在表中,每组数据也被称为一条记录。

英文:row

1.6 各个概念之间的关系

MySQL数据库可以看做是一个大的仓库,类比生活中概念:

生活中,使用仓库存储大量货品;计算机中,通过数据库存储大量数。

数据库中概念 生活中概念 备注
数据库管理系统(D) 京东自营杭州仓进销存管理系统
仓库中每一个小的空间(房间)
房间中的货架
记录/每一条数据 货架上的每一个货品

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pv9qZzhE-1661574557168)(day01-MySQL基础-课堂笔记-64.assets/1593334151283.png)]

1.7 常见的数据库(管理系统)

简单的介绍:

  • Oracle:收费的大型数据库,Oracle甲骨文公司的产品
  • MySQL: 开源免费的中小型数据库。后来 Sun公司收购了 MySQL,而 Sun 公司又被 Oracle 收购
  • SQL ServerMicroSoft微软 公司收费的中型的数据库。C#、.net 等语言常使用
  • PostgreSQL:开源免费中小型的数据库
  • DB2IBM 公司的大型收费数据库产品
  • SQLite:嵌入式的微型数据库。如:作为 Android 内置数据库
  • MariaDB:开源免费中小型的数据库

1.8 SQL

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

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

2. MySQL安装

见当天“资料–>MySQL安装”文件夹中《MySQL安装文档.md》文档

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) :数据定义语言。

  • 库操作相关的DDL

    /*查询所有数据库标准语法:SHOW DATABASES;
    */
    -- 查询所有数据库
    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数据库
    CREATE DATABASE IF NOT EXISTS db1;
    USE db1;/*查询当前使用的数据库标准语法:SELECT DATABASE();
    */
    -- 查询当前正在使用的数据库
    SELECT DATABASE();
    

3.3 DDL-表查询

-- 使用mysql数据库
USE mysql;/*查询所有数据表标准语法:SHOW TABLES;
*/
-- 查询库中所有的表
SHOW TABLES;/*查询表结构标准语法:DESC 表名;
*/
-- 查询user表结构
DESC user;

3.4 DDL-表新增

列名表名等标识符,可以使用``包裹,避免被错误的识别成关键字

/*创建数据表标准语法:CREATE TABLE [IF NOT EXISTS] 表名(列名 数据类型 ,列名 数据类型 ,...列名 数据类型);
*/
-- 创建一个 tb_user 用户表(用户编号、用户名、密码)
-- 列名表名,可以使用``包裹,避免被错误的识别成关键字
-- Ctrl + R 运行已选中SQL
CREATE TABLE IF NOT EXISTS tb_user (id INT,NAME VARCHAR ( 20 ),PASSWORD VARCHAR ( 50 ) )-- 查看tb_user表详细结构
DESC tb_user;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Ac58irw-1661574557169)(day01-MySQL基础-课堂笔记-64.assets/1600498657690.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pFJw9nup-1661574557170)(day01-MySQL基础-课堂笔记-64.assets/1600500356596.png)]

3.5 数据类型

3.5.1 常见的类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5E5BaB8s-1661574557171)(day01-MySQL基础-课堂笔记-64.assets/image-20220424190826983.png)]

使用细节

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

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

    • 只能进行非精确运算,能表示的范围较小.不适用财务、高速、航天等领域
    • DECIMAL:用字符串形式存储运算以提高精度,但是会消耗较多的空间和运算性能
    • 小技巧INT/LONG可以进行精确运算。小数数据可以方法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. 邮件地址,最大长度不超过647. 家庭联系电话,不一定是手机号码,可能会出现-等字符8. 学生状态(用数字表示,正常、休学、毕业...)
    */
    
  • SQL代码

    /*需求:设计一张学生表,请注重数据类型、长度的合理性1. 编号2. 姓名,姓名最长不超过10个汉字3. 性别,因为取值只有两种可能,因此最多一个汉字4. 生日,取值为年月日5. 入学成绩,小数点后保留两位6. 邮件地址,最大长度不超过647. 家庭联系电话,不一定是手机号码,可能会出现-等字符8. 学生状态(用数字表示,正常、休学、毕业...)
    */-- 新建数据库db1(如果不存在)
    CREATE DATABASE IF NOT EXISTS db1;-- 切库到db1
    USE db1;-- 添加前先删除,避免报错-- 按照要求,创建表CREATE TABLE IF NOT EXISTS student(id INT,`name` VARCHAR(10),gender CHAR(1),birherday DATE,score double(5,2),email VARCHAR(64),tel VARCHAR(20),`status`  TINYINT)-- 查看表结构    DESC student;
    

3.6 DDL-表修改

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

新增列会用,切使用频率相对较高。

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

1. 在需要的时候添加一个列
2. 在数据库设计之初,就预留多列冗余字段。
-- 使用db1数据库
use db1;-- 查询库中所有的表
SHOW TABLES;-- 查询stu表结构
DESC stu;/* ******************************************修改表名标准语法:ALTER TABLE 旧表名 RENAME TO 新表名;******************************************
*/
-- 修改student表名为stu
ALTER TABLE stu RENAME TO student;
ALTER TABLE student RENAME TO stu;-- 查询库中所有的表,查看是否修改成功
SHOW TABLES;-- 修改前,查询一下stu表结构
DESC stu;/* ******************************************给表添加列(重点)标准语法:ALTER TABLE 表名 ADD 列名 数据类型;新需求需要添加列的解决方案1. 在需要的时候添加一个列2. 在数据库设计之初,就预留多列冗余字段。******************************************
*/
-- 给stu表添加一列address
ALTER TABLE stu ADD address VARCHAR(50);-- 修改后,查询一下stu表结构
DESC stu;/* ******************************************修改表中列的数据类型标准语法:ALTER TABLE 表名 MODIFY 列名 数据类型;******************************************
*/
-- 将address数据类型修改为定长字符,长度固定50
ALTER TABLE stu MODIFY address CHAR(50);-- 修改后,查询一下stu表结构
DESC stu;/* ******************************************修改表中列的名称和数据类型标准语法:ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型;******************************************
*/
-- 将address修改为addr
ALTER TABLE stu CHANGE address addr VARCHAR(50);-- 修改后,查询一下stu表结构
DESC stu;/* ******************************************删除表中的列标准语法:ALTER TABLE 表名 DROP 列名;******************************************
*/
-- 删除addr列
ALTER TABLE stu DROP addr;-- 修改后,查询一下stu表结构
DESC stu;

3.7 DDL-表删除

/*删除表,如果存在就删除,不存在则会报错。标准语法:DROP TABLE 表名;
*/
-- 删除stu表
DROP TABLE stu;-- 查看当前库中所有表
SHOW TABLES;/*删除表时限判断,如果存在则删除,不存在也不报错。标准语法:DROP TABLE IF EXISTS 表名;
*/
-- 删除stu表,如果存在则删除,不存在也不报错
DROP TABLE IF EXISTS stu;
DROP TABLE IF EXISTS tb_user1;

注意:

  • 对表和库做增删时,如果可以进行健壮性判断(if exists / if not exists),就加上。

3.8 DML-添加记录

  • 注意

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

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

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

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

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

  • SQL语句

    -- 删除stu表
    drop table if exists stu;-- 创建stu表
    CREATE TABLE stu (id int, -- 编号name varchar(20), -- 姓名age int, -- 年龄gender varchar(5), -- 性别birthday date, -- 入学时间score double(5,2), -- 数学成绩email varchar(20), -- 邮箱tel varchar(11),  -- 电话   status int        -- 状态
    );-- 查询所有数据
    SELECT * FROM stu;/*为指定列添加数据标准语法:INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);
    */
    -- 给指定列添加数据
    INSERT INTO stu(id,`name`,age)
    VALUES(2, '张大炮', 19)/*给全部列添加数据标准语法:INSERT INTO 表名 VALUES (值1,值2,值3,...);
    */
    -- 给所有列添加数据,列名的列表可以省略的,但是不推荐;推荐指定列。
    INSERT INTO stu(id,`name`,age,gender,birthday,score,email,tel,`status`)
    VALUES(2, '李云龙', 39,'男','1937-12-12',100.00,'lyl@itcast.cn','二营长,我的意大利炮呢',1)INSERT INTO stu
    VALUES(3, '秀琴', 39,'女','1937-12-12',100.00,'lyl@itcast.cn','~~~~',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(3, '秀琴', 39,'女','1937-12-12',100.00,'lyl@itcast.cn','~~~~',1),(3, '秀琴', 39,'女','1937-12-12',100.00,'lyl@itcast.cn','~~~~',1),(3, '秀琴', 39,'女','1937-12-12',100.00,'lyl@itcast.cn','~~~~',1)

3.9 DML-修改记录

  • 注意事项

    删除/修改时,一定要根据业务需要在修改和删除语句后面通过where关键字,添加条件,否则会造成整个表中数据受影响。

  • 初始化表数据及

    DROP TABLE IF EXISTS `stu`;
    CREATE TABLE `stu`  (`id` int(11) ,`name` varchar(20),`age` int(11) ,`gender` varchar(5),`birthday` date ,`score` double(5, 2) ,`email` varchar(20) ,`tel` varchar(11),`status` int(11)
    ) -- ----------------------------
    -- Records of stu
    -- ----------------------------
    INSERT INTO `stu` VALUES (1, '张大炮', 19, '女', '1999-12-12', 99.99, NULL, NULL, NULL);
    INSERT INTO `stu` VALUES (2, '李云龙', 39, '男', '1999-12-12', 99.99, 'lyl@itcast.cn', '二营长,我的意大利炮呢', 1);
    INSERT INTO `stu` VALUES (3, '秀琴', 39, '女', '1999-12-16', 99.99, 'xq@itcast.cn', '~~~~', 1);
    INSERT INTO `stu` VALUES (4, '秀琴', 39, '女', '1999-12-13', 88.99, 'xq@itcast.cn', '~~~~', 1);
    INSERT INTO `stu` VALUES (5, '秀琴', 39, '女', '1999-12-14', 77.99, 'xq@itcast.cn', '~~~~', 1);
    INSERT INTO `stu` VALUES (6, '秀琴', 39, '女', '1999-12-15', 66.99, 'xq@itcast.cn', '~~~~', 1);
  • SQL语句

    -- 查询stu表中所有记录
    SELECT * FROM stu;/*修改记录标准语法(中括号表示可选):UPDATE 表名 SET 列名1=值1,列名2=值2,… [WHERE 条件] ;
    */
    -- 将张三的性别改为女
    UPDATE stu SET gender = '女' WHERE `name` = '张大炮';-- 将张三的生日改成1999-12-12,分数改为99.99
    UPDATE stu set birthday = '1999-12-12', score = 99.99 WHERE `name` = '张大炮';-- 注意:如果update语句没有加where条件子句,则会将表中所有数据全部修改!
    UPDATE stu set birthday = '1999-12-12', score = 99.99;
    

3.10MDL-删除记录

删除从实现方式上分为两种,一种是物理删除,一种是逻辑删除。

  • 物理删除

    调用delete语句真的把数据删掉。

  • 逻辑删除

    本质是更新。

    逻辑删除,依赖于一个额外的字段(eg:isDeleted 是否删除)。

    删除操作变更新delete from xxx where id = yyy ==> update xxx set isDelete=1 where id = yyy

    查询所有变成按条件查询:如果查询所有未删除的数据,只需要在查询的语句中添加一个条件where isDeleted = 0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2w43B0Id-1661574557172)(day01-MySQL基础-课堂笔记-64.assets/1600503492403.png)]

  • SQL语句

    -- 查询stu表中所有记录
    SELECT * FROM stu;/*删除记录标准语法(中括号表示可选):DELETE FROM 表名 [WHERE 条件] ;
    */
    -- 删除张三记录
    DELETE FROM stu WHERE `name`='张大炮';-- 逻辑删除李云龙
    UPDATE stu SET is_deleted = 1 WHERE `name`= '李云龙' AND is_deleted = 0;-- 逻辑删除之后,查询语句也要发生变化,所有用户使用的查询语句,都要添加额外的 条件  is_deleted = 0
    SELECT * FROM stu WHERE is_deleted = 0;-- 注意:如果delete语句没有加where条件,整个表的数据将会被清空。慎重
    DELETE FROM stu; -- 清空整个表
    

3.11 DQL

DQL(Data Query Language) :数据查询语言。用来查询数据库中表的记录(数据)。

  • 使用频率最高,工作中该系列的SQL语句占比90%以上
  • 最复杂,查询方式、条件等多种多样

详见章节4 .DQL

4. DQL数据查询语言

DQL(Data Query Language) :数据查询语言。用来查询数据库中表的记录(数据)。

  • 使用频率最高,工作中该系列的SQL语句占比90%以上
  • 最复杂,查询方式、条件等多种多样

4.1 语法及分类

SELECT [DISTINCT]字段列表 [[AS] 别名]
FROM表名列表
-- 下面的关键字不要求都出现。但是只要出现了,必须是下面的顺序,否则语法错误。
WHERE分组前的条件列表
GROUP BY分组字段列表
HAVING分组后的过滤条件
ORDER BY排序字段列表
LIMIT分页限定

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

  1. 基本查询
  2. 条件查询(WHERE
  3. 分组查询(GROUP BY
  4. 排序查询(ORDER BY
  5. 分页查询(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');-- 查看验证数据
    SELECT * FROM stu;
    

4.3 基础查询

也可以称为查询所有。

  • 结果集

    查询出来的是所有符合要求的结果集合,简称结果集(ResultSet)。

  • 注意:不建议使用select *

    冗余字段会被查出来,后期添加的字段也会被查出来
    select * 的性能低于 select 字段名列表

  • 字段名的区别

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMziPMv6-1661574557173)(day01-MySQL基础-课堂笔记-64.assets/image-20220424230635742.png)]

/*查询全部记录标准语法:SELECT * FROM 表名;查询出来的结果称为结果集(ResultSet)。不建议使用select *1. 冗余字段会被查出来,后期添加的字段也会被查出来2. select * 的性能低于 select 字段名列表
*/-- 基础查询 ================
-- 查询所有人的姓名和年龄
SELECT `name`, age from stu-- 查询所有人的所有信息。
-- 可以列出所有的字段名,
-- 也可以使用*号代替所有字段名。但是非常不推荐使用。-- 查询stu表中所有列的所有记录
SELECT * FROM stu
SELECT id, `name`, age, sex, address, math, english, hire_date FROM stu;-- 查询所有人的地址
SELECT address FROM stu-- 查询所有人的地址并去除重复记录
SELECT DISTINCT address FROM stu-- 查询所有人的姓名 、数学成绩、英语成绩,并全部起别名
SELECT `name` , math, english FROM stu
SELECT `name` AS '姓名', math '数学成绩', english '英语成绩' FROM stu-- 查询有人的姓名 、数学成绩、英语成绩,部分(英语成绩)起别名
SELECT `name`, math, english AS '英语成绩' FROM stu

4.4 条件查询1

条件精确查询/等值匹配查询。

  • 条件规则

    符号 功能
    > 大于
    < 小于
    >= 大于等于
    <= 小于等于
    = 等于
    <> 或 != 不等于
    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表中所有记录-- 条件查询 =====================
    -- 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 AND age<=30
    SELECT * FROM stu WHERE age >=20 && 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'
    SELECT * FROM stu WHERE hire_date >= '1998-09-01' AND hire_date <= '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 -- 差不到数据
    SELECT * FROM stu WHERE english IS NULL;
    SELECT * FROM stu WHERE english IS NOT NULL;
    

注意事项

  • NULLL <> NULL

4.5 条件查询2

模糊查询,要查询的条件不是通过=这些精确的符号连接,而是使用like

-- 模糊查询 LIKE =====================
/*通配符:(1)_:代表单个任意字符(1个)(2)%:代表任意个数字符(≥0个)
*/-- 1. 查询姓'马'的学员信息
SELECT * FROM stu WHERE name LIKE '马%'-- 2. 查询第二个字是'花'的学员信息
SELECT * FROM stu WHERE `name` LIKE '_花%'-- 3. 查询名字中包含 '德' 的学员信息
SELECT * FROM stu WHERE `name` LIKE '%德%'-- 4. 查询名字为两个字的所有学员信息
SELECT * FROM stu 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 ASC-- 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(id) FROM stu;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;SELECT min(IFNULL(english,0))     from stu;

4.8 分组查询

对查询结果进行分组统计汇总。

分组一般会配合聚合函数来实现。

  • 分组查询语法

    SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤]…;
    
  • 执行顺序

    WHERE > 聚合函数 > HAVING

  • SQL语句

    /*分组查询标准语法:SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤]…;注释事项:分组查询语句中目标字段列表中一般只包含聚合函数和分组字段MySQL5.6及以后版本中要求,分组查询时,要查询的列中只能包含分组列和聚合函数,否则会报语法错误MySQL5.5及以前版本中,分组查询时,查询的目标字段列表可以包含非聚合函数和分组字段,但是查询其他字段无任何意义
    */
    -- 查询stu表中所有记录/*分组查询一般会配合聚合函数一同出现书写技巧:1. 先写分组的条件,不写查询的列2. 按照需求添加要查询的列*/
    -- 1. 查询男同学和女同学各自的数学平均分
    SELECT sex, avg(math)   FROM stu
    GROUP BYsex
    -- MySQL5.6及以后版本中要求,分组查询时,要查询的列中只能包含分组列和聚合函数,否则会报语法错误
    -- MySQL5.5及以前版本中,分组查询时,查询的目标字段列表可以包含非聚合函数和分组字段,但是查询其他字段无任何意义SELECT name, sex, avg(math)FROM stu
    GROUP BYsex     -- 2. 查询男同学和女同学各自的数学平均分,以及各自人数
    SELECT sex, avg(math), count(*)
    FROM stu
    GROUP BYsex-- 3. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
    SELECTsex, AVG(math),COUNT(*)
    FROM stu
    WHEREmath >=70
    GROUP BYsex-- 4. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个的。
    SELECTsex '性别', AVG(math) '数学平均分',COUNT(*) AS "人数"
    FROM stu
    WHEREmath >=70
    GROUP BYsex
    HAVING人数 > 2-- WHERE字句中的查询条件只能使用表字段,不能使用只在结果集中出现的字段或者表字段的聚合函数;因为是在分组前对原始数据进行过滤
    SELECTsex '性别', AVG(math) '数学平均分',COUNT(*) AS "人数"
    FROM stu
    WHEREmath >=70 AND 人数 > 2
    GROUP BYsex-- HAVING子句中的查询条件只能使用查询出来的结果集字段;因为是在分组后对查询出来的结果集进行再次过滤
    SELECTsex '性别', AVG(math) '数学平均分',COUNT(*) AS "人数"
    FROM stu
    WHEREmath >=70
    GROUP BYsex
    HAVINGid > 2
    
  • 注意

    • 分组查询语句中目标字段列表中一般只包含聚合函数和分组字段

    • MySQL5.6及以后版本中要求,分组查询时,要查询的列中只能包含分组列和聚合函数,否则会报语法错误

      MySQL5.5及以前版本中,分组查询时,查询的目标字段列表可以包含非聚合函数和分组字段,但是查询其他字段无任何意义

  • 执行顺序

    WHERE > 聚合函数 > HAVING

  • WHEREHAVING区别

    • 执行时机不一样:WHERE是分组之前进行筛选,不满足WHERE条件,则没机会参与分组;而HAVING是分组之后对结果进行过滤。

    • 可判断的条件不一样:WHERE不能使用表字段外的字段进行判断(包括表字段的聚合函数),HAVING不能使用目标字段列表外的字段作为条件

      -- HAVING 不能使用目标字段列表外的字段作为条件
      SELECT sex, AVG(math),COUNT(*) FROM stu WHERE math > 70 GROUP BY sex HAVING english >10;-- WHERE 不能使用表字段外的字段进行判断(包括表字段的聚合函数)
      SELECT sex, AVG(math),COUNT(*) FROM stu WHERE AVG(math) >10 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:LIMITOracle:rownumberSQL Server:top*/
    -- 查询stu表中所有记录-- 1. 从0开始查询,查询3条数据-- 2. 每页显示3条数据,查询第1页数据-- 3. 每页显示3条数据,查询第2页数据-- 4. 每页显示3条数据,查询第3页数据

函数,否则会报语法错误

MySQL5.5及以前版本中,分组查询时,查询的目标字段列表可以包含非聚合函数和分组字段,但是查询其他字段无任何意义
  • 执行顺序

    WHERE > 聚合函数 > HAVING

  • WHEREHAVING区别

    • 执行时机不一样:WHERE是分组之前进行筛选,不满足WHERE条件,则没机会参与分组;而HAVING是分组之后对结果进行过滤。

    • 可判断的条件不一样:WHERE不能使用表字段外的字段进行判断(包括表字段的聚合函数),HAVING不能使用目标字段列表外的字段作为条件

      -- HAVING 不能使用目标字段列表外的字段作为条件
      SELECT sex, AVG(math),COUNT(*) FROM stu WHERE math > 70 GROUP BY sex HAVING english >10;-- WHERE 不能使用表字段外的字段进行判断(包括表字段的聚合函数)
      SELECT sex, AVG(math),COUNT(*) FROM stu WHERE AVG(math) >10 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:LIMITOracle:rownumberSQL Server:top*/
    -- 查询stu表中所有记录-- 1. 从0开始查询,查询3条数据-- 2. 每页显示3条数据,查询第1页数据-- 3. 每页显示3条数据,查询第2页数据-- 4. 每页显示3条数据,查询第3页数据

day01-MySQL基础相关推荐

  1. Mysql基础学习Day01

    Mysql基础学习Day01 1.SQL语言的分类 2.注释 3.基本的select语句 4.显示表结构 5.过滤数据 突然发现java基础内容学的差不多了 就又开一个mysql基础学习 1.SQL语 ...

  2. mysql基础之视图

    原文:mysql基础之视图 在查询中,我们经常把查询结果 当成临时表来看. View是什么? View可以看一张虚拟表. 是表通过某种运算得到的一个投影. 既然视图只是表的某种查询的投影,所以主要步骤 ...

  3. MySQL基础day03_数据的导入、导出-MySQL 5.6

    MySQL基础day03_数据的导入.导出-MySQL 5.6 注:把数据按照一定格式存放到文件里才能进行数据的导入. 1,数据导入的条件 把文件里的内容保存到数据的表里: 把数据按照一定格式存放文件 ...

  4. MySQL基础篇:子查询

    文章目录 概述 where型子查询 from型子查询 EXISTS型子查询 复制表子查询 概述 在某些情况下,当进行一个查询时,需要的条件或数据要用另一个select语句的结果,这个时候,就要用到** ...

  5. mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

    MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

  6. mysql 基础篇(二) 账号、权限管理

    mysql 基础篇(二) 账号.权限管理.备份与还原 建立账号密码: Grant all on test.* to "cj"@"localhost" ident ...

  7. MySQL:基础—数据分组

    MySQL:基础-数据分组 1.为什么要分组: 比如一个表中有多条订单记录,如上图,每条记录对应着一个商品,现在我要查询 每个商品被订购的单数 准备出货?也就是找到每个商品被订购的数量. 如果只找一个 ...

  8. linux mysql运维_Linux运维常用的 MySQL基础命令

    # MySQL基础命令 ------------- ### 创建MySQL库,授权. >create database mysqldb character set utf8; >grant ...

  9. mysql基础(全,必看)

    MySQL基础 一.MySQL概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access ...

  10. mysql核心数据库_从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程...

    从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程 课程目录 (1) 01MySQL基础_课程引入.avi (2) 02MySQL基础_为什么学习 ...

最新文章

  1. java dateformat 线程安全_SimpleDateFormat线程安全问题深入解析
  2. AMS重要的数据结构解析(二):TaskRecord
  3. KafkaProducer初始化时涉及到哪些核心组件?
  4. 傻瓜式Linux之一:系统安装
  5. npm run dev 和 npx webpack-dev-server
  6. U25%(1,16) and U25%(1,168)on《C4.5:programs for machine learning》
  7. [设计模式] ------ 装饰模式
  8. INFINI GATEWAY 极限网关初体验 ElasticSearch 两个集群数据同步
  9. html5 对比 HTML4 新增,HTML5对比HTML4的主要改变和改进总结
  10. Java动态代理之JDK实现和CGlib实现
  11. 基于OEA框架的客户化设计(一) 总体设计
  12. cent os 7 与cent os 6 修改主机名称
  13. PVS中TFTP的隐藏配置
  14. 数学——对数公式log常识回顾
  15. python 实现文字识别提取
  16. 怎么安装光盘并重新启动计算机,如何用光盘重新安装电脑系统
  17. 华为SNS2224的Zone配置
  18. 类似 毕克BYK354流平剂 荟研 溶剂型体系 润湿流平
  19. 字节跳动2023届校招薪资盘点!
  20. Idea 2022 创建 Artifacts 运行 Tomcat 步骤

热门文章

  1. 机器人genghis_机器人的发展历史你了解吗?
  2. 使鼠标保持按住状态_按下鼠标就能语音打字?讯飞这款鼠标是提高工作效率的好帮手...
  3. 诺基亚称不会被微软收购
  4. 经验分享:上传视频到优酷客户端
  5. 小团队如何妙用 JuiceFS
  6. ASP.NET Core MVC 直接运行报错:对象不支持“addEventListener”属性或方法
  7. ie下载java就花屏,java下载图片花屏的有关问题!
  8. matlab编程mindlin解,MATLAB对mindlin解进行三重积分
  9. ios开发者账户取消订阅
  10. 学会提问的BERT:端到端地从篇章中构建问答对 By 苏剑林