day01-MySQL基础
今日内容
MySQL
概念- 基本环境工具安装
MySQL
下载安装及基本配置Navicat
下载安装及基本配置
SQL
语法- DDL-数据库CRUD操作
- DDL-数据表CRUD操作
- DML-数据记录CUD操作
- DQL-数据记录查询操作
0. 课程导入
JavaWeb
相关技术可用于法网站开发,网站开发主要分为三部分:
网页:展示数据
后台程序:逻辑处理,
JavaWeb
的主要工作数据库:存储和管理数据
以往数据存储位置(数据集合/txt文件)及其特点:
- 内存:操作快,但是不安全
- 文件:相对安全;在并发环境下数据可以不准确;每次读写基本上都要把文件内容全部加载到内存,IO性能会非常差。
上述两种情况,都不适合做数据稳定安全的大量存储。
数据库可以克服上述缺点完成数据存储。
1. 数据库相关概念
1.1 数据库
数据库
数据库:能够高效的持久化存储和管理海量数据的仓库。
MySQL
是关系型数据库。数据库英文名是
DataBase
,简称DB
。数据库的分类:
- 关系型数据库。传统的数据库,
Oracle
、MySQL
、SQLServer
、DB2
,数据(表与表)之间有关联。 - 非关系型数据库。新型的内存数据库,
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 Server
:MicroSoft
微软 公司收费的中型的数据库。C#、.net
等语言常使用PostgreSQL
:开源免费中小型的数据库DB2
:IBM
公司的大型收费数据库产品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)]
使用细节
图中红色加粗的为常用的数据类型
DOUBLE
和FlOAT
分别表示单双精度浮点型- 只能进行非精确运算,能表示的范围较小.不适用财务、高速、航天等领域
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-添加记录
注意
- 添加的数据的个数和类型,一定要和列/字段的数量、类型保持一致。
- 除数字外,其他类型的值要使用引号包裹(建议单引号,可以双引号)
- 列名如果是关键字,要使用反引号``包裹
添加记录工作中用法
为了可读性、兼容性、健壮性等考虑,建议使用指定列添加数据的方式。
- 冗余字段可以排除
- 后期添加的资源不会对之前的数据
SQL
产生影响
数据库字段设计思路
- 设计之初就预留好冗余字段,当前可以没用,之后如果有需要可以被征用。推荐第一种
- 设计之初不预留冗余字段,以后业务需要的时候,添加额外的字段。
不管使用哪种设计方式,在做增删改查的时候,如果需要尽量指定列,而非操作所有的 数据列。
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分页限定
按照上面关键词出现的情况不同(最根本原因是根据查询的需求不同),查询可以分为如下几类:
- 基本查询
- 条件查询(
WHERE
) - 分组查询(
GROUP BY
) - 排序查询(
ORDER BY
) - 分页查询(
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
WHERE
和HAVING
区别执行时机不一样:
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
WHERE
和HAVING
区别执行时机不一样:
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基础相关推荐
- Mysql基础学习Day01
Mysql基础学习Day01 1.SQL语言的分类 2.注释 3.基本的select语句 4.显示表结构 5.过滤数据 突然发现java基础内容学的差不多了 就又开一个mysql基础学习 1.SQL语 ...
- mysql基础之视图
原文:mysql基础之视图 在查询中,我们经常把查询结果 当成临时表来看. View是什么? View可以看一张虚拟表. 是表通过某种运算得到的一个投影. 既然视图只是表的某种查询的投影,所以主要步骤 ...
- MySQL基础day03_数据的导入、导出-MySQL 5.6
MySQL基础day03_数据的导入.导出-MySQL 5.6 注:把数据按照一定格式存放到文件里才能进行数据的导入. 1,数据导入的条件 把文件里的内容保存到数据的表里: 把数据按照一定格式存放文件 ...
- MySQL基础篇:子查询
文章目录 概述 where型子查询 from型子查询 EXISTS型子查询 复制表子查询 概述 在某些情况下,当进行一个查询时,需要的条件或数据要用另一个select语句的结果,这个时候,就要用到** ...
- mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎
MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...
- mysql 基础篇(二) 账号、权限管理
mysql 基础篇(二) 账号.权限管理.备份与还原 建立账号密码: Grant all on test.* to "cj"@"localhost" ident ...
- MySQL:基础—数据分组
MySQL:基础-数据分组 1.为什么要分组: 比如一个表中有多条订单记录,如上图,每条记录对应着一个商品,现在我要查询 每个商品被订购的单数 准备出货?也就是找到每个商品被订购的数量. 如果只找一个 ...
- linux mysql运维_Linux运维常用的 MySQL基础命令
# MySQL基础命令 ------------- ### 创建MySQL库,授权. >create database mysqldb character set utf8; >grant ...
- mysql基础(全,必看)
MySQL基础 一.MySQL概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access ...
- mysql核心数据库_从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程...
从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程 课程目录 (1) 01MySQL基础_课程引入.avi (2) 02MySQL基础_为什么学习 ...
最新文章
- java dateformat 线程安全_SimpleDateFormat线程安全问题深入解析
- AMS重要的数据结构解析(二):TaskRecord
- KafkaProducer初始化时涉及到哪些核心组件?
- 傻瓜式Linux之一:系统安装
- npm run dev 和 npx webpack-dev-server
- U25%(1,16) and U25%(1,168)on《C4.5:programs for machine learning》
- [设计模式] ------ 装饰模式
- INFINI GATEWAY 极限网关初体验 ElasticSearch 两个集群数据同步
- html5 对比 HTML4 新增,HTML5对比HTML4的主要改变和改进总结
- Java动态代理之JDK实现和CGlib实现
- 基于OEA框架的客户化设计(一) 总体设计
- cent os 7 与cent os 6 修改主机名称
- PVS中TFTP的隐藏配置
- 数学——对数公式log常识回顾
- python 实现文字识别提取
- 怎么安装光盘并重新启动计算机,如何用光盘重新安装电脑系统
- 华为SNS2224的Zone配置
- 类似 毕克BYK354流平剂 荟研 溶剂型体系 润湿流平
- 字节跳动2023届校招薪资盘点!
- Idea 2022 创建 Artifacts 运行 Tomcat 步骤
热门文章
- 机器人genghis_机器人的发展历史你了解吗?
- 使鼠标保持按住状态_按下鼠标就能语音打字?讯飞这款鼠标是提高工作效率的好帮手...
- 诺基亚称不会被微软收购
- 经验分享:上传视频到优酷客户端
- 小团队如何妙用 JuiceFS
- ASP.NET Core MVC 直接运行报错:对象不支持“addEventListener”属性或方法
- ie下载java就花屏,java下载图片花屏的有关问题!
- matlab编程mindlin解,MATLAB对mindlin解进行三重积分
- ios开发者账户取消订阅
- 学会提问的BERT:端到端地从篇章中构建问答对 By 苏剑林