MySQL基本操作
一 、数据库和表的基本操作
1.主键约束
定义:主键,是表中一列或者多列的组合,主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空,主键能够唯一的标识表中的每一条记录,可以结合外键来定义与不同数据表之间的关系。 怎么理解主键呢?我们知道数据库中的表可以存放很多数据,如果把表中的每一个数据比作一个人的话,那么表的主键就可以看做是人的身份证。
1.1 添加主键约束
有两种方式可以添加主键约束: 1.在定义列的同时指定主键; 2.在定义完字段之后再指定主键。
(1) 在定义列的同时指定主键:

(2) 在定义完所有列之后指定主键。

1.2 多字段联合主键
在开发中还有一种情况很常见,就是将几个字段联合在一起作为主键,那这个在代码中怎么实现呢? 举个例子,我们将员工的名字和部门ID联合起来作为主键:
CREATE TABLE t_emp2( name VARCHAR(32), deptId INT, salary FLOAT, PRIMARY KEY(name,deptId))
语句执行后,会将name和deptId字段组合成为表t_emp2的多字段组合主键。
2.外键约束
2.1 外部关键字
在以后我们统一将外部关键字叫做外键,外键就是另一张表中的主键。
**问:**外键有啥用啊? **答:**外键的主要作用就是保持数据的一致性,完整性。
**再问:**怎么保证的呢? **答:**看图。

如图有两张表,classId 是T_Student的外键,是T_class 表的主键, 如果我们要删除T_class 表中classId为1的字段,程序是会报错的,因为t_student表中有数据和classId为1的字段关联了,是不能删除的,这样子就保证了数据的一致性和完整性。
**继续问:**那怎么才能删除呢? **接着答:**需要先删除T__student表中classId为1的两个字段。
2.2 如何给表添加外部关键字
在MySQL中给表中字段添加外键约束的语法规则如下:
CONSTRAINT 外键名 FOREIGN KEY 字段名 REFERENCES 主表名(主键名)
举个例子:现在有两张表,t_emp、t_dept如下。
t_dept表
| 字段名称 | 数据类型 | 备注 |
|---|---|---|
| deptId | INT | 部门编号 |
| name | VARCHAR(22) | 部门名称 |
| location | VARCHAR(50) | 部门位置 |
t_emp表
| 字段名称 | 数据类型 | 备注 |
|---|---|---|
| id | INT | 员工编号 |
| name | VARCHAR(22) | 员工姓名 |
| deptId | INT | 部门ID(外键类型必须和对应主键类型一直) |
我们来创建两张表,并给员工表(t_emp)添加外键:
CREATE TABLE t_dept( deptId INT PRIMARY KEY, name VARCHAR(22), location VARCHAR(50));CREATE TABLE t_emp( id INT PRIMARY KEY, name VARCHAR(22), deptId INT, CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES t_dept(deptId));
实际操作如图:

3.常用约束
3.1 怎么添加唯一约束
唯一约束(Unique Constraint)要求该列唯一,允许为空,但是只能有一个空值。唯一约束可以确保一列或者几列不出现重复值。
定义部门表的部门名称唯一,SQL语句如下:关键词 UNIQUE。
CREATE TABLE t_dept( id INT PRIMARY KEY, name VARCHAR(22) UNIQUE, location VARCHAR(50))
3.2 怎么添加非空约束
关键词:NOT NULL;
例如:
CREATE TABLE t_dept( id INT PRIMARY KEY, name VARCHAR(22) NOT NULL, location VARCHAR(50))
3.3 怎么使用默认约束
默认约束:即给字段一个默认值。 关键词:DEFAULT;
例如:
CREATE TABLE t_emp( id INT PRIMARY KEY, name VARCHAR(22), sex VARCHAR(2) DEFAULT '男') DEFAULT CHARSET=utf8;
注意:
- 如果是添加字符串型默认值要使用单引号,如果是整型则不需要加任何符号;
- 如果要添加的是中文默认值,则需要加上
DEFAULT CHARSET=utf8;使用英文字符则不需要。
3.4 设置表的属性值自动增加
在数据库应用中,经常有个需求就是,在每次插入新纪录时,系统自动生成字段的主键值,即:
| id | name |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
| ID每次自动加一 | 姓名 |
| … | XXX |
| 10 | XXX |
关键词:AUTO_INCREMENT,默认情况下初始值和增量都为1。
例如:
CREATE TABLE t_tmp( id int PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32))
4.表的相关操作
4.1 查看表结构与修改表名
4.1.1 查看数据表基本结构
有强迫症或健忘症的小伙伴们在建好数据库和表以后,通常会怀疑自己刚才是不是敲错了,怎么办?如果不是使用图形界面是不是就没法查看啦?
不存在的,这就告诉你查看口令:DESCRIBE 语法规则为:DESCRIBE 表名;
大小写不敏感哟!
DESCRIBE可以查看表的字段信息,包括:字段名、字段数据类型、是否为主键、是否有默认值等。
比如本岛主新建了一个名叫Products的表,结构如下:

现在来看看“现场”,用DESCRIBE查表的结构是这样的。
其中,该结构中各个字段的含义分别为:
NULL:表示该列是否能存储NULL值;Key:表示该列是否已编制索引;PRI:表示该列是此表主键的一部分;UNI:表示该列是UNIQUE索引的一部分;MUL:表示在列中某个给定值允许出现多次;Default:表示该列是否有默认值,如果有的话值是多少;Extra:表示可以获取的与给定列有关的附加信息。

4.1.2 查看数据表详细结构
什么?你发现表建错了,你想知道错在哪里了? 那就用SHOW CREATE TABLE语句吧。
语法规则为:SHOW CREATE TABLE 表名; 。
还是刚才那个例子,让我们看看SHOW CREATE TABLE有什么能耐。


可以看到,使用 SHOW CREATE TABLE 语句,不仅仅可以返回给我们建表时所写的详细语句,而且还可以查看存储引擎和字符编码。
再告诉大家一个小诀窍,是不是觉得返回的结果排版有点乱。我们加上\G后效果就会有所改善哟,来看看!

4.1.3 修改表名
随着表越来越多,有时候你会后悔之前的数据表的名字根本没有认真斟酌过,想要重新命名一下,可以做到吗?
答案是:可以!MySQL是通过ALTER TABLE语句来修改表名的。
语法规则为:ALTER TABLE 旧表名 RENAME 新表名; 。
举个例子,我们先用SHOW TABLES看看我们的数据库中有什么表吧。

可以看到,我们目前已经有了两张表,分别叫Products和tb_emp。
接下来,我们使用ALTER TABLE为Products改名。

改名成功!Products成功变成了Mall_products。
4.2 修改字段名与字段数据类型
4.2.1 修改字段名
有时,在我们建好一张表后会突然发现,哎呀!字段名貌似写错了!怎么办?要删了表再重新建一个新表吗?还是要删了这个字段再新建一个新的字段? 都不用,MySQL 中修改字段名称也有专门的语句,接近于自然语言,很好记忆。
语法规则为: ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型; 。
举个例子: 现在我们要把表Mall_products中的字段prod_id改名为ID。表结构如下:

输入命令:ALTER TABLE Mall_products CHANGE prod_id ID varchar(20);。执行过程如下所示。简单吧!

小提示: 如果不需要修改字段的数据类型,可以把新字段的数据类型设置为和原来一样,但是!千万不要空着它!
4.2.2 修改字段数据类型
随着存储的数据越来越多,数据库新人可能会发现,哎呀,当初预留的数据类型已经不能满足要求了,或者当初预留的字符太少了,怎么办?怎么修改?规则来了。
语法规则为: ALTER TABLE 表名 MODIFY 字段名 数据类型; 。
举个例子: 现在我们要把表Mall_products中的字段ID的数据类型改为varchar(30)。表结构如下:

输入命令:ALTER TABLE Mall_products MODIFY ID varchar(30);。执行过程如下所示。

ID的数据类型varchar(20)成功变成了varchar(30)。
4.3 添加与删除字段
4.3.1 添加字段
因为甲方的业务需求是不停变化的,所以在数据库操作中,添加字段可是常有的事。一个完整的字段包括:字段名、数据类型和完整性约束。
语法规则为: ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件] [FIRST|AFTER] 已存在字段名; 。
以下是在 MySQL 中常用的约束。
NOT NULL 约束:确保某列不能有 NULL 值。
DEFAULT 约束:当某列没有指定值时,为该列提供默认值。
UNIQUE 约束:确保某列中的所有值是不同的。
PRIMARY Key 约束:唯一标识数据库表中的各行/记录。
CHECK 约束:CHECK 约束确保某列中的所有值满足一定条件。
4.3.2 在表的最后一列添加字段
只要不做[FIRST|AFTER]的位置说明,在添加字段时MySQL会默认把新字段加入到表的最后一列。
举个例子: 现在我们要把字段prod_country添加到表Mall_products的最后一列。表结构如下:

输入命令: ALTER TABLE Mall_products ADD prod_country varchar(30); 执行结果如下所示:

4.3.3 在表的第一列添加字段
如果我们想在第一列添加新的字段,只需做FIRST的位置说明。
举个例子: 现在我们要把字段prod_country添加到表Mall_products的第一列。
输入命令: ALTER TABLE Mall_products ADD prod_country varchar(30) FIRST; 执行结果如下所示:

4.3.4 在表的指定列后添加字段
如果我们想在某一列后面添加新的字段,只需做AFTER的位置说明,然后注明你想让它添加在哪个字段的后面即可。
举个例子: 现在我们要把字段prod_country添加到表Mall_products的 prod_name字段的后面。
输入命令: ALTER TABLE Mall_products ADD prod_country varchar(30) AFTER prod_name; 执行结果如下所示:

总之,想要添加新的字段,记住绿色框里的语法规则就能记住三种位置的添加方式。
4.3.5 删除字段
有添加的需求就会有删除的需求。删除一个字段就是将数据表中的某个字段从表中移除。
语法规则为: ALTER TABLE 表名 DROP 字段名; 。
举个例子: 现在我们要把字段prod_price从表Mall_products中删除。表结构如上图结果所示。
输入命令: ALTER TABLE Mall_products DROP prod_price; 执行结果如下所示:

字段prod_price成功删除!
4.4 修改字段的排列位置
4.4.1 修改字段的排列位置
在一个数据表被创建的时候,其字段的排列顺序就已被确定了。不能变了吗?怎么可能,一锤子买卖没人敢做。
我们可以通过ALTER TABLE来改变表中字段的相对位置。
语法规则为: ALTER TABLE 表名 MODIFY 字段1 数据类型 FIRST|AFTER 字段2; 。
其中,字段1指要修改位置的字段,FIRST与AFTER 字段2为可选参数。
4.4.2 修改字段为表的第一个字段
如果我们想把字段的位置调整到第一列,只需做FIRST的位置说明。
举个例子 现在我们要把字段prod_price调整到表Mall_products的第一列。Mall_products表结构如下所示:

输入命令: ALTER TABLE Mall_products MODIFY prod_price FLOAT FIRST;
执行过程如下所示:

4.4.3 修改字段到表的指定列之后
还有一种位置调整的方法可以让你把想调整的字段放在除了第一列的任何位置。调整的时候需要做AFTER 字段2的位置说明。
举个例子 现在我们要把字段prod_price调整到字段prod_country的后面。Mall_products表结构如下所示:

输入命令: ALTER TABLE Mall_products MODIFY prod_price FLOAT AFTER prod_country;
执行过程如下所示:

调整成功!
4.5 删除表的外键约束
4.5.1 删除表的外键约束
我们曾在第一章中讲过外键的作用,以及如何创建一个表的外键。建立了外键我们就建立起了两张表的关联关系,那如果我想删除主表呢?为了确保数据库的正确性,我们必须先解除两个表之间的关联关系,那就是删除外键约束啦!让我们先来看看删除外键约束的语法规则。
语法规则为: ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名; 。
举个例子: 我们先建立了一个主表country,表结构如下图所示:

然后建立一个有外键约束的子表Mall_products2,让它的键country_id作为外键关联到country的主键id。SQL语句如下:
CREATE TABLE Mall_products2(id INT(11) PRIMARY KEY,country_name VARCHAR(20) NOT NULL,country_id INT(11) NOT NULL,CONSTRAINT prod_country FOREIGN KEY(country_id) REFERENCES country(id))
上述语句成功执行后,在表Mall_products2上添加了名称为prod_country的外键约束,外键名称为prod_country,依赖于表country的主键id,从下图中可以看到,已经成功添加了表的外键:

Mall_products2表结构如下图所示:

下面开始删除外键约束,语句如下: ALTER TABLE Mall_products2 DROP FOREIGN KEY prod_country;
使用SHOW CREATE TABLE查看表 Mall_products2 的结构,结果如下:

我们可以看到,FOREIGN KEY不见了,外键约束删除成功!
二、单表查询
1.基本查询语句
1.1 查询数据表中指定字段的内容
MySQL从数据表中查询数据的基本语句为SELECT语句。
SELECT语句的可选参数比较多,让我们先从最简单的开始,带大家一步一步的深入SELECT语句的使用。
SELECT 基本语法规则为: SELECT 字段名 FROM 表名; 。
举个例子 假设我们现在有一张表Mall_products,内容如下:

我们需要从数据表中查询所有商品的名称,你们想想该怎么写?
查询代码如下:
SELECT prod_nameFROM Mall_products;
结果为:

查询过程如下:

分析:
在该例子中,我们使用了SELECT语句从Mall_products表中获取名称为prod_name字段下的所有产品名称,字段名称需要紧跟在SELECT关键字之后。
然而事实上,我们查询数据的时候,往往需要同时查询多个字段下的内容。这时,我们只需要在字段之间加入逗号,即可。
语法规则为: SELECT 字段名1, 字段名2 FROM 表名; 。
举个例子 假设我们现在有一张表Mall_products,内容与上例相同。我们需要从数据表中查询所有商品的名称和价格,你们想想该怎么写?
查询代码如下:
SELECT prod_name, prod_priceFROM Mall_products;
结果为:

小提示: MySQL 中的 SQL 语句对关键字的大小写不敏感, SELECT 和 select 是一样的。 但是许多开发者更喜欢将关键字大写,表名和字段名使用小写,养成这种习惯,以后写出来的脚本就更容易阅读和维护了。
1.2 查询数据表中的所有内容
如果我们不记得字段名字了,我们还可以查看整张表的内容。这时候,只需要我们用星号*来代替字段的名字,就会得到一整张表的内容。
语法规则为: SELECT * FROM 表名;
举个例子 假设我们现在有一张表Mall_products。一开始我们并不知道表里都有什么,所以想要查看整张数据表的内容,你们想想该怎么写?
查询代码如下:
SELECT *FROM Mall_products;
结果为:

小提示: 虽然使用星号 * 看起来是一件很方便的事情,但是建议大家在不想获取整张表的情况下,还是使用字段名来进行查询。因为很显然,它会降低查询的效率。
2.带IN关键字的查询
2.1 带IN关键字的查询
IN关键字被用在WHERE语句的后边,用来过滤你所需要查询的内容。更形象的说,IN关键字的使用情形就像点名,点到谁谁就要站出来。

语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 IN (n1,n2,n3,…); 。
其中,括号内的数字必须为INT格式的数字。被“点到名”的这些括号里数字对应的内容,都要乖乖的站到前边来展示给大家看。
举个例子 假设我们现在有一张表Mall_products,内容如下:

我们会使用IN关键字检索出所有国家代码为1、86和39的商品信息。
查询代码如下:
SELECT *FROM Mall_productsWHERE prod_country IN (1,87,39);
结果为:

查询过程如下:

Oopes! 貌似我们刚才输入了三个数字,为什么只查询到了国家代码为1和39的数据内容,87去哪里了?
因为国家代号87的内容就压根没存在过啊,仔细看看表Mall_products就知道了。
2.2 带NOT IN关键字的查询
聪明的小伙伴一看NOT就知道了,我们是要取反了。刚才我们是在查询括号中出现的内容,加了NOT取反后,就意味着,我们要查询的是除了括号中出现内容外的所有内容。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 NOT IN (n1,n2,n3,…); 。
举个例子 我们还使用刚才的表Mall_products。现在我们想要查询除了国家代码为86的所有国家的产品内容。
查询代码如下:
SELECT *FROM Mall_productsWHERE prod_country NOT IN (86);
结果为:

3.带WETWEEN AND的范围查询
3.1 带BETWEEN AND关键字的查询
我们已经学会了如何用IN关键字精确查询数据表中的内容,但是在很多时候,我们仅仅是想知道在某一范围内有多少符合条件的数据,这就不得不使用到关键字BETWEEN AND了。
BETWEEN AND需要两个参数支持,一个是范围的开始值,另一个就是结束值了。如果字段值满足指定的范围查询条件,就返回这些满足条件的数据内容。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN n1 AND n2; 。
举个例子 假设我们现在有一张表Mall_products,内容如下:

我们将使用BETWEEN AND关键字检索出所有国家代码为1~50的商品的信息。
查询代码如下:
SELECT *FROM Mall_productsWHERE prod_country BETWEEN 1 AND 50;
结果为:

查询过程如下:

可以看到,返回结果包含了国家代码从1~50之间的字段值。尤其值得注意的是,端点值1也包含在返回结果中。
3.2 带NOT BETWEEN AND关键字的查询
像上一关介绍的关键字IN一样,我们还可以对关键字BETWEEN AND进行取反,表示查询指定范围之外的值。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 NOT BETWEEN n1 AND n2; 。
举个例子 我们依然使用表Mall_products。现在我们想要查询除了国家代码为1~50的所有国家的产品内容。
查询代码如下:
SELECT *FROM Mall_productsWHERE prod_country NOT BETWEEN 1 AND 50;
结果为:

由结果可以看出,返回的结果只有大于国家代码50的内容。
4.带LIKE的字符匹配查询
4.1 使用通配符%模糊匹配数据内容
百分号通配符%可以匹配任意长度的字符,甚至包括零字符。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 LIKE ‘字符%’; 。 其中 % 的位置可以根据需要在字符间变化。
举个例子 假设我们现在有一张表Mall_products,内容如下:

我们将使用LIKE关键字和通配符%检索出所有商品名称带ir的商品信息。
查询代码如下:
SELECT *FROM Mall_productsWHERE prod_name LIKE '%ir%';
结果为:

分析:
该语句查询的结果返回所有商品的名字中间带ir字符的所有信息。通配符%告诉MySQL,返回字符串中间带ir字符的记录,不管ir前面和后面分别有多少字符。
通配符%可以放在不同的位置以满足你查询的需要,仔细想想,如果我们想要查找商品名称以B开头的所有记录,%应该放在哪里?
查询过程如下:

4.2 使用通配符_模糊匹配数据内容
下划线通配符_与百分号通配符%类似,也用于模糊匹配。但是区别在于下划线通配符_只能模糊匹配1个字符。如果你执意想用下划线通配符_匹配多个字符,那只能多用几个_咯!
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 LIKE ‘字符_’; 。 其中_的位置可以根据需要在字符间变化。
举个例子 假设我们现在有一张表Mall_products,内容如下:

我们将使用LIKE关键字和通配符_检索出所有商品名称以r结尾,且前边有9个字母的商品信息。
查询代码如下:
SELECT *FROM Mall_productsWHERE prod_name LIKE '_________r';
结果为:

看到查询结果中prod_name对应的Teddy bear,大家可能注意到了,我们把空格也当成了一个字符来计算。
查询过程如下:

5.查询空值与去除重复结果
5.1 查询空值
在数据表创建之初,创建者可以指定某个字段是否为空值NULL。注意了,这个NULL既不代表0,也不代表空字符,而是代表一种未知的状态,比如不适用或者放着等将来有合适数据了再添加进去。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 IS NULL; 。
举个例子 假设我们现在有一张表Mall_products,内容如下:

我们将使用IS NULL关键字检索出所有prod_country字段为NULL的商品信息。
查询代码如下:
SELECT *FROM Mall_productsWHERE prod_country IS NULL;
结果为:

查询过程如下:

可以看到,结果成功显示了prod_country字段为NULL的商品信息。与关键字IS NULL查询结果相反的是关键字IS NOT NULL,我们来看看实际操作的效果。
查询代码如下:
SELECT *FROM Mall_productsWHERE prod_country IS NOT NULL;
结果为:

查询过程如下:

可以看到,查出来了prod_country字段的非NULL记录。
5.2 去除重复结果
有的时候,出于对数据分析的要求,分析人员需要消除数据表中重复的数据,那么如何消除呢?别担心,SQL语句也贴心的为你准备好了消除重复数据的关键字DISTINCT。
语法规则为: SELECT DISTINCT 字段名 FROM 表名; 。
举个例子 假设我们现在有一张表Mall_products,内容如下:

可以从表中看到,除了字段ID没有重复项,剩下的字段里都出现了重复项。
我们将使用DISTINCT关键字去除prod_name字段中的重复数据。
查询代码如下:
SELECT DISTINCT prod_name, prod_country, prod_priceFROM Mall_products;
结果为:

查询过程如下:

可以看到,使用了关键字DISTINCT后,我们返回的记录都不再有重复值。
6.带AND与OR的多条件查询
6.1 带AND关键字的多条件查询
大家在前两章使用WHERE关键字限定查询内容的时候,有没有注意到我们使用的都是单一条件查询。有没有同学曾经在检索的时候觉得力不从心:“我需要的结果只用单一条件查询是得不到的呀!”
比如,我既想要成熟苹果中直径大于5cm的苹果的品种,又想要成熟苹果果色为黄色的苹果的品种。这两个条件如何综合在一起进行检索呢?
MySQL在WHERE子句中使用AND操作符限制只有满足所有条件的查询才会被返回。可以使用AND连接两个甚至更多个查询条件,多个条件表达式之间用AND分开。
语法规则为: SELECT 字段名 FROM 表名 WHERE 表达式1 AND 表达式2; 。
举个例子 假设我们现在有一张表Mall_products,内容如下:

我们想要查询表中哪些商品不仅商品名中带有toy字符,单价又同时大于5,并列出他们的商品信息。
查询代码如下:
SELECT *FROM Mall_productsWHERE prod_name LIKE '%toy%' AND prod_price > 5;
结果为:

查询过程如下:

分析:
在这个例子中,WHERE子句中的条件分为了两部分,AND关键字指示MySQL返回所有同时满足两个条件的内容。单独满足带toy字符后者单独满足价格大于5都得不到我们想要查询的结果。
小提示: 可以同时添加多个过滤条件,增加条件的同时只需增加一个 AND 关键字。
6.2 带OR关键字的多条件查询
与AND相反,在WHERE声明中使用OR关键字表示只需满足两个条件中的其中一个条件即可返回结果。
语法规则为: SELECT 字段名 FROM 表名 WHERE 表达式1 OR 表达式2; 。
举个例子 假设我们现在有一张表Mall_products,内容如下:

我们想要查询表中商品ID为BNBG01或BR01的名称和单价。
查询代码如下:
SELECT ID, prod_name, prod_priceFROM Mall_productsWHERE ID = 'BNBG01' OR ID = 'BR01';
结果为:

查询过程如下:

分析:
在这个例子里,关键字OR告诉MySQL只需要满足其中一个条件就可以返回结果,恩,很幸运的是它两个条件都能满足,所以返回了所有条件的结果。这里我们如果使用关键字AND,将不会得到任何结果。
小提示: OR 可以和 AND 一起使用。但是 AND 的优先级要高于 OR 的优先级!
在这里我们不得不提到关键字IN,它能实现与OR相同的功能。
比如以下代码的功能和该例中的代码功能是一样的:
SELECT ID, prod_name, prod_priceFROM Mall_productsWHERE ID IN('BNBG01', 'BR01');
小提示: 虽然两种写法功能一样,但是我们更推荐使用 IN 关键字。因为它不仅逻辑清晰,执行的速度也会快于 OR 关键字。更重要的是,使用 IN 关键字,我们以后可以执行更加复杂的嵌套语句。
7.对查询结果进行排序
7.1 对查询结果排序
我们知道在MySQL中从数据表中读取数据都是使用SELECT语句。 如果我们需要对读取的语句进行排序,我们就可以使用Order By子句来设定你想要按照的字段进行排序并返回结果。
语法:
SELECT 字段名 FROM 表名 ORDER BY 字段名 [ASC[DESC]];
你还可以根据自己的需求添加WHERE、LIKE子句来设置条件,再对结果过进行排序显示。
现有user表数据如下:
| id | name | age |
|---|---|---|
| 1 | Tom | 32 |
| 2 | Nancy | 18 |
| 3 | Allen | 24 |
| 4 | Jason | 23 |
我们需要查询表中信息,要求按照年龄的升序进行排序:

7.2 指定排序方向
从上面的查询语句中我们并未看到有任何表示排序方向的关键字**,在默认情况下,它是按升序排列的。**
ASC升序关键字DESC降序关键字

8.分组查询
8.1 分组查询的单独使用
分组查询的关键字是Group By,查询的是每个分组中 首次出现的一条记录。
语法:
SELECT 字段名 FROM 表名 GROUP BY 字段名;
例如: 现有user表数据:
| id | name | sex |
|---|---|---|
| 1 | Tom | 男 |
| 2 | Nancy | 女 |
| 3 | Allen | Null |
| 4 | Jason | 男 |
我们对表中数据的性别进行分组查询:

可以看出,返回了3条记录,分别是sex字段值为Null、女、男的记录,查询结果按照sex字段中不同的值进行了分类,只显示每个分组中的一条记录,意义不大,一般情况下,GROUP BY都和聚合函数一起使用。
9.使用LIMIT限制查询结果的数量
9.1 LIMIT的使用
在我们查询大量数据结果时,会返回很多条数据,有需要的记录可能就其中的一条或者几条。比如,实现分页功能,若每页显示10条记录,每次查询就只需要10条记录。 在MySQL中,提供了LIMIT关键字,用来限制查询结果的数量。
语法:
SELECT 字段名 FROM 表名 LIMIT [OFFSET,] 记录数;
参数说明:
- 第一个参数,
OFFSET,可选参数,表示偏移量,如果不指定默认值为0,表示从查询结果的第一条记录开始,若偏移量为1,则从查询结果中的第二条记录开始,以此类推。 - 第二个参数,记录数,表示返回查询结果的条数。
现有employee表数据如下:
| id | name | age |
|---|---|---|
| 1 | Tom | 23 |
| 2 | Allen | 45 |
| 3 | Nancy | 32 |
| 4 | Jack | 27 |
| 5 | Rose | 29 |
| 6 | Mary | 18 |
- 查询
employee表中前4条数据:

- 从第二条记录开始往后查看
4条数据(不包含第二条):

三、连接查询
1.内连接查询
1.1 内连接查询
- 仅将两个表中满足连接条件的行组合起来作为结果集,称为内连接;
- 关键字:
[inner] join ... on。
语法:
表1 [inner] join 表2 on 表1.字段=表2.字段
语法解释:
从表1中取出每一条记录,去表2中与所有的记录进行匹配,匹配必须是某个条件在表1中与表2中相同,最终才会保留结果,否则不保留。inner 关键字可省略不写;on 表示连接条件:条件字段就是代表相同的业务含义(如下面两张表中的 employee.dept_id 和 department.id),大多数情况下为两张表中的主外键关系。
1.2 内连接查询的使用
现在我们有两张表,数据如下: employee表数据:
| id | name | dept_id |
|---|---|---|
| 1 | Nancy | 4 |
| 2 | Tod | 2 |
| 3 | Carly | 1 |
| 4 | Allen | 2 |
| 5 | Mary | (null) |
department表数据:
| id | name |
|---|---|
| 1 | 开发部 |
| 2 | 测试部 |
| 3 | 运维部 |
| 4 | 销售部 |
现在想要查询出员工姓名以及其对应的部门名称,我们就使用内连接来进行查询。
- 我们可以将关联查询思路分为三步:
1.确定所连接的表, 2.确定所要查询的字段, 3.确定连接条件与连接方式。

其中,没有部门的员工和部门没有员工的部门都没有被查出来,这就是内连接的特点,只查询在连接表中有对应的记录,其中dept.id=emp.dept_id是连接条件。
2.外连接查询
2.1 外连接查询
- 以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接,不管能不能匹配上条件,最终都会保留。能匹配,正确保留;不能匹配,其它表的字段都置空(
null),称为外连接。 - 外连接查询分为左外连接查询和右外连接查询;
- 关键字:
left/right [outer] join ... on。
语法:
表1 left/right [outer] join 表2 on 表1.字段=表2.字段
语法解释:
左外连接:在内连接的基础上,还包含表1中所有不符合条件的数据行,并在其中的表2列填写 NULL;右外连接:在内连接的基础上,还包含表2中所有不符合条件的数据行,并在其中的表1列填写 NULL。
2.2 外连接查询的使用
我们仍使用如下两张数据表:
employee表数据:
| id | name | dept_id |
|---|---|---|
| 1 | Nancy | 4 |
| 2 | Tod | 2 |
| 3 | Carly | 1 |
| 4 | Allen | 2 |
| 5 | Mary | (null) |
department表数据:
| id | name |
|---|---|
| 1 | 开发部 |
| 2 | 测试部 |
| 3 | 运维部 |
| 4 | 销售部 |
例如查询所有员工姓名以及他所在部门,在内连接中Mary没有被查出,因为他没有对应的部门,现在想把Mary也查出来,就要使用左外连接。

此查询语句以employee为主表查询,因此最终记录至少不少于主表已有的记录数。
- 右外连接是同理的,只是基准表的位置变化了而已。

我们在这里只是将left修改成了right,但是基准表变化了,是以department表的数据去匹配employee表,所以左外连接能做到的查询,右外连接也能做到,仅展现的效果有所不同。
虽然左外连接和右外连接有主表差异,但左外连接和右外连接可以互转,如上面的右外连接也等效于如下查询语句,只需将基准表换一下:

2.3 外连接补充理解:
区别:左连接返回包括左表中的所有记录和右表中连接字段相等的记录;右连接返回包括右表中的所有记录和左表中连接字段相等的记录;内连接只返回两个表中连接字段相等的行;全外连接返回左右表中所有的记录和左右表中连接字段相等的记录。

left join (左连接,左外连接):返回包括左表中的所有记录和右表中连接字段相等的记录。
right join (右连接,右外连接):返回包括右表中的所有记录和左表中连接字段相等的记录。
inner join (等值连接或者叫内连接):只返回两个表中连接字段相等的行。
full join (全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录。
举个例子:
A表
id name
1 小王
2 小李
3 小刘
B表
id A_id job
1 2 老师
2 4 程序员
内连接:(只有2张表匹配的行才能显示)
select` `a.``name``,b.job ``from` `A a ``inner` `join` `B b ``on` `a.id=b.A_id
只能得到一条记录:
小李 老师
左连接:(左边的表不加限制)
select a.name,b.job from A a left join B b on a.id=b.A_id
三条记录:
小王 ``null` `小李 老师` `小刘 ``null
右连接:(右边的表不加限制)
select` `a.``name``,b.job ``from` `A a ``right` `join` `B b ``on` `a.id=b.A_id
两条记录:
小李 老师` `null`` 程序员
全外连接:(左右2张表都不加限制)
select a.name,b.job from A a full join B b on a.id=b.A_id
四条数据
小王 null` `小李 老师` `小刘 null` `null 程序员
注:在sql中l外连接包括左连接(left join )和右连接(right join),全外连接(full join),等值连接(inner join)又叫内连接。
3.复合条件连接查询
3.1 复合条件连接查询
- 复合条件连接查询,就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。
如下两张数据表:
SELECT的语法顺序就是起执行顺序
FROM
WHERE (先过滤单表/视图/结果集,再JOIN)
GROUP BY
HAVING (WHERE过滤的是行,HAVING过滤的是组,所以在GROUP之后)
ORDER BY
employee表数据:
| id | name | dept_id | age |
|---|---|---|---|
| 1 | Nancy | 3 | 18 |
| 2 | Tod | 2 | 22 |
| 3 | Carly | 1 | 19 |
| 4 | Allen | 2 | 24 |
department表数据:
| id | name |
|---|---|
| 1 | 开发部 |
| 2 | 测试部 |
| 3 | 运维部 |
要求查询员工姓名和所在部门名称,使用内连接查询,将查询结果按照年龄升序排序:

四、子查询
五、复杂查询
``null
**右连接:(右边的表不加限制)**
select a.name,b.job from` `A a right join B b ``on a.id=b.A_id
两条记录:
小李 老师 null`` 程序员
**全外连接:(左右2张表都不加限制)**
select a.name,b.job from A a full join B b on a.id=b.A_id
四条数据
小王 null 小李 老师 小刘 null null 程序员
> **注:在sql中l外连接包括左连接(left join )和右连接(right join),全外连接(full join),等值连接(inner join)又叫内连接。**
#### 3.复合条件连接查询
##### 3.1 复合条件连接查询
- 复合条件连接查询,就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。
如下两张数据表:
**SELECT的语法顺序就是起执行顺序**
**FROM**
**WHERE (先过滤单表/视图/结果集,再JOIN)**
**GROUP BY**
**HAVING (WHERE过滤的是行,HAVING过滤的是组,所以在GROUP之后)**
**ORDER BY**
`employee`表数据:
| id | name | dept_id | age |
| ---- | ----- | ------- | ---- |
| 1 | Nancy | 3 | 18 |
| 2 | Tod | 2 | 22 |
| 3 | Carly | 1 | 19 |
| 4 | Allen | 2 | 24 |
`department`表数据:
| id | name |
| ---- | ------ |
| 1 | 开发部 |
| 2 | 测试部 |
| 3 | 运维部 |
要求查询员工姓名和所在部门名称,使用内连接查询,将查询结果按照年龄升序排序:
[外链图片转存中...(img-G3i9OZIf-1680767059098)]
## 四、子查询
## 五、复杂查询
## 六、聚合函数查询
本文详细介绍了MySQL中关于数据库表的操作,包括主键、外键约束的创建与理解,以及如何添加唯一约束、非空约束、默认约束。此外,还阐述了如何修改表结构,如更改字段名、数据类型、排列位置,以及删除字段。在查询方面,讲解了基本查询、使用IN、BETWEENAND、LIKE进行条件筛选,以及如何处理空值和去除重复结果,最后讨论了排序、分组和限制查询结果数量的方法。
1765

被折叠的 条评论
为什么被折叠?



