MYSQL
- 数据库的基本知识
- 数据库的安装
- MySQL目录结构
- 命令行客户端连接服务器
- 图形界面SQLyog客户端
- 服务器与数据库、表、记录的关系
- SQL语句的分类和语法
- DDL创建数据库(重要)
- DDL修改和删除数据库(重要)
- DDL创建表(重要)
- DDL查看表(重要)
- DDL删除表(重要)
- DDL修改表结构
- DML插入记录(重点)
- DOS命令窗口操作数据乱码问题
- DML更新表记录(重要)
- DML删除表记录(重要)
- 数据库约束的概述
- 主键约束(重要)
- 主键自增(重要)
- 唯一约束
- 非空约束
- 默认值
- DQL没有条件的简单查询(重要)
- 蠕虫复制
- DQL查询语句-条件查询(重要)
- 模糊查询like(重要)
- DQL查询语句-排序(重要)
- DQL查询语句-聚合函数(重要)
- DQL查询语句-分组(重要)
- DQL查询语句-limit语句(重要)
数据库的基本知识
什么是数据库
存储数据的仓库,本质也是一个文件
数据的存储方式
- 数据保存在内存
new出来的对象存储在堆中,堆是内存中的一小块空间int[] arr = new int[]{1, 2, 3, 4}; ArrayList<Integer>list = new ArrayList<Integer>(); list.add(1); list.add(2);
优点:内存速度快
缺点:断电/程序退出,数据就清除了,内存价格贵 - 数据保存在普通文件
优点:永久保存
缺点:查找,增加,修改,删除数据比较麻烦,效率低 - 数据保存在数据库
优点:永久保存,通过SQL语句比较方便的操作数据库,数据库是对大量的信息进行管理的高效的解决方案
常见数据库
Oracle:收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。
MYSQL:开源免费的数据库,小型的数据库,已经被Oracle收购了,MySQL6.x版本也开始收费。
DB2 :IBM公司的数据库产品,收费的。常应用在银行系统中。
SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
SyBase:已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。
SQLite: 嵌入式的小型数据库,应用在手机端。
常用数据库
MYSQL,Oracle
在web应用中,使用的最多的就是MySQL数据库,原因如下:
- 开源、免费
- 功能足够强大,足以应付web应用开发(最高支持千万级别的并发访问)
数据库的安装
安装过程:
-
文件复制的过程,解压文件到指定的目录下
-
服务器的配置
端口号是:3306管理员名字叫:root
可以远程访问:
MySQL目录结构
│-- bin:mysql相关的可执行文件*.exe
│-- MySQLInstanceConfig.exe mysql的配置程序
│-- data: mysql自带的数据库文件(不用关注)
│-- include: c语言的头文件(不用关注)
│-- lib: 存放mysql使用到的dll动态库(相当于jar包,不用关注)
│-- my.ini mysql的配置文件,配置了mysql的相关信息
命令行客户端连接服务器
打开和关闭mysql服务
DOS命令方式启动
启动MYSQL: net start mysql
停⽌止MYSQL: net stop mysql
登录mysql服务器
MySQL是一个需要账户名密码登录的数据库,登陆后使用,它提供了一个默认的root账号,使用安装时设置的密码即可登录
- 登录格式1:在DOS命令行:
mysql -u用户名 -p密码
例如:mysql -uroot -proot
后输入密码方式:
mysql -uroot -p回车
下一行输入密码
- 登录格式2:
mysql -hip地址 -u用户名 -p密码
例如:mysql -h127.0.0.1 -uroot -proot
- 退出MySQL:
exit
图形界面SQLyog客户端
SQLyog是业界著名的Webyog公司出品的一款简洁高效、功能强大的图形化MySQL数据库管理工具。使用SQLyog可以快速直观地让您从世界的任何角落通过网络来维护远端的MySQL数据库
- 双击
- 一直下一步,直到出现下面对话框
- 输入名称和秘钥
- 重启SQLyog即可
- 使用SQLyog登录数据库
服务器与数据库、表、记录的关系
关系型数据库的核心单元是表
SQL语句的分类和语法
什么是SQL
(Structured Query Language)结构化查询语言,简称SQL
SQL作用
通过SQL语句可以方便的操作数据库、表、数据。
SQL是数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但都有特有内容。
SQL语句分类
- DDL(Data Definition Language) 数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter等 - DML(Data Manipulation Language) 数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert,delete,update等 - DQL(Data Query Language) 数据查询语言
对数据库进行数据查询,关键字select - DCL(Data Control Language)数据控制语言(了解)
是用来设置或更改数据库用户或角色权限的语句,这个比较少用到
SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾。
- 可使用空格和缩进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
SELECT * FROM user;
- 3种注释
单行注释:-- 注释
多行注释:/*注释*/
MYSQL特有的单行注释:# 注释
DDL创建数据库(重要)
创建数据库
1.直接创建数据库
CREATE DATABASE 数据库名;
2.判断是否存在并创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名;
3.创建数据库并指定字符集(编码表)
CREATE DATABASE 数据名 DEFAULT CHARACTER SET 字符集;
4.具体操作:
- 直接创建数据库db1
CREATE DATABASE db1;
- 判断是否存在并创建数据库db2
CREATE DATABASE IF NOT EXISTS db2;
- 创建数据库db3并指定字符集为gbk
CREATE DATABASE db2 CHARACTER SET gbk;
查看数据库
1.查看所有的数据库
SHOW DATABASES;
2.查看某个数据库的定义信息
SHOW CREATE DATABASE 数据名;
DDL修改和删除数据库(重要)
修改数据库字符集
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;
具体操作:
- 将db3数据库的字符集改成utf8
ALTER DATABASE db3 DEFAULT CHARACTER SET utf8;
删除数据库
DROP DATBASE 数据库名;
具体操作:
- 删除db2数据库
DROP DATABASE db2;
DDL使用数据库
1.查看正在使用的数据库
SELECT DATABASE();
2.使用/切换数据库
USE 数据库名;
具体操作:
- 查看正在使用的数据库
SELECT DATABASE();
- 使用db1数据库
USE db1;
DDL创建表(重要)
前提先使用某个数据库(db1)
创建表
CREATE TABLE 表名 (字段名1 字段类型1, 字段名2 字段类型2);
建议写成如下格式:
CREATE TABLE 表名 (
字段名1 字段类型1,
字段名2 字段类型2
);
MySQL数据类型
MySQL中的常使用的数据类型如下:
详细的数据类型如下
具体操作:
创建student表包含id、name、birthday字段
CREATE TABLE student (
id INT,
name VARCHAR(20),
birthday DATE
);
DDL查看表(重要)
1.查看某个数据库中的所有表
SHOW TABLES;
2.查看表结构
DESC 表名;
3.查看创建表的SQL语句
SHOW CREATE TABLE 表名;
具体操作:
- 查看mysql数据库中的所有表
SHOW TABLES;
- 查看student表的结构
DESC student;
- 查看student的创建表SQL语句
SHOW CREATE TABLE student;
DDL删除表(重要)
快速创建一个表结构相同的表
CREATE TABLE 表名 LIKE 其他表;
具体操作:
- 创建s1表,s1表结构和student表结构相同
CREATE TABLE s1 LIKE student;
删除表
1.直接删除表
DROP TABLE 表名;
2.判断表是否存在并删除表
DROP TABLE IF EXISTS 表名;
具体操作:
- 直接删除表s1表
DROP TABLE s1;
- 判断表是否存在并删除s1表
DROP TABLE IF EXISTS s1;
DDL修改表结构
所有的修改表结构的语句都是: ALTER TABLE 表名 XXX;
修改表结构使用不是很频繁,只需要了解,等需要使用的时候再回来查即可
1.添加表一列
ALTER TABLE 表名 ADD 字段名 字段类型;
具体操作:
- 为学生表添加一个新的字段remark,类型为varchar(20)
ALTER TABLE student ADD remark VARCHAR(20);
2.修改字段类型
ALTER TABLE 表名 MODIFY 字段名 新类型;
具体操作:
- 将student表中的remark字段的改成varchar(100)
ALTER TABLE student MODIFY remark VARCHAR(100);
3.修改字段名
ALTER TABLE 表名 CHANGE 老字段名 新字段名 类型;
具体操作:
-
将student表中的remark字段名改成intro,类型varchar(30)
ALTER TABLE student CHANGE remark intro varchar(30);
4.删除字段
ALTER TABLE 表名 DROP 字段名;
具体操作:
-
删除student表中的字段intro
ALTER TABLE student DROP intro;
5.修改表名
RENAME TABLE 表名 TO 新表名;
具体操作:
-
将学生表student改名成student2,再删除student2表
RENAME TABLE student TO student2; DROP TABLE student2;
6.修改表的字符集
ALTER TABLE 表名 DEFAULT CHARACTER SET 新字符集;
具体操作:
-
将student2表的编码修改成gbk
ALTER TABLE student2 character set gbk;
DML插入记录(重点)
DML是对表中的数据进行增删改
创建student表包含id,name,birthday,sex,address字段。
CREATE TABLE student (
id INT,
name VARCHAR(20),
birthday DATE,
sex char(2),
address varchar(50)
);
插入全部字段
-
所有的字段名都写出来
INSERT INTO 表名 (字段名1, 字段名2, 字段名3, ...) VALUES (值1, 值2, 值3, ...);
-
不写字段名
INSERT INTO 表名 VALUES (值1, 值2, 值3, ...);
插入部分数据
只需要指定要插入数据的字段
INSERT INTO 表名 (字段名1, 字段名2...) VALUES (字段值1, 字段值2);
没有添加数据的字段会使用NULL
1.具体操作:
- 插入部分数据,往学生表中添加 id, name, age, sex数据
INSERT INTO student (id, NAME, age, sex) VALUES (1, '张三', 20, '男');
-
向表中插入所有字段
- 所有的字段名都写出来
INSERT INTO student (NAME, id, age, sex, address) VALUES ('李四', 2, 23, '女', '广州');
- 不写字段名
INSERT INTO student VALUES (3, '王五', 18, '男', '北京');
注意
- 值与字段必须对应,个数相同,类型相同
- 值的数据大小必须在字段的长度范围内
- 除了数值类型外,其它的字段类型的值必须使用引号引起。(建议单引号)
- 如果要插入空值,可以不写字段,或者插入null
DOS命令窗口操作数据乱码问题
当我们使用DOS命令行进行SQL语句操作如有有中文会出现乱码,导致SQL执行失败
错误原因:因为MySQL的客户端设置编码是utf8,而系统的DOS命令行编码是gbk,编码不一致导致的乱码
解决方案:
- 快捷设置
在DOS命令行输入: set names gbk;
注意:以上方式为临时方案,退出DOS命令行就失效了,需要每次都配置
- 修改MySQL安装目录下的my.ini文件,重启服务所有地方生效。此方案将所有编码都修改了[不建议]
DML更新表记录(重要)
1.不带条件修改数据
UPDATE 表名 SET 字段名=字段值;
2.带条件修改数据
UPDATE 表名 SET 字段名=字段值 WHERE 条件;
3.具体操作:
-
不带条件修改数据,将所有的性别改成女
UPDATE student SET sex='女';
-
带条件修改数据,将id号为2的学生性别改成男
UPDATE student SET sex='男' WHERE id=2;
-
一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京
UPDATE student SET age=26, address='北京' WHERE id=3;
DML删除表记录(重要)
1.带条件删除数据
DELETE FROM 表名 WHERE 条件;
2.不带条件删除数据
DELETE FROM 表名;
3.具体操作:
-
带条件删除数据,删除id为3的记录
DELETE FROM student WHERE id=3;
-
不带条件删除数据,删除表中的所有数据
DELETE FROM student;
数据库约束的概述
数据库约束的作用
对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。
约束种类
PRIMARY KEY
: 主键约束UNIQUE
: 唯一约束NOT NULL
: 非空约束DEFAULT
: 默认约束FOREIGN KEY
: 外键约束
主键约束(重要)
为什么需要主键约束
有些记录的 name、age、score 字段的值都一样时,那么就没法区分这些数据,造成数据库的记录不唯一,这样就不方便管理数据。
每张表都应该有一个主键,并且每张表只能有一个主键。
主键的作用
通过主键可以区分数据。
哪个字段作为表的主键
通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。
创建主键
主键:PRIMARY KEY
主键的特点:
- 主键必须包含唯一的值
- 主键不能包含NULL值
创建主键方式
-
在创建表的时候给字段添加主键
CREATE TABLE 表名 ( 字段名 字段类型 PRIMARY KEY, 字段名 字段类型 );
-
在已有表中添加主键(不常用)
ALTER TABLE 表名 ADD PRIMARY KEY (字段名);
具体操作:
- 创建表学生表st5, 包含字段(id, name, age)将id做为主键
CREATE TABLE st5 (
id INT PRIMARY KEY, -- id是主键
NAME VARCHAR(20),
age INT
);
- 添加数据
INSERT INTO st5 (id, NAME) VALUES (1, '小明');
INSERT INTO st5 (id, NAME) VALUES (2, '小红');
INSERT INTO st5 (id, NAME) VALUES (3, '小白');
INSERT INTO st5 (id, NAME) VALUES (4, '小黑');
- 插入重复的主键值
-- 主键是唯一的不能重复:Duplicate entry '1' for key 'PRIMARY'
INSERT INTO st5 (id, NAME) VALUES (1, '小黑2');
- 插入NULL的主键值
-- 主键是不能为空的:Column 'id' cannot be null
INSERT INTO st5 (id, NAME) VALUES (NULL, '小黑3');
删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;
具体操作:
- 删除st5表的主键
ALTER TABLE st5 DROP PRIMARY KEY;
主键自增(重要)
主键让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值
字段名 字段类型 PRIMARY KEY AUTO_INCREMENT
AUTO_INCREMENT
表示自动增长(字段类型必须是数值类型)
具体操作:
- 创建学生表st6, 包含字段(id, name, age)将id做为主键并自动增长
CREATE TABLE st6 (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT
);
- 插入数据
-- 主键默认从1开始自动增长
INSERT INTO st6 (NAME, age) VALUES ('小明', 22);
INSERT INTO st6 (NAME, age) VALUES ('小红', 26);
INSERT INTO st6 (NAME, age) VALUES ('小张', 25);
INSERT INTO st6 (NAME, age) VALUES ('小艾', 20);
默认地AUTO_INCREMENT 的开始值是1,如果希望修改起始值,请使用下列SQL语法
ALTER TABLE st6 AUTO_INCREMENT = 10000;
DELETE和TRUNCATE的区别
- DELETE 删除表中的数据,但不重置AUTO_INCREMENT的值。
- TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1。
唯一约束
唯一约束的作用
让字段的值唯一,不能重复
唯一约束的格式
CREATE TABLE 表名 (
字段名 字段类型 UNIQUE,
字段名 字段类型
);
具体步骤:
- 创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生
CREATE TABLE st7 (
id INT,
NAME VARCHAR(20) UNIQUE
);
- 添加一些学生
INSERT INTO st7 VALUES (1, '小明');
INSERT INTO st7 VALUES (2, '小红');
INSERT INTO st7 VALUES (3, '小张');
INSERT INTO st7 VALUES (4, '小艾');
-- 插入相同的名字出现name重复: Duplicate entry '小明' for key 'name'
INSERT INTO st7 VALUES (5, '小明');
-- 出现多个null的时候会怎样?因为null是没有值,所以不存在重复的问题
INSERT INTO st3 VALUES (5, NULL);
INSERT INTO st3 VALUES (6, NULL);
非空约束
非空约束的作用
让这个字段的值不能为空
非空约束的语法格式
CREATE TABLE 表名 (
字段名 字段类型 NOT NULL,
字段名 字段类型
);
具体操作:
- 创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL
CREATE TABLE st8 (
id INT,
NAME VARCHAR(20) NOT NULL,
gender CHAR(2)
);
- 添加一些完整的记录
INSERT INTO st8 VALUES (1, '小明', '男');
INSERT INTO st8 VALUES (2, '小张', '男');
INSERT INTO st8 VALUES (3, '小白', '男');
INSERT INTO st8 VALUES (4, '小刚', '男');
-- 姓名不赋值出现姓名不能为null: Column 'name' cannot be null
INSERT INTO st8 VALUES (5, NULL, '男');
默认值
默认值的作用
如果这个字段不设置值,就使用默认值。
默认值格式
CREATE TABLE 表名 (
字段名 字段类型 DEFAULT 值,
字段名 字段类型
);
具体步骤:
- 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州
CREATE TABLE st9 (
id INT,
NAME VARCHAR(20),
address VARCHAR(50) DEFAULT '广州'
);
- 添加一条记录,使用默认地址
INSERT INTO st9 (id, NAME) VALUES (1, '小明');
- 添加一条记录,不使用默认地址
INSERT INTO st9 VALUES (2, '小天', '北京');
DQL没有条件的简单查询(重要)
注意:查询不会对数据库中的数据进行修改,只是一种显示数据的方式。
查询表中所有列数据
1.写出查询每列的名称
SELECT 字段名1, 字段名2, 字段名3 FROM 表名;
具体操作:
SELECT id, NAME ,age, sex, address FROM student;
2.使用*表示所有列
SELECT * FROM 表名;
具体操作:
SELECT * FROM student;
查询student表中的name 和 age 列
SELECT NAME, age FROM student;
别名查询
1.查询时给列、表指定别名需要使用AS关键字
2.使用别名的好处是方便观看和处理查询到的数据
SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名 AS 表别名;
注意
查询给表取别名目前还看不到效果,需要到多表查询的时候才能体现出好处
AS关键字可以省略
3.具体操作:
- 查询sudent表中name 和 age 列,name列的别名为”姓名”,age列的别名为”年龄”
SELECT NAME AS 姓名, age AS 年龄 FROM student;
清除重复值
1.查询指定列并且结果不出现重复数据
SELECT DISTINCT 字段名 FROM 表名;
2.具体操作:
- 查询address列并且结果不出现重复的address
SELECT DISTINCT address 城市 FROM student;
查询结果参与运算
1.某列数据和固定值运算
SELECT 字段名 + 值 FROM 表名;
2.某列数据和其他列数据参与运算
SELECT 字段1 + 字段2 FROM 表名;
注意: 参与运算的必须是数值类型
3.需求:
- 添加数学,英语成绩列,给每条记录添加对应的数学和英语成绩
- 查询的时候将数学和英语的成绩相加
4.实现:
-
修改student表结构,添加数学和英语成绩列
ALTER TABLE student ADD math INT; ALTER TABLE student ADD english INT;
-
给每条记录添加对应的数学和英语成绩
-
查询math + english的和
SELECT math + english FROM student;
结果确实将每条记录的math和english相加,但是效果不好看
-
查询math + english的和使用别名”总成绩”
SELECT math + english 总成绩 FROM student;
-
查询所有列与math + english的和并使用别名”总成绩”
SELECT *, math + english 总成绩 FROM student;
-
查询姓名、年龄,将每个人的数学增加10分
SELECT name, math + 10 FROM student;
蠕虫复制
什么是蠕虫复制:将一张表的数据复制,插入到另一张表中
语法格式:
INSERT INTO 表名1 SELECT * FROM 表名2;
作用:将表名2
中的数据复制到表名1
中
具体操作:
- 创建student2表,student2结构和student表结构一样
CREATE TABLE student2 LIKE student;
- 将student表中的数据添加到student2表中
INSERT INTO student2 SELECT * FROM student;
注意:如果只想复制student表中name,age字段数据到student2表中使用如下格式
INSERT INTO student2(NAME, age) SELECT NAME, age FROM student;
DQL查询语句-条件查询(重要)
语法格式:
SELECT * FROM 表名 WHERE 条件;
流程:取出表中满足条件的记录
准备数据
CREATE TABLE student3 (
id int,
name varchar(20),
age int,
sex varchar(5),
address varchar(100),
math int,
english int
);
比较运算符
>
大于
<
小于
<=
小于等于
>=
大于等于
=
等于
<>
、!=
不等于
具体操作:
- 查询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;
逻辑运算符
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 i d=5;
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);
范围
SELECT * FROM 表名 WHERE 字段名 BETWEEN 值1 AND 值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;
模糊查询like(重要)
LIKE
像什么什么一样
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
满足通配符字符串
规则的数据就会显示出来
MySQL通配符有两个:
%
: 表示任意多个字符
_
: 表示一个字符
具体操作:
- 查询姓张的学生
SELECT * FROM student3 WHERE NAME LIKE '张%';
- 查询姓名中包含’德’字的学生
SELECT * FROM student3 WHERE NAME LIKE '%德%';
- 查询姓张,且姓名有三个字的学生
SELECT * FROM student3 WHERE NAME LIKE '张__';
DQL查询语句-排序(重要)
通过ORDER BY
子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)
SELECT * FROM 表名 ORDER BY 字段名 ASC|DESC;
ASC: 升序
DESC: 降序
单列排序
单列排序就是使用一个字段排序
具体操作:
- 查询所有数据,使用年龄降序排序
select * FROM student3 order by age DESC;
组合排序
组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。
上面的例子中,年龄是有相同的。当年龄相同再使用math进行排序
SELECT * FROM 表名 WHERE 条件 ORDER BY 字段名 [ASC|DESC], 字段名 [ASC|DESC];
具体操作:
- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * FROM student3 ORDER BY age DESC, math DESC;
DQL查询语句-聚合函数(重要)
上面做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值NULL。
五个聚合函数:
count
: 统计指定列记录数,记录为NULL的不统计
sum
: 计算指定列的数值和,如果不是数值类型,那么计算结果为0
max
: 计算指定列的最大值
min
: 计算指定列的最小值
avg
: 计算指定列的平均值 average
聚合函数的使用:写在 SQL语句SELECT
后 字段名
的地方
SELECT 字段名, 字段名 FROM 表名;
SELECT 聚合函数(), 字段名 FROM 表名;
具体操作:
- 查询学生总数
SELECT COUNT(english) FROM student3;
发现对于NULL的记录不会统计
统计数量常用:
SELECT COUNT(*) FROM student3;
- 查询年龄大于40的总数
SELECT COUNT(*) FROM student3 WHERE age>40;
- 查询数学成绩总分
SELECT SUM(math) FROM student3;
- 查询数学成绩最高分
SELECT MAX(math) FROM student3;
- 查询数学成绩最低分
SELECT MIN(math) FROM student3;
- 查询数学成绩平均分
SELECT AVG(math) FROM student3;
DQL查询语句-分组(重要)
分组查询是指使用 GROUP BY
语句对查询信息进行分组
SELECT * FROM 表名 GROUP BY 字段名;
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后面不可以使用聚合函数
DQL查询语句-limit语句(重要)
LIMIT
是限制
的意思,所以LIMIT
的作用就是限制查询记录的条数。
LIMIT语句格式:
SELECT * FROM 表名 LIMIT offset, length;
offset
是指偏移量,可以认为是跳过的记录数量,不写则默认为0。
length
是指需要显示的总记录数
具体步骤:
- 查询学生表中数据,跳过前面2条,显示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条,有多少显示多少