MySQL常用命令查询手册(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 笔记

六、MySQL查询语句


1.排序查询

通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)

ASC: 升序,默认值
DESC: 降序


(1)单列排序

只按某一个字段进行排序,单列排序。

SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];


例如:

-- 查询所有数据,使用年龄降序排序
select * from student order by age desc;


(2)组合排序

同时对多个字段进行排序,如果第 1 个字段相等,则按第 2 个字段排序,依次类推。

SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];


例如:

-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩升序排序 
select * from student order by age desc, math asc;


2.聚合函数

平常我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询, 它是对一列的值进行计算,然后返回一个结果值。聚合函数会忽略空值 NULL。

(1)五个聚合函数

12.png

(2)语法格式

SELECT 聚合函数(列名) FROM 表名;

例如:

-- 查询学生总数
select count(id) as 总人数 from student;
select count(*) as 总人数 from student;


由于聚合函数会忽略空值NULL,建议如果统计个数则不要使用有可能为 null 的列,但如果需要把 NULL 也统计进去,那么可以使用IFNULL()。

-- 如果列名不为空,返回这列的值。如果为 NULL,则返回默认值。
IFNULL(列名,默认值)

例如:

select count(ifnull(id,0)) from student;


3.分组查询

分组查询是指使用 GROUP BY 语句对查询信息进行分组,相同数据作为一组。

SELECT 字段1, 字段2, ... FROM 表名 GROUP BY 分组字段 [HAVING 条件];


GROUP BY 将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。 分组的目的就是为了统计,一般分组会跟聚合函数一起使用。


例1:一个学生成绩表,该表中有 “性别” 字段和 “数学成绩” 字段。

 -- 按性别进行分组,求男生和女生数学的平均分
select sex, avg(math) from student3 group by sex;

实际上是将每组的 math 求了平均,返回每组统计的结果

例如:

-- 对分组查询的结果再进行过滤
SELECT sex, COUNT(*) FROM student WHERE age > 25 GROUP BY sex having COUNT(*) >2;


4.having与where的区别

13.png

如:

SELECT 字段1, 字段2, ... FROM 表名称 WHERE 筛选条件1 GROUP BY 字段3 having 筛选条件2;

where要在分组之前,having要在分组之后。

筛选条件1不能是聚合函数,筛选条件2可以是聚合函数。


5.LIMIT语句

LIMIT 是限制的意思,LIMIT 的作用就是限制查询记录的条数。

SELECT 字段1 [AS 别名1], 字段2 [AS 别名2], ... 
FROM 表名 [WHERE子句] [GROUP BY子句] [HAVING 子句] [ORDER BY子句] [LIMIT子句];

LIMIT 语法格式

LIMIT offset,length;

如:

-- 查询学生表中数据,从第 3 条开始显示,显示 6 条。
select * from student limit 2,6;


七、MySQL数据库表的约束


数据库约束的种类

14.png


1.主键约束

(1)创建主键约束

创建表时增加主键

字段名 字段类型 PRIMARY KEY

例1:

CREATE TABLE tb_info (
    id INT PRIMARY KEY,
    name VARCHAR(30),
    age INT
);

例2:

CREATE TABLE tb_info (
    id INT,
    name VARCHAR(30),
    age INT,
    PRIMARY KEY(id)
);
已存在表增加主键
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);


例:

ALTER TABLE tb_info ADD PRIMARY KEY(id);


(2)删除主键约束

删除单表主键约束

ALTER TABLE 表名 DROP PRIMARY KEY;

删除有外键连接的表的主键

第一步:解除外键约束

ALTER TABLE 外键表 DROP FOREIGN KEY 外键名称

第二步:删除主键

ALTER TABLE 主键表 DROP PRIMARY KEY;


(3)主键自增

-- 表示自动增长(字段类型必须是整数类型)
AUTO_INCREMENT

如:

CREATE TABLE tb (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(30),
    age INT
);

默认地 AUTO_INCREMENT 的开始值是 1

创建表时指定起始值

CREATE TABLE 表名 (
    列名 INT PRIMARY KEY AUTO_INCREMENT
) AUTO_INCREMENT=起始值;

如:指定起始值为5

CREATE TABLE tb (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(30),
    age INT
) AUTO_INCREMENT=5;

创建好以后修改起始值

ALTER TABLE 表名 AUTO_INCREMENT=起始值;

备注:DELETE 和 TRUNCATE 对自增长的影响

DELETE:删除所有的记录之后,自增长没有影响。

TRUNCATE:删除以后,自增长又重新开始。.


2.唯一约束

唯一约束: 表中某一列不能出现重复的值

基本格式

字段名 字段类型 UNIQUE


如:tb表中的 name 字段中的记录不能出现重复的

CREATE TABLE tb (
    id INT,
    name VARCHAR(30) UNIQUE,
    age INT
);


3.非空约束

非空约束:某一列不能为null

基本语法格式

字段名 字段类型 NOT NULL

如:tb表中的 id 字段不能出现null

CREATE TABLE tb (
    id INT NOT NULL,
    name VARCHAR(30),
    age INT
);


4.默认值

基本语法格式

字段名 字段类型 DEFAULT 默认值

如:tb表中的 age 字段的默认值为18

CREATE TABLE tb (
    id INT,
    name VARCHAR(30),
    age INT DEFAULT 18
);


5.外键约束

(1)创建外键约束

创建表时增加外键

首先创建第一张被关联表Vendors商品供应商表。

-- 供应商列表
CREATE TABLE Vendors (
  -- 供应商ID:主键列,自增长
  vend_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '供应商ID',
  -- 供应商名:可变字符,非空
  vend_name VARCHAR (30) NOT NULL COMMENT '供应商名',
  -- 供应商地址
  vend_address VARCHAR (100) NOT NULL COMMENT '地址',
  -- 供应商城市
  vend_city VARCHAR (20) NOT NULL COMMENT '城市',
  -- 供应商州
  vend_state VARCHAR (20) NOT NULL COMMENT '州',
  -- 供应商邮编
  vend_zip VARCHAR (20) NOT NULL COMMENT '邮编',
  -- 供应商国家
  vend_country VARCHAR (20) NOT NULL COMMENT '国家'
);

然后创建第二张关联表Products产品表。

-- 产品目录表
CREATE TABLE Products (
  -- 产品ID:主键列,自增长
  prod_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  -- 供应商ID:外键
  vend_id INT NOT NULL COMMENT '供应商ID',
  -- 产品名
  prod_name VARCHAR (30) NOT NULL COMMENT '产品名',
  -- 产品价格
  prod_price DOUBLE NOT NULL COMMENT '产品价格',
  -- 产品描述
  prod_desc VARCHAR (100) COMMENT '产品描述',
  FOREIGN KEY (vend_id) REFERENCES Vendors (vend_id)
);
已存在表增加外键

格式:

ALTER TABLE 从表 ADD CONSTRAINT 外键约束名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主键字段名);

例如:

-- 已存在表增加外键
ALTER TABLE Products ADD FOREIGN KEY products_vendors_fk_1 (vend_id) REFERENCES Vendors (vend_id);

(2)删除外键约束

ALTER TABLE 从表 DROP FOREIGN KEY 外键名称;


6.主键与外键的区别

主关键字(primary key ): 是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。

外关键字(foreign key) : 是用于建立或加强两个表数据之间的链接的一列或多列。


如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。


主键和外键的区别:

15.png

增加主键:

alter table 表名 add primary key (列名);

删除主键:

alter table 表名 drop primary key;


增加外键:

alter table 表名1 add foreign key 外键名 (外键字段) references 表名2 (主键字段);

删除外键:

alter table 表名 drop foreign key 外键名;


八、多表查询


1.内连接

用左边表的记录去匹配右边表的记录,如果符合条件的则显示。如:从表.外键=主表.主键

隐式内连接

隐式内连接:看不到 JOIN 关键字,条件使用 WHERE 指定

SELECT 字段名 FROM 左表, 右表 WHERE 条件

如:

创建一个学生个人信息表

CREATE TABLE students(
    Id INT(30),
    Name VARCHAR(10),
    Age INT(4),
    Gender VARCHAR(25),
    PRIMARY KEY(Id)
);

创建一个学习成绩表

CREATE TABLE course(
    Id INT(30),
     Java INT(5),
     Python INT(5),
     MySQL INT(5),
     Hadoop INT(5),
     C INT(5),
     PHP INT(5),
     Linux INT(5),
     English INT(5),
     Math INT(5),
     CONSTRAINT id_course FOREIGN KEY(Id) REFERENCES students(Id)
);

学习成绩表的外键连接学生个人信息表的主键。这个时候,如果我们想要查询学生的Java成绩,

SELECT name, Java FROM students, course WHERE course.Id = students.Id;

显式内连接

显示内连接:使用 INNER JOIN … ON 语句, 可以省略 INNER

SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件

如:

还是上面创建的students表和course表

SELECT * FROM students INNER JOIN course c ON students.Id = c.Id;

查询students表的所有信息,按ID插入course表的数据,一并查询出来。


2.外连接

左外连接

左外连接:使用 LEFT OUTER JOIN … ON,OUTER 可以省略

SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件

用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示 NULL 。可以理解为:在内连接的基础上保证左表的数据全部显示。


右外连接

右外连接:使用 RIGHT OUTER JOIN … ON,OUTER 可以省略

SELECT 字段名 FROM 左表 RIGHT [OUTER] JOIN 右表 ON 条件

用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示 NULL。可以理解为:在内连接的基础上保证右表的数据全部显示。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
2月前
|
SQL 缓存 监控
MySQL缓存机制:查询缓存与缓冲池优化
MySQL缓存机制是提升数据库性能的关键。本文深入解析了MySQL的缓存体系,包括已弃用的查询缓存和核心的InnoDB缓冲池,帮助理解缓存优化原理。通过合理配置,可显著提升数据库性能,甚至达到10倍以上的效果。
|
2月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
4月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
268 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
储存过程(Stored Procedures) 和 函数(Functions) : 储存过程和函数允许用户编写 SQL 脚本执行复杂任务.
223 14
|
2月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
以上概述了MySQL 中常见且重要 的几种 SQL 查询及其相关概念 这些知识点对任何希望有效利用 MySQL 进行数据库管理工作者都至关重要
106 15
|
2月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
2月前
|
SQL 关系型数据库 MySQL
MySQL入门指南:从安装到第一个查询
本文为MySQL数据库入门指南,内容涵盖从安装配置到基础操作与SQL语法的详细教程。文章首先介绍在Windows、macOS和Linux系统中安装MySQL的步骤,并指导进行初始配置和安全设置。随后讲解数据库和表的创建与管理,包括表结构设计、字段定义和约束设置。接着系统介绍SQL语句的基本操作,如插入、查询、更新和删除数据。此外,文章还涉及高级查询技巧,包括多表连接、聚合函数和子查询的应用。通过实战案例,帮助读者掌握复杂查询与数据修改。最后附有常见问题解答和实用技巧,如数据导入导出和常用函数使用。适合初学者快速入门MySQL数据库,助力数据库技能提升。
|
3月前
|
存储 关系型数据库 MySQL
使用命令行cmd查询MySQL表结构信息技巧分享。
掌握了这些命令和技巧,您就能快速并有效地从命令行中查询MySQL表的结构信息,进而支持数据库维护、架构审查和优化等工作。
379 9
|
2月前
|
SQL 监控 关系型数据库
MySQL高级查询技巧:子查询、联接与集合操作
本文深入解析了MySQL高级查询的核心技术,包括子查询、联接和集合操作,通过实际业务场景展示了其语法、性能差异和适用场景,并提供大量可复用的代码示例,助你从SQL新手进阶为数据操作高手。
|
5月前
|
关系型数据库 MySQL 数据库
MySQL报错:未知系统变量'tx_isolation'及隔离级别查询
记住,选择合适的隔离级别,就像是在风平浪静的湖面上找到适合的划船速度——既要快到能赶上午饭(性能),又不至于翻船(数据一致性问题)。
270 3

推荐镜像

更多