学习目标
- 能够掌握数据库的概念和作用
- 能够参考文档完成mysql的安装与配置
- 能够了解sql的作用与分类
- 能够掌握DDL的建库、建表语句
- 能够掌握DML的增、删、改语句
- 能够掌握DQL的基本查询语句
- 能够使用where完成相关的条件查询
- 能够使用SQL语句进行排序
- 能够使用聚合函数
- 能够使用SQL语句进行分组查询
第一章 数据库介绍
1.1 什么是数据库
存储数据的仓库. 其本质是一个文件系统,数据库按照特定的格式将数据存储到文件中,使用者可以对数据库中的数据进行增加,修改,删除及查询操作。
1.2 常用数据存储方式
| 存储位置 | 优点 | 缺点 | | —- | —- | —- | | 内存
例如: 集合,实体类对象数据是放在内存中 | 存取速度很快 | 不能永久的保存,程序停止时,内存释放数据消失 | | 文件
例如: IO流,把数据存在文件中 | 可以永久操作数据 | 每种不同类型的文件都有自己存放数据的格式,数据的管理和维护不方便 | | 数据库 | 数据库按照特定的格式将数据存储起来,通过SQL或命令可以方便的对大量数据进行增、删、改、查操作。 | 数据库通常是要花钱的 |
1.3 数据库管理系统
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问和操作数据库中表内的数据
1.4 数据库管理系统、数据库和表的关系
数据库管理程序(DBMS)可以管理多个数据库,一般开发人员会针对每一个项目创建一个数据库。为保存项目中实体的数据,一般会在数据库创建与实体对应的表,以保存程序中实体的数据。数据库管理系统、数据库和表的关系如图所示:
先有数据库管理系统 → 再有数据库 → 再有表 → 再有数据
数据库管理系统可以管理多个数据库
一个数据库可以管理多张表
一张表可以包含多条记录
1.5 实体类与表记录的对应关系
1.6 常见的数据库有哪些
全球数据库使用排行榜: https://db-engines.com/en/ranking
下图采集与2020年5月
数据库名称 | 描述 |
---|---|
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 服务器软件下载地址
https://dev.mysql.com/downloads/installer/
2.1.2 Mysql服务器端软件卸载
卸载方式1-第三方工具写在(推荐)
使用自己电脑上的电脑管家,或360等,这些第三方软件会自动删除系统注册表中的相关文件
卸载方式2-控制面板卸载
1.控制面板 —> 所有控制面板项 —> 程序和功能,选择mysql server右击 —> 卸载!
2.找到对应的安装目录,将安装目录下的配置删除.
3.搜索regedit —> 打开注册表
4.找到HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\EventLog\Application\MySQL目录,右击删除Mysql目录即可
5.删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL文件夹和
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL的文件夹如果没有可以不用删除了
2.1.3 Mysql服务器端软件安装
安装步骤
- 复制数据库服务器文件
- 配置数据库服务器
安装过程
- 打开MySQL的安装包,双击运行:mysql-installer-community-5.6.22.0.msi
- 选择安装模式
- Developer Default:开发者默认模式
- Server only:只安装服务器模式
- Client only:只安装客户端模式
- Full:全部安装模式
- Custom:自定义安装模式
我们选择Custom模式,点击“Next”继续
- Developer Default:开发者默认模式
- MySQL版本选择
- 如果电脑是64位系统,就选择64位服务器
- 如果电脑是32位系统,就选择32位服务器
- 如果电脑是64位系统,就选择64位服务器
- 安装目录
可以选择MySQL的服务器安装目录和数据安装目录,我这里是均选择安装到默认目录
2.2 配置过程
- 服务器安装完成,开始配置MySQL
- 端口配置
MySQL服务器端口号是3306,默认即可
- 设置数据库root用户的密码
学习阶段建议密码设置为root,方便记忆
- 配置MySQL为Windows的一个服务
- 设置MySQL的日志名称
- 出现下面8个对勾,表示服务器配置完成
- 点击“Finish”,完成MySQL的安装
- 配置环境变量
把MySQL安装目录下的bin目录,添加到Path环境变量中 -
2.2 启动Mysql服务器
方式1: windows服务方式启动
此电脑右击 —> 管理
找到对应的服务,我们安装Mysql时,服务名称叫做 MySQL56,直接右击或在左测控制当前服务的状态方式2:DOS命令方式启动
win + r快捷键打开运行框,输入cmd,打开DOS命令窗口
启动服务的命令: net start mysql56
停止服务的命令: net stop mysql2.3 DOS连接Mysql
将DOS命令窗口当做Mysql的客户端连接并操作Mysql数据库:
登录命令:
mysql -u用户名 -p密码
mysql -u用户名 -p
密码
mysql -h主机地址 -u用户名 -p密码
mysql -h主机地址 -u用户名 -p
密码
登录的方式有很多种,使用任意一种即可.
用户名(根用户): root
密码(根密码): root
2.4 SQLyog连接Mysql
SQLyog概述
SQLyog 是业界著名的 Webyog 公司出品的一款简洁高效、功能强大的图形化 MySQL 数据库管理工具。使用SQLyog 可以快速直观地让您从世界的任何角落通过网络来操作远端的 MySQL 数据库。
SQLyog与数据库的关系
操作方式
第三章 SQL概述
3.1 什么是SQL
结构化查询语言(Structured Query Language)简称SQL,SQL语句就是对数据库进行操作的一种语言。
3.2 SQL作用
通过SQL语句我们可以方便的操作数据库管理系统中的数据库、表和表中的数据了。 SQL是数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但都有特有内容。
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通用语法
- SQL语句可以单行或多行书写,以分号结尾。
- 可使用空格和缩进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写。
- 3种注释 | 注释的语法 | 说明 | | —- | —- | | —空格 | 单行注释,通用的注释 | | # | 单行注释,只有mysql中可以使用 | | / / | 多行注释, |
第四章 基础SQL-DDL语句
4.1 DDL操作数据库
4.1.1 创建数据库
- 直接创建数据库
CREATE DATABASE 数据库名; - 判断是否存在并创建数据库(了解)
CREATE DATABASE IF NOT EXISTS 数据库名; - 创建数据库并指定字符集(了解)
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
具体操作:
-- 需求: 创建名称为db1的数据库
create database db1;
-- 需求: 当db2数据库不存在是创建名称为db2数据库
create database if not exists db2;
-- 需求: 创建名称为db3数据库,并指定字符集为gbk
create database db3 character set gbk;
4.1.2 查看数据库
- 查看所有的数据库
SHOW DATABASES; - 查看某个数据库的定义信息
SHOW CREATE DATABASE 数据库名;
具体操作:
-- 需求:查询Mysql数据管理系统中所有的数据库
show databases;
-- 需求:查询db3数据库的建库语句
show create database db3;
4.1.3 修改数据库(了解)
- 修改数据库字符集格式
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;
具体操作:
-- 需求:将db3数据库的字符集改成utf8
alter database db3 default character set utf8;
-- 注意:utf8没有中间的横杠
4.1.4 删除数据库
DROP DATABASE 数据库名;
具体操作:
-- 从数据库管理系统中删除名称为db2的数据库
drop database db2;
4.1.5 使用数据库
- 查看正在使用的数据库
SELECT DATABASE(); - 使用/切换数据库
USE 数据库名;
具体操作:
-- 查看正在使用的数据库
select database();
-- 使用db1数据库
use db1;
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;
示例图:
常使用的数据类型如下:
数据类型 | 关键字 |
---|---|
整型 | int或integer |
浮点型 | double, float decimal(5,2) 整个小数长5位,小数位占2位 |
字符串型 | char定长:char(2) 最长存储2个字符,无论有没有使用2个,都是占用2个。 varchar可变长:如:varchar(100),最长可以保存100个字符 如果只使用了3个,占3个字符的空间。 |
日期类型 | date或time,datetime |
4.2.2 查看表
- 查看某个数据库中的所有表
SHOW TABLES; - 查看表结构
DESC 表名; - 查看创建表的SQL语句
SHOW CREATE TABLE 表名;
具体操作:
-- 需求:查看mysql数据库中的所有表
show tables;
-- 需求:查看student表的结构
desc student;
-- 需求:查看student表的建表语句
show create table student;
4.2.3 修改表结构(了解)
修改表结构使用不是很频繁,只需要知道下,等需要使用的时候再回来查即可
添加表列
ALTER TABLE 表名 ADD 列名 类型;-- 需求:为student表添加一个新的字段nianling,类型为varchar(2) alter table student add nianling varchar(2);
修改列类型
ALTER TABLE 表名 MODIFY 列名 新的类型;-- 需求:将student表中的nianling字段的类型改为int(11) alter table student modify nianling int(11);
修改列名
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;-- 需求:将student表中的nianling字段名改成age,类型int(2) alter table student change nianling age int(2);
- 删除列
ALTER TABLE 表名 DROP 列名;
-- 需求:将student表中的age字段从表中删除
alter table student drop age;
- 修改表名
RENAME TABLE 表名 TO 新表名;
-- 需求:将student表名称改为stu
rename table student to stu;
修改字符集
ALTER TABLE 表名 character set 字符集;-- 需求:将stu表的字符集修改为gbk, 再将其修改回来 alter table stu character set gbk; alter table stu character set utf8;
-
4.2.4 删除表
直接删除表
DROP TABLE 表名;- 判断表是否存在并删除表(了解)
DROP TABLE IF EXISTS 表名;
具体操作:
-- 需求:直接删除student2表
drop table student2;
-- 需求:判断表是否存在,若存在则删除表
drop table if exists student2;
第五章 基础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
- 关键字说明 INSERT INTO 表名 //表示往哪张表中添加数据 (字段名1, 字段名2, …) //要给哪些字段设置值 VALUES (值1, 值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('柳岩','女');
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;
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;
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;
第六章 基础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;
6.1.2 查询指定列
select 字段名1,字段名2... from 表名;
-- 需求:查询商品名和商品价格. SELECT pname,price FROM product;
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;
6.1.4 去重复查询
select distinct 字段名 from 表名;
-- 需求:查看商品表中有那些价格. SELECT DISTINCT price FROM product;
6.1.5 查询结果参与运算
select 列名1 + 固定值 from 表名;
-- 需求:将所有商品的价格+10元进行显示. (查询结果可参与运算) SELECT *,IFNULL(price,0)+10 FROM product;
第七章 基础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;
查询english分数小于或等于80分的学生
SELECT * FROM student3 WHERE english<=80;
查询age等于20岁的学生
SELECT * FROM student3 WHERE age=20;
查询age不等于20岁的学生
SELECT * FROM student3 WHERE age!=20; SELECT * FROM student3 WHERE age<>20;
7.1.3 逻辑运算符
and(&&) 多个条件同时满足 or(||) 多个条件其中一个满足 not(!) 不满足
具体操作:
查询age大于35且性别为男的学生(两个条件同时满足)
SELECT * FROM student3 WHERE age>35 AND sex='男';
查询age大于35或性别为男的学生(两个条件其中一个满足)
SELECT * FROM student333 WHERE age>35 OR sex='男';
查询id是1或3或5的学生
SELECT * FROM student3 WHERE id=1 OR id=3 OR id=5;
7.1.4 in关键字
语法格式:SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2…);
in里面的每个数据都会作为一次条件,只要满足条件的就会显示
具体操作:查询id是1或3或5的学生
SELECT * FROM student3 WHERE id IN (1,3,5);
查询id不是1或3或5的学生
SELECT * FROM student3 WHERE id NOT IN (1,3,5);
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;
7.1.6 like
select * from 表名 where 字段 like 条件; % : 模糊所有 _ : 模糊一位 例如: "马%" 匹配以"马"字开头 "%马" 匹配以"马"字结尾 "_马" 匹配第二个字是"马"字的 "__马%" 匹配第三个字是"马"字的 "%马%" 匹配包含"马"字的
具体操作:
查询姓马的学生
SELECT * FROM student3 WHERE NAME LIKE '马%';
查询姓名中包含’德’字的学生
SELECT * FROM student3 WHERE NAME LIKE '%德%';
查询姓马,且姓名有三个字的学生
SELECT * FROM student3 WHERE NAME LIKE '马__';
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;
7.2.2 组合排序
组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。
上面的例子中,年龄是有相同的。当年龄相同再使用math进行排序
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
具体操作:查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * FROM student3 ORDER BY age DESC, math DESC;
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;
我们发现对于NULL的记录不会统计
IFNULL(expr1, expr2)的用法:假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为expr2, 我们可以利用IFNULL()函数,如果记录为NULL,给个默认值,这样统计的数据就不会遗漏
SELECT COUNT(IFNULL(english,0)) FROM student3;
SELECT COUNT(*) FROM student3;
查询年龄大于40的总数
SELECT COUNT(*) FROM student3 WHERE age>40;
查询数学成绩总分
SELECT SUM(math) FROM student3;
查询数学成绩平均分
SELECT AVG(math) FROM student3;
查询数学成绩最高分
SELECT MAX(math) FROM student3;
查询数学成绩最低分
SELECT MIN(math) FROM student3;
7.4 分组
分组查询是指使用 GROUP BY语句对查询信息进行分组,相同数据作为一组
SELECT 字段1,字段2… FROM 表名 GROUP BY 分组字段 [HAVING 条件];
GROUP BY怎么分组的?将分组字段结果中相同内容作为一组
SELECT * FROM student3 GROUP BY sex;这句话会将sex相同的数据作为一组GROUP BY
将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
分组后聚合函数的作用?不是操作所有数据,而是操作一组数据。
SELECT SUM(math), sex FROM student3 GROUP BY sex;
效果如下:
实际上是将每组的math进行求和,返回每组统计的结果
注意事项:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的查询的时候没有查询出分组字段
- 查询的时候查询出分组字段
具体操作:
按性别分组
SELECT sex FROM student3 GROUP BY sex;
查询男女各多少人
1.查询所有数据,按性别分组。 2.统计每组人数 SELECT sex, COUNT(*) FROM student3 GROUP BY sex;
查询年龄大于25岁的人,按性别分组,统计每组的人数
1.先过滤掉年龄小于25岁的人。2.再分组。3.最后统计每组的人数 SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex;
查询年龄大于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的男这组数据显示出来
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
是指偏移量,可以认为是跳过的记录数量,默认为0length
是指需要显示的总记录数
具体操作:
- 查询学生表中数据,从第三条开始显示,显示6条
我们可以认为跳过前面2条,取6条数据 SELECT * FROM student3 LIMIT 2,6;
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;
注意:
- 如果第一个参数是0可以简写:
SELECT * FROM student3 LIMIT 0,5;
SELECT * FROM student3 LIMIT 5;
- LIMIT 10,5; — 不够5条,有多少显示多少
- 如果第一个参数是0可以简写: