学习目标

  • 能够掌握数据库的概念和作用
  • 能够参考文档完成mysql的安装与配置
  • 能够了解sql的作用与分类
  • 能够掌握DDL的建库、建表语句
  • 能够掌握DML的增、删、改语句
  • 能够掌握DQL的基本查询语句
  • 能够使用where完成相关的条件查询
  • 能够使用SQL语句进行排序
  • 能够使用聚合函数
  • 能够使用SQL语句进行分组查询

    第一章 数据库介绍

    1.1 什么是数据库

    1. 存储数据的仓库. 其本质是一个文件系统,数据库按照特定的格式将数据存储到文件中,使用者可以对数据库中的数据进行增加,修改,删除及查询操作。

    1.2 常用数据存储方式

    | 存储位置 | 优点 | 缺点 | | —- | —- | —- | | 内存
    例如: 集合,实体类对象数据是放在内存中 | 存取速度很快 | 不能永久的保存,程序停止时,内存释放数据消失 | | 文件
    例如: IO流,把数据存在文件中 | 可以永久操作数据 | 每种不同类型的文件都有自己存放数据的格式,数据的管理和维护不方便 | | 数据库 | 数据库按照特定的格式将数据存储起来,通过SQL或命令可以方便的对大量数据进行增、删、改、查操作。 | 数据库通常是要花钱的 |

1.3 数据库管理系统

数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问和操作数据库中表内的数据

1.4 数据库管理系统、数据库和表的关系

数据库管理程序(DBMS)可以管理多个数据库,一般开发人员会针对每一个项目创建一个数据库。为保存项目中实体的数据,一般会在数据库创建与实体对应的表,以保存程序中实体的数据。数据库管理系统、数据库和表的关系如图所示:
day01-mysql - 图1
先有数据库管理系统 → 再有数据库 → 再有表 → 再有数据
数据库管理系统可以管理多个数据库
一个数据库可以管理多张表
一张表可以包含多条记录

1.5 实体类与表记录的对应关系

day01-mysql - 图2

1.6 常见的数据库有哪些

全球数据库使用排行榜: https://db-engines.com/en/ranking
下图采集与2020年5月
day01-mysql - 图3

数据库名称 描述
MYSQL 开源免费的,小型的数据库.原产自瑞典AB公司,后来被SUN公司收购,
再后来,Oracle收购SUN,Oracle收购后. MySQL6.x版本也开始收费。
Oracle 收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。
DB2 IBM公司的数据库产品,收费的。常应用在银行系统中.
SQLServer MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
SQLite 嵌入式的小型数据库,应用在手机端。

第二章 Mysql数据库

2.1 Mysql服务器软件安装与卸载

2.1.1 服务器软件下载地址

  1. https://dev.mysql.com/downloads/installer/

2.1.2 Mysql服务器端软件卸载

注意: 卸载前先将Mysql的服务给停止

卸载方式1-第三方工具写在(推荐)

使用自己电脑上的电脑管家,或360等,这些第三方软件会自动删除系统注册表中的相关文件

卸载方式2-控制面板卸载

1.控制面板 —> 所有控制面板项 —> 程序和功能,选择mysql server右击 —> 卸载!
day01-mysql - 图4
2.找到对应的安装目录,将安装目录下的配置删除.
day01-mysql - 图5
3.搜索regedit —> 打开注册表
day01-mysql - 图6
4.找到HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\EventLog\Application\MySQL目录,右击删除Mysql目录即可
day01-mysql - 图7
5.删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL文件夹和
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL的文件夹如果没有可以不用删除了

2.1.3 Mysql服务器端软件安装

安装步骤


  1. 复制数据库服务器文件
  2. 配置数据库服务器

安装过程


  1. 打开MySQL的安装包,双击运行:mysql-installer-community-5.6.22.0.msi
    day01-mysql - 图8

day01-mysql - 图9

  1. 选择安装模式
    • Developer Default:开发者默认模式
    • Server only:只安装服务器模式
    • Client only:只安装客户端模式
    • Full:全部安装模式
    • Custom:自定义安装模式
      我们选择Custom模式,点击“Next”继续

day01-mysql - 图10

  1. MySQL版本选择
    • 如果电脑是64位系统,就选择64位服务器
    • 如果电脑是32位系统,就选择32位服务器

day01-mysql - 图11

  1. 安装目录
    可以选择MySQL的服务器安装目录和数据安装目录,我这里是均选择安装到默认目录

day01-mysql - 图12
day01-mysql - 图13
day01-mysql - 图14
day01-mysql - 图15

2.2 配置过程

  1. 服务器安装完成,开始配置MySQL

day01-mysql - 图16

  1. 端口配置

MySQL服务器端口号是3306,默认即可
day01-mysql - 图17

  1. 设置数据库root用户的密码

学习阶段建议密码设置为root,方便记忆
day01-mysql - 图18

  1. 配置MySQL为Windows的一个服务

day01-mysql - 图19

  1. 设置MySQL的日志名称

day01-mysql - 图20
day01-mysql - 图21

  1. 出现下面8个对勾,表示服务器配置完成

day01-mysql - 图22
day01-mysql - 图23

  1. 点击“Finish”,完成MySQL的安装

day01-mysql - 图24

  1. 配置环境变量
    把MySQL安装目录下的bin目录,添加到Path环境变量中
    day01-mysql - 图25
  2. 打开DOS环境,验证环境变量配置是否成功
    day01-mysql - 图26

    2.2 启动Mysql服务器

    方式1: windows服务方式启动

    此电脑右击 —> 管理
    day01-mysql - 图27
    找到对应的服务,我们安装Mysql时,服务名称叫做 MySQL56,直接右击或在左测控制当前服务的状态
    day01-mysql - 图28

    方式2:DOS命令方式启动

    win + r快捷键打开运行框,输入cmd,打开DOS命令窗口
    day01-mysql - 图29
    启动服务的命令: net start mysql56
    停止服务的命令: net stop mysql
    day01-mysql - 图30

    2.3 DOS连接Mysql

    1. DOS命令窗口当做Mysql的客户端连接并操作Mysql数据库:
    2. 登录命令:
    3. mysql -u用户名 -p密码
    4. mysql -u用户名 -p
    5. 密码
    6. mysql -h主机地址 -u用户名 -p密码
    7. mysql -h主机地址 -u用户名 -p
    8. 密码
    9. 登录的方式有很多种,使用任意一种即可.
    10. 用户名(根用户): root
    11. 密码(根密码): root

    day01-mysql - 图31

    2.4 SQLyog连接Mysql

    SQLyog概述

    SQLyog 是业界著名的 Webyog 公司出品的一款简洁高效、功能强大的图形化 MySQL 数据库管理工具。使用SQLyog 可以快速直观地让您从世界的任何角落通过网络来操作远端的 MySQL 数据库。
    day01-mysql - 图32

    SQLyog与数据库的关系

    day01-mysql - 图33

    操作方式

    day01-mysql - 图34
    day01-mysql - 图35

    第三章 SQL概述

    3.1 什么是SQL

    结构化查询语言(Structured Query Language)简称SQL,SQL语句就是对数据库进行操作的一种语言。

    3.2 SQL作用

    通过SQL语句我们可以方便的操作数据库管理系统中的数据库、表和表中的数据了。 SQL是数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但都有特有内容。
    day01-mysql - 图36

    3.3 SQL语句分类(4类)

    | 分类 | 描述 | 关键字 | | —- | —- | —- | | DDL(Data Definition Language)
    数据定义语言 | 用来定义数据库对象:数据库,表,列 | create,drop,alter等 | | DML(Data Manipulation Language)
    数据操作语言 | 用来对数据库中表的数据进行增删改 | insert,delete, update等 | | DCL(Data Control Language)
    数据控制语言 | 用来定义数据库的访问权限和安全级别,及创建用户 | GRANT, REVOKE等 | | TCL(Transaction Control Language)
    事务控制语言 | 用于控制数据库的事务操作 | COMMIT,SAVEPOINT,ROLLBACK等 | | DQL(Data Query Language)
    数据查询语言 (掌握) | DQL语言并不是属于MYSQL官方的分类,但是对数据库的操作最多就是查询,所以我们的程序员把查询语句的语句称作为DQL语言 | SELECT 等 |

3.4 SQL通用语法

  1. SQL语句可以单行或多行书写,以分号结尾。
  2. 可使用空格和缩进来增强语句的可读性。
  3. MySQL数据库的SQL语句不区分大小写。
  4. 3种注释 | 注释的语法 | 说明 | | —- | —- | | —空格 | 单行注释,通用的注释 | | # | 单行注释,只有mysql中可以使用 | | / / | 多行注释, |

第四章 基础SQL-DDL语句

4.1 DDL操作数据库

4.1.1 创建数据库

  • 直接创建数据库
    CREATE DATABASE 数据库名;
  • 判断是否存在并创建数据库(了解)
    CREATE DATABASE IF NOT EXISTS 数据库名;
  • 创建数据库并指定字符集(了解)
    CREATE DATABASE 数据库名 CHARACTER SET 字符集;

具体操作:

  1. -- 需求: 创建名称为db1的数据库
  2. create database db1;
  3. -- 需求: db2数据库不存在是创建名称为db2数据库
  4. create database if not exists db2;
  5. -- 需求: 创建名称为db3数据库,并指定字符集为gbk
  6. create database db3 character set gbk;

示例图:
day01-mysql - 图37
day01-mysql - 图38

4.1.2 查看数据库

  • 查看所有的数据库
    SHOW DATABASES;
  • 查看某个数据库的定义信息
    SHOW CREATE DATABASE 数据库名;

具体操作:

  1. -- 需求:查询Mysql数据管理系统中所有的数据库
  2. show databases;
  3. -- 需求:查询db3数据库的建库语句
  4. show create database db3;

示例图:
day01-mysql - 图39

4.1.3 修改数据库(了解)

  • 修改数据库字符集格式
    ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;

具体操作:

  1. -- 需求:将db3数据库的字符集改成utf8
  2. alter database db3 default character set utf8;
  3. -- 注意:utf8没有中间的横杠

示例图:
day01-mysql - 图40

4.1.4 删除数据库

DROP DATABASE 数据库名;
具体操作:

  1. -- 从数据库管理系统中删除名称为db2的数据库
  2. drop database db2;

示例图:
day01-mysql - 图41

4.1.5 使用数据库

  • 查看正在使用的数据库
    SELECT DATABASE();
  • 使用/切换数据库
    USE 数据库名;

具体操作:

  1. -- 查看正在使用的数据库
  2. select database();
  3. -- 使用db1数据库
  4. use db1;

示例图:
day01-mysql - 图42

4.2 DDL操作表

4.2.1 创建表

语法:

-- 创建表
create table 表名( 
  字段名 字段类型 约束,
  字段名 字段类型 约束 
);
-- 快速创建一个表结构相同的表
  CREATE TABLE 新表名 LIKE 旧表名;

具体操作:

-- 需求:创建student表包含
--        id整数
--        name变长字符串长20
--        sex性别定长型1
--        birthday字段日期类型
create table student(
     id int,   -- 编号
     name varchar(20),  -- 姓名
     sex char(1),   -- 性别
     birthday date  -- 生日
);
-- 需求:创建一个student2表,结构与student相同
    create table student2 like student;

示例图:
day01-mysql - 图43
day01-mysql - 图44
常使用的数据类型如下:

数据类型 关键字
整型 int或integer
浮点型 double, float
decimal(5,2) 整个小数长5位,小数位占2位
字符串型 char定长:char(2) 最长存储2个字符,无论有没有使用2个,都是占用2个。
varchar可变长:如:varchar(100),最长可以保存100个字符
如果只使用了3个,占3个字符的空间。
日期类型 date或time,datetime

day01-mysql - 图45

4.2.2 查看表

  • 查看某个数据库中的所有表
    SHOW TABLES;
  • 查看表结构
    DESC 表名;
  • 查看创建表的SQL语句
    SHOW CREATE TABLE 表名;

具体操作:

-- 需求:查看mysql数据库中的所有表
    show tables;
-- 需求:查看student表的结构
    desc student;
-- 需求:查看student表的建表语句
    show create table student;

示例图:
day01-mysql - 图46

4.2.3 修改表结构(了解)

修改表结构使用不是很频繁,只需要知道下,等需要使用的时候再回来查即可

  • 添加表列
    ALTER TABLE 表名 ADD 列名 类型;

    -- 需求:为student表添加一个新的字段nianling,类型为varchar(2)
      alter table student add nianling varchar(2);
    
  • day01-mysql - 图47

  • 修改列类型
    ALTER TABLE 表名 MODIFY 列名 新的类型;

    -- 需求:将student表中的nianling字段的类型改为int(11)
      alter table student modify nianling int(11);
    
  • day01-mysql - 图48

  • 修改列名
    ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;

    -- 需求:将student表中的nianling字段名改成age,类型int(2)
      alter table student change nianling age int(2);
    
  • day01-mysql - 图49

  • 删除列

ALTER TABLE 表名 DROP 列名;

-- 需求:将student表中的age字段从表中删除
    alter table student drop age;

day01-mysql - 图50

  • 修改表名

RENAME TABLE 表名 TO 新表名;

-- 需求:将student表名称改为stu
    rename table student to stu;

day01-mysql - 图51

  • 修改字符集
    ALTER TABLE 表名 character set 字符集;

    -- 需求:将stu表的字符集修改为gbk, 再将其修改回来
      alter table stu character set gbk;
      alter table stu character set utf8;
    
  • day01-mysql - 图52

    4.2.4 删除表

  • 直接删除表
    DROP TABLE 表名;

  • 判断表是否存在并删除表(了解)
    DROP TABLE IF EXISTS 表名;

具体操作:

-- 需求:直接删除student2表
    drop table student2;
-- 需求:判断表是否存在,若存在则删除表
    drop table if exists student2;

示例图:
day01-mysql - 图53

第五章 基础SQL-DML语句

5.1 新增记录

5.1.1 新增全部字段数据

  • 罗列所有的字段
    INSERT INTO 表名 (字段名1, 字段名2, 字段名3…) VALUES (值1, 值2, 值3);
  • 不写字段名
    INSERT INTO 表名 VALUES (值1, 值2, 值3…);
    此时值的个数,顺序,类型要和数据库表字段的个数,顺序,类型保持一致

    5.1.2 新增部分字段数据

    INSERT INTO 表名 (字段名1, 字段名2, …) VALUES (值1, 值2, …);

    5.1.3 关键字说明及注意事项

    ```java
  1. 关键字说明 INSERT INTO 表名 //表示往哪张表中添加数据 (字段名1, 字段名2, …) //要给哪些字段设置值 VALUES (值1, 值2, …); //设置具体的值
  2. 注意 值与字段个数,顺序,类型都必须对应 值的数据大小必须在字段的长度范围内 除了数值类型外,其它的字段类型的值必须使用引号引起。(建议单引号) 如果要插入空值,可以不写字段,或者插入null
    具体操作:
    ```sql
    -- 添加一条记录(罗列所有字段方式): id为1,姓名为tom,性别为男,生日为2020-05-20
     insert into stu (id,sex,name,birthday) values (1,'男','tom','2020-05-20');
    -- 添加一条记录(省去字段名称不写方式): id为2,姓名为汤姆,性别为男,生日为2020-05-21
     insert into stu values (2,'汤姆','男','2020-05-21');
    -- 添加一条记录:姓名为柳岩,性别为女
     insert into stu (name,sex) values('柳岩','女');
    
    示例图:
    day01-mysql - 图54

    5.2 蠕虫复制

    什么是蠕虫复制:

    在已有的数据基础之上,将原来的数据进行复制,插入到对应的表中

    语法格式:

    INSERT INTO 表名1 SELECT * FROM 表名2;
    作用:将表名2 中的数据复制到 表名1 中
    具体操作:
    -- 1.快速创建一张stu2表,结构与stu一样
     create table stu2 like stu;
    -- 2.查询stu2表结构和表中的数据
     desc stu2;
     select * from stu2;
    -- 3.蠕虫复制stu表中的数据到stu2表中
     insert into stu2 select * from stu;
    
    示例图:
    day01-mysql - 图55

    5.3 更新表记录

    sql格式

  • 不带条件修改数据
    UPDATE 表名 SET 字段名=值,字段名=值;
  • 带条件修改数据
    UPDATE 表名 SET 字段名=值 WHERE 字段名=值 AND字段名称=值;

    关键字说明

    update    // 修改数据
    set //修改哪些字段
    where 条件; //指定条件
    

    具体操作:

    -- 需求:修改表中的性别为'女'
      update stu set sex='女'; 
    -- 需求:将表中id为1的性别改为男
      update stu set sex='男' where id=1;
    

    示例图:
    day01-mysql - 图56
    day01-mysql - 图57

    5.4 删除表记录

  • 不带条件删除数据
    DELETE FROM 表名;

  • 根据条件删除数据
    DELETE FROM 表名 WHERE 字段名=值;
  • truncate删除表记录
    TRUNCATE TABLE 表名;

    truncate和delete的区别:
       delete是将表中的数据一条一条删除
       truncate是将整个表摧毁,重新创建一个新的表,新的表结构和原来表结构一模一样
    

    具体操作:

    -- 需求:删除id为2的学生信息
      delete from stu where id=2;
    -- 需求:删除整张表中的所有数据
      delete from stu;
      truncate table stu;
    

    示例图:
    day01-mysql - 图58
    day01-mysql - 图59

    第六章 基础SQL-DQL语句

    查询不会对数据库中的数据进行修改.只是一种显示数据的方式

    6.1 简单查询

    备用数据:

    ----------------运行下面的sql语句,生成相关的数据库表
    #创建商品表:
    CREATE TABLE product(
      pid INT,
      pname VARCHAR(20),
      price DOUBLE,
      category_id VARCHAR(32)
    );
    INSERT INTO product(pid,pname,price,category_id) VALUES(1,'联想',5000,'c001');
    INSERT INTO product(pid,pname,price,category_id) VALUES(2,'海尔',3000,'c001');
    INSERT INTO product(pid,pname,price,category_id) VALUES(3,'雷神',5000,'c001');
    INSERT INTO product(pid,pname,price,category_id) VALUES(4,'JACK JONES',800,'c002');
    INSERT INTO product(pid,pname,price,category_id) VALUES(5,'真维斯',200,'c002');
    INSERT INTO product(pid,pname,price,category_id) VALUES(6,'花花公子',440,'c002');
    INSERT INTO product(pid,pname,price,category_id) VALUES(7,'劲霸',2000,'c002');
    INSERT INTO product(pid,pname,price,category_id) VALUES(8,'香奈儿',800,'c003');
    INSERT INTO product(pid,pname,price,category_id) VALUES(9,'相宜本草',200,'c003');
    INSERT INTO product(pid,pname,price,category_id) VALUES(10,'面霸',5,'c003');
    INSERT INTO product(pid,pname,price,category_id) VALUES(11,'好想你枣',56,'c004');
    INSERT INTO product(pid,pname,price,category_id) VALUES(12,'香飘飘奶茶',1,'c005');
    INSERT INTO product(pid,pname,price,category_id) VALUES(13,'果9',1,NULL);
    INSERT INTO product(pid,pname,category_id) VALUES(14,'香飘飘奶茶','c005');
    

    6.1.1 查询所有

    select * from 表名;

    -- 需求:查询所有的商品.
    SELECT * FROM product;
    

    day01-mysql - 图60

    6.1.2 查询指定列

      select 字段名1,字段名2...  from 表名;
    
    -- 需求:查询商品名和商品价格.
    SELECT pname,price FROM product;
    

    day01-mysql - 图61

    6.1.3 别名查询

      select 字段名1 as 别名,字段名2 别名 from 表名 as 表别名;<br />        as关键字可以省去不写
    
    -- 需求3.别名查询.使用的关键字是as(as可以省略的).    
    --   3.1表别名:查询商品名称和价格
      SELECT pro.pname,pro.price FROM product AS pro;
    --   3.2列别名:查询商品名称和价格
      SELECT pname AS "商品名称",price "商品价格" FROM product;
    

    day01-mysql - 图62

    6.1.4 去重复查询

      select distinct 字段名 from 表名;
    
    -- 需求:查看商品表中有那些价格.
    SELECT DISTINCT price FROM product;
    

    day01-mysql - 图63

    6.1.5 查询结果参与运算

      select 列名1 + 固定值 from 表名;
    
    -- 需求:将所有商品的价格+10元进行显示. (查询结果可参与运算)
    SELECT *,IFNULL(price,0)+10 FROM product;
    

    day01-mysql - 图64

    第七章 基础SQL-DQL语句(重点)

    7.1 条件查询

    前面我们的查询都是将所有数据都查询出来,但是有时候我们只想获取到满足条件的数据
    语法格式:SELECT 字段名 FROM 表名 WHERE 条件;
    流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回

    7.1.1 准备数据

    CREATE TABLE stu3 (
      id INT,
      NAME VARCHAR(20),
      age INT,
      sex VARCHAR(5),
      address VARCHAR(100),
      math INT,
      english INT
    );
    # 批量插入
    INSERT INTO stu3 VALUES 
    (1,'马云',55,'男','杭州',66,78),
    (2,'马化腾',45,'女','深圳',98,87),
    (3,'马景涛',55,'男','香港',56,77),
    (4,'柳岩',20,'女','湖南',76,65),
    (5,'柳青',20,'男','湖南',86,NULL),
    (6,'刘德华',57,'男','香港',99,99),
    (7,'马德',22,'女','香港',99,99),
    (8,'德玛西亚',18,'男','南京',56,65);
    

    7.1.2 比较运算符

    > 大于 
      < 小于 
      <= 小于等于 
      >= 大于等于 
      = 等于 
      <>  != 不等于
    

    具体操作:

  • 查询math分数大于80分的学生

    SELECT * FROM student3 WHERE math>80;
    

    day01-mysql - 图65

  • 查询english分数小于或等于80分的学生

    SELECT * FROM student3 WHERE english<=80;
    

    day01-mysql - 图66

  • 查询age等于20岁的学生

    SELECT * FROM student3 WHERE age=20;
    

    day01-mysql - 图67

  • 查询age不等于20岁的学生

    SELECT * FROM student3 WHERE age!=20;
    SELECT * FROM student3 WHERE age<>20;
    

    day01-mysql - 图68

    7.1.3 逻辑运算符

    and(&&) 多个条件同时满足 
    or(||) 多个条件其中一个满足 
    not(!) 不满足
    

    具体操作:

  • 查询age大于35且性别为男的学生(两个条件同时满足)

    SELECT * FROM student3 WHERE  age>35 AND sex='男';
    

    day01-mysql - 图69

  • 查询age大于35或性别为男的学生(两个条件其中一个满足)

    SELECT * FROM student333 WHERE age>35 OR sex='男';
    

    day01-mysql - 图70

  • 查询id是1或3或5的学生

    SELECT * FROM student3 WHERE id=1 OR id=3 OR id=5;
    

    day01-mysql - 图71

    7.1.4 in关键字

    语法格式:SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2…);
    in里面的每个数据都会作为一次条件,只要满足条件的就会显示
    具体操作:

  • 查询id是1或3或5的学生

    SELECT * FROM student3 WHERE id IN (1,3,5);
    

    day01-mysql - 图72

  • 查询id不是1或3或5的学生

    SELECT * FROM student3 WHERE id NOT IN (1,3,5);
    

    day01-mysql - 图73

    7.1.5 范围

    语法格式:SELECT * FROM 表名 WHERE 字段名 BETWEEN 值1 AND 值2

    between 值1 and 值2
    值1一定要小于值2
    比如: age BETWEEN 80 AND 100
    相当于: age>=80 && age<=100
    

    具体操作:

  • 查询english成绩大于等于75,且小于等于90的学生

    SELECT * FROM student3 WHERE english>=75 AND english<=90;
    SELECT * FROM student3 WHERE english BETWEEN 75 AND 90;
    

    day01-mysql - 图74

    7.1.6 like

    select * from 表名 where 字段 like 条件;
        %      : 模糊所有
      _   : 模糊一位
    例如:
      "马%"  匹配以"马"字开头
      "%马"  匹配以"马"字结尾
      "_马"  匹配第二个字是"马"字的 
      "__马%"  匹配第三个字是"马"字的
      "%马%"    匹配包含"马"字的
    

    具体操作:

  • 查询姓马的学生

    SELECT * FROM student3 WHERE NAME LIKE '马%';
    

    day01-mysql - 图75

  • 查询姓名中包含’德’字的学生

    SELECT * FROM student3 WHERE NAME LIKE '%德%';
    

    day01-mysql - 图76

  • 查询姓马,且姓名有三个字的学生

    SELECT * FROM student3 WHERE NAME LIKE '马__';
    

    day01-mysql - 图77

    7.2 排序

    通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)
    **语法: select from 表名 where 条件 order by 字段名称1 [desc | asc] , 字段名2 [desc | asc]… ;

    asc(默认) : 升序   
    desc : 降序
    先根据字段1排序,若有第二排序字段,在第一排序字段的基础上进行第二次排序
    

    7.2.1 单列排序

    单列排序就是使用一个字段排序
    具体操作:

  • 查询所有数据,使用年龄降序排序

    SELECT * FROM student3 ORDER BY age DESC;
    

    day01-mysql - 图78

    7.2.2 组合排序

    组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。
    上面的例子中,年龄是有相同的。当年龄相同再使用math进行排序
    SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
    具体操作:

  • 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序

    SELECT * FROM student3 ORDER BY age DESC, math DESC;
    

    day01-mysql - 图79

    7.3 聚合函数

    之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值
    五个聚合函数: ```sql count() : 计数 IFNULL(字段名,0) : 如果指定字段的值为null,则使用0表示 sum() : 求和 max() : 求最大值 min() : 求最小值 avg() : 求平均值 扩展-保留小数位 cast(avg(字段名称) as decimal(5,2))


聚合函数的使用:写在 SQL语句SELECT后查询结果的位置 SELECT 字段名… FROM 表名; SELECT COUNT(age) FROM 表名;

具体操作:

- 查询学生总数
```sql
SELECT COUNT(english) FROM student3;

day01-mysql - 图80
我们发现对于NULL的记录不会统计
IFNULL(expr1, expr2)的用法:假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为expr2, 我们可以利用IFNULL()函数,如果记录为NULL,给个默认值,这样统计的数据就不会遗漏

SELECT COUNT(IFNULL(english,0)) FROM student3;

day01-mysql - 图81

SELECT COUNT(*) FROM student3;

day01-mysql - 图82

  • 查询年龄大于40的总数

    SELECT COUNT(*) FROM student3 WHERE age>40;
    

    day01-mysql - 图83

  • 查询数学成绩总分

    SELECT SUM(math) FROM student3;
    

    day01-mysql - 图84

  • 查询数学成绩平均分

    SELECT AVG(math) FROM student3;
    

    day01-mysql - 图85

  • 查询数学成绩最高分

    SELECT MAX(math) FROM student3;
    

    day01-mysql - 图86

  • 查询数学成绩最低分

    SELECT MIN(math) FROM student3;
    

    day01-mysql - 图87

    7.4 分组

    分组查询是指使用 GROUP BY语句对查询信息进行分组,相同数据作为一组
    SELECT 字段1,字段2… FROM 表名 GROUP BY 分组字段 [HAVING 条件];
    GROUP BY怎么分组的?将分组字段结果中相同内容作为一组
    SELECT * FROM student3 GROUP BY sex;这句话会将sex相同的数据作为一组
    day01-mysql - 图88
    GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
    分组后聚合函数的作用?不是操作所有数据,而是操作一组数据。
    SELECT SUM(math), sex FROM student3 GROUP BY sex;
    效果如下:
    day01-mysql - 图89
    实际上是将每组的math进行求和,返回每组统计的结果
    day01-mysql - 图90
    注意事项:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的

  • 查询的时候没有查询出分组字段
    day01-mysql - 图91

  • 查询的时候查询出分组字段
    day01-mysql - 图92

具体操作:

  • 按性别分组

    SELECT sex FROM student3 GROUP BY sex;
    

    day01-mysql - 图93

  • 查询男女各多少人

    1.查询所有数据,按性别分组。 2.统计每组人数
    SELECT sex, COUNT(*) FROM student3 GROUP BY sex;
    

    day01-mysql - 图94

  • 查询年龄大于25岁的人,按性别分组,统计每组的人数

    1.先过滤掉年龄小于25岁的人。2.再分组。3.最后统计每组的人数
    SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex;
    

    day01-mysql - 图95

  • 查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据
    有很多同学可能会将SQL语句写出这样:
    SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex WHERE COUNT(*) >2;

    注意: 并只显示性别人数>2的数据属于分组后的条件,对于分组后的条件需要使用having子句

SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex HAVING COUNT(*) >2;

只有分组后人数大于2的男这组数据显示出来
day01-mysql - 图96

having与where的区别

  • having是在分组后对数据进行过滤.
  • where是在分组前对数据进行过滤
  • having后面可以使用聚合函数
  • where后面不可以使用聚合函数

7.5 limit语句

LIMIT限制的意思,所以LIMIT的作用就是限制查询记录的条数。
SELECT |字段列表 [as 别名] FROM 表名 [WHERE子句] [GROUP BY子句]\ [HAVING子句] [ORDER BY子句] [LIMIT子句];
思考:limit子句为什么排在最后?
因为前面所有的限制条件都处理完了,只剩下显示多少条记录的问题了!
*LIMIT语法格式

LIMIT offset,length; 或者limit length;
offset是指偏移量,可以认为是跳过的记录数量,默认为0
length是指需要显示的总记录数
具体操作:

  • 查询学生表中数据,从第三条开始显示,显示6条
    我们可以认为跳过前面2条,取6条数据
    SELECT * FROM student3 LIMIT 2,6;
    
    day01-mysql - 图97
    LIMIT的使用场景:分页
    比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。
    假设我们一每页显示5条记录的方式来分页,SQL语句如下:
    -- 每页显示5条
    -- 第一页: LIMIT 0,5;    跳过0条,显示5条
    -- 第二页: LIMIT 5,5;  跳过5条,显示5条
    -- 第三页: LIMIT 10,5; 跳过10条,显示5条
    SELECT * FROM student3 LIMIT 0,5;
    SELECT * FROM student3 LIMIT 5,5;
    SELECT * FROM student3 LIMIT 10,5;
    
    day01-mysql - 图98

    注意

    • 如果第一个参数是0可以简写:
      SELECT * FROM student3 LIMIT 0,5;
      SELECT * FROM student3 LIMIT 5;
    • LIMIT 10,5; — 不够5条,有多少显示多少