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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 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。可以理解为:在内连接的基础上保证右表的数据全部显示。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
存储 关系型数据库 MySQL
提高MySQL查询性能的方法有很多
提高MySQL查询性能的方法有很多
42 6
|
5天前
|
存储 关系型数据库 MySQL
提高MySQL的查询性能
提高MySQL的查询性能
24 4
|
4天前
|
tengine 关系型数据库 MySQL
Tengine、Nginx安装MySQL数据库命令教程
本指南详细介绍了在Linux系统上安装与配置MySQL数据库的步骤。首先通过下载并安装MySQL社区版本,接着启动MySQL服务,使用`systemctl start mysqld.service`命令。若启动失败,可尝试使用`sudo /etc/init.d/mysqld start`。利用`systemctl status mysqld.service`检查MySQL的服务状态,确保其处于运行中。通过日志文件获取初始密码,使用该密码登录数据库,并按要求更改初始密码以增强安全性。随后创建一个名为`tengine`的数据库,最后验证数据库创建是否成功以及完成整个设置流程。
|
1天前
|
关系型数据库 MySQL 数据库
mysql的查询
MySQL数据库查询语句的基本用法,包括基础查询、条件查询、排序、分组查询、聚合函数的使用以及分页查询的方法。
8 2
|
23小时前
|
缓存 关系型数据库 MySQL
MySQL 满足条件函数中使用查询最大值函数
MySQL 满足条件函数中使用查询最大值函数
9 1
|
27天前
|
SQL 缓存 关系型数据库
MySQL高级篇——关联查询和子查询优化
左外连接:优先右表创建索引,连接字段类型要一致、内连接:驱动表由数据量和索引决定、 join语句原理、子查询优化:拆开查询或优化成连接查询
MySQL高级篇——关联查询和子查询优化
|
11天前
|
存储 关系型数据库 MySQL
MySQL索引失效及避免策略:优化查询性能的关键
MySQL索引失效及避免策略:优化查询性能的关键
75 3
|
13天前
|
关系型数据库 MySQL 数据库
MySQL 表的CRUD与复合查询
【9月更文挑战第26天】本文介绍了数据库操作中的 CRUD(创建、读取、更新、删除)基本操作及复合查询。创建操作使用 `INSERT INTO` 语句插入数据,支持单条和批量插入;读取操作使用 `SELECT` 语句查询数据,可进行基本查询、条件查询和排序查询;更新操作使用 `UPDATE` 语句修改数据;删除操作使用 `DELETE FROM` 语句删除数据。此外,还介绍了复合查询,包括连接查询(如内连接、左连接)和子查询,以及聚合函数与分组查询,并提供了示例代码。
|
16天前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
52 4
|
19天前
|
NoSQL 关系型数据库 MySQL
当Redis与MySQL数据一致性校验中Redis数据量小于MySQL时的全量查询处理方法
保持Redis和MySQL之间的数据一致性是一个需要细致规划和持续维护的过程。通过全量数据同步、建立增量更新机制,以及定期执行数据一致性校验,可以有效地管理和维护两者之间的数据一致性。此外,利用现代化的数据同步工具可以进一步提高效率和可靠性。
40 6