1. 简述

查询数据是指从数据库中获取所需要的数据。如Jack 要达到验证用户名和密码的目的,就需要从数据库已保存的用户表中读取当前用户的密码进行验证,以验明正身!保存查询数据是数据库操作中常用且重要的操作。用户可以根据自己对数据的需求,使用不同的查询方式,获得不同的数据。

2. 简单查询

在MySQL中可以通过SQL语句来实现基本数据查询,SQL语句可以通过如下多种使用: 查询所有字段数据查询指定字段数据避免重复数据查询对结果进行排序和分组等查询

数据库中可能包含数量庞大的表,表中可能包含无数的记录,如果没有两把刷子要获得所需的数据并非易事。在MySQL中,可以使用SELECT语句来查询数据,根据查询条件的不同,数据库系统会找到不同的数据,通过SELECT语句可以很方便地获取所需的信息。

在MySQL中,SELECT 语句的基本语法形式如下:

SELECT field1 field2 … fieldn
FROM tablename
[WHERE CONDITION1]
[GROUP BY fieldm [HAVING CONDITION2]]
[ORDER BY fieldn [ASC|DESC]];

其中

filed1 ~ fieldn 参数表示需要查询的字段名;

tablename 参数表示表的名称;

CONDITION1 参数表示查询条件;

fieldm 参数表示按该字段中的数据进行分组;

CONDITION2 参数表示满足该表达式的数据才能输出;

fieldn 参数指按该字段中数据进行排序。排序方式由 ASC 和 DESC 两个参数指出;ASC参数表示按升序的顺序进行排序,是默认参数;DESC参数表示按降序的顺序进行排序。

2.1 询所有字段数据

查询所有字段是指查询表中所有字段的数据,这种方式可以将表中所有字段的数据都查询出来。MySQL 有两种方式可以查询表中的所有字段。

2.1.1 列出表的所有字段

通过SQL语句 SELECT 列出表的所有字段,具体语法形式如下:

SELECT field1,field2,…,fieldn FROM tablename;

其中,filed1~fieldn 参数表示需要查询的字段名;tablename 参数表示表的名称。

2.1.2  * 符号表示所有字段

查询所有字段数据,除了使用上面的方式外,还可以通过符号 “ * ” 来实现,具体语法形式如下:

SELECT * FROM tablename; 

其中,符号 “ * ” 表示所有字段名;tablename 参数表示表的名称。与上一种方式相比,“*”符号方式的优势比较明显,即可用该符号代替表中的所有字段,但是这种方式不够灵活,只能按照表中字段的固定顺序显示,不能随便改变字段的顺序。

2.2 查询指定字段数据

查询指定字段数据,只需修改关键字 SELECT 后的字段列表为指定字段即可。

SELECT field1,field2,…,fieldn FROM tablename; 

例如,从班级表中查询班主任字段,SQL语句如下所示。

SELECT teacher FROM class;

如果关键字 SELECT 后面的字段不包含在所查询的表中,那么MySQL会报错。

1 mysql> create database school;     #创建数据库school
2 mysql> use school;          #选择数据库school
3 mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #创建表class,指定id 字段自增长
4 mysql> insert into class(id, name, teacher) values(1, '一班', 'ABC'),(2,'二班', 'BCD'),(3, '三班', 'CDE'),(4,'四班', 'DEF'); # 插入多条记录
5 mysql> select teacher from class ; #查询 class 表中的 teacher 域

2.3 查询不重复数据 DISTINCT

当在 MySQL 中执行简单数据查询时,有时会显示出重复数据。为了实现 查询不重复 数据,MySQL 提供了 DISTINCT 功能,SQL语法如下:

SELECT DISTINCT field1,field2,…,fieldn FROM tablename;

在上述语句中,关键字 DISTINCT 去除重复的数据。下面将通过一个具体的示例来说明如何实现查询不重复数据。

执行 SQL 语句 SELECT,在数据库 school 中查询班级表 class 中 teacher 字段的数据。具体步骤如下:

1 mysql>  create database school;      #创建数据库school
2 mysql> use school;             #选择数据库school
3 mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #创建表class,指定id 字段自增长
4 mysql> insert into class(id, name, teacher) values(1, '一班', 'ABC'),(2,'二班', 'BCD'),(3, '三班', 'CDE'),(4,'四班', 'CDE'); # 插入多条记录
5 mysql> select teacher from class;            #查询 class 表中的 teacher 域,包含重复记录
6 mysql> select distinct teacher from class;      #查询 class 表中的 teacher 域,去重

2.4 查询集合 IN

有的时候,当我们需要查询的目标记录限定在某个集合中的时候,在 MySQL 中可以使用关键字 IN 来实现,关键字IN可以实现判断字段的数值是否在指定集合中,该关键字的具体语句形式如下:

SELECT field1,field2,…,fieldn FROM tablename WHERE filedm IN(value1,value2,value3,…,valuen);

注:参数 fieldn 表示名称为 tablename 的表中的字段名,参数 valuen 表示集合中的值,通过关键字 IN 来判断字段 fieldm 的值是否在集合(value1,value2,value3,…,valuen)中,如果字段 fieldm 的值在集合中,就满足查询条件,该记录会被查询出来,否则不会被查询出来。

1 mysql> create database school;           #创建数据库school
2 mysql> use school;                  #选择数据库school
3 mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #创建表class,指定id 字段自增长
4 mysql> insert into class(id, name, teacher) values(1, '一班', 'ABC'),(2,'二班', 'BCD'),(3, '三班', 'CDE'),(4,'四班', 'DEF'); # 插入多条记录
5 mysql> select * from class where teacher in ('ABC','BCD') ;     #查询 class 表中的 teacher 域是 ABC 和 BCD 的记录

使用 NOT IN 可以反向查询非集合中的数据

SELECT field1,field2,…,fieldn FROM tablename WHERE filedm NOT IN(value1,value2,value3,…,valuen);

集合查询的 注意: 集合中慎用 NULL

在具体使用关键字IN时,查询的集合中如果存在NULL,则不会影响查询,NULL 存不存在的效果都一样;但如果使用关键字NOT IN,查询的集合中如果存在NULL,则不会查询到任何的结果。

2.5 指定范围查询数据 BETWEEN AND

当我们需要查询指定范围内的数据(如: id 从 0 到 100)的时候,MySQL 提供了关键字 BETWEEN AND,用来实现判断字段的数值是否在指定范围内的条件查询。该关键字的具体语法形式如下:

SELECT field1,field2,…,fieldn FROM tablename WHERE fieldm BETWEEN minvalue AND maxvalue

在上述语句中,参数fieldn表示名称为tablename的表中的字段名,通过关键字BETWEEN和AND来设置字段field的取值范围,如果字段field的值在所指定的范围内,那么满足查询条件,该记录会被查询出来,否则不会被查询出来。

BETWEEN minvalue AND maxvalue,表示的是一个范围间的判断过程,只针对数字类型。

2.5.1 符合范围的数据记录查询

通过关键字 BETWEEN 和 AND 设置查询范围,以实现查询语文成绩(字段 Chinese)在 80 和 90 之间的学生,具体 SQL 如下:

1 mysql>  create database school;      # 创建数据库school
2 mysql> use school;             # 选择数据库school
3 mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, chinese tinyint unsigned, create_date date);       # 创建成绩表 grade
4 mysql> insert into grade values(1, '甲', 80,'2020-02-03'),(2,'乙', 72, '2020-05-01'),(3, '丙', 87,'2020-04-21'),(4,'丁', 89, '2020-06-04');    # 插入多条记录
5 mysql> select * from class where chinese between 80 and 90 ;               # 查询成绩表中语文成绩在 80 和 90 之间的学员记录
6 mysql> select * from grade where create_date between '2020-05-01' and '2020-06-04'   # 查询日期之间的数据

2.5.2 不符合范围的数据记录查询

通过关键字 NOT 设置反向查询非查询范围的条件,具体 SQL 语句如下:

SELECT name,chinese FROM grade WHERE Chinese NOT BETWEEN 85 AND 90;

上面语句等同于: 

select name,chinese from grade where chinese < 85 or chinese > 90;

2.6 模糊查询 LIKE

当我们只想用字符串中间的一部分特征查找含有特征字串的信息时,MySQL提供了关键字LIKE来实现模糊查询,需要使用通配符,具体语法形式如下:

SELECT field1,field2,…,fieldn FROM tablename WHERE fieldm LIKE value; 

在上述语句中,参数tablename表示表名,参数fieldn表示表中的字段名字,通过关键字LIKE来判断字段field的值是否与value字符串匹配,如果相匹配,则满足查询条件,该记录就会被查询出来;否则就不会被查询出来。

在MySQL中,字符串必须加上单引号('')和双引号(″″)。由于关键字LIKE可以实现模糊查询,因此该关键字后面的字符串参数除了可以使用完整的字符串外,还可以包含通配符。LIKE关键字支持的通配符如表5-1所示。

符号 功能描述
_ 该通配符值能匹配单个字符
% 

该通配符可以匹配任意长度的字符串,既可以是0个字符\1个字符, 也可以是很多字符

以下给出几种查询示例

2.6.1 查找某个字段含有某个文字的记录:

SELECT * FROM class WHERE teacher LIKE ‘%三%’;

注意:  将会把 teacher 字段为 “三爷”,“张三”,“张猫三”、“三脚猫”,“唐三藏” 等等含 “三” 的记录全找出来。

2.6.2 查找既有 某个字 又有 另一个字 的记录

使用 and 条件,查找既有 "三" 又有 "猫", 可以分别查找多个字段

SELECT * FROM class WHERE teacher LIKE ‘%三%’ AND teacher LIKE ‘%猫%’;

2.6.3 查询某个字段中既有 某个字 又有 另一个字 的记录,同时区分文字先后

SELECT * FROM class WHERE teacher LIKE ‘%三%猫%’;

注意:  虽然能搜索出 “三脚猫”,但不能搜索出符合条件的“张猫三” 。

2.6.4 找出规定字数 且规定某个字的

SELECT * FROM [user] WHERE u_name LIKE ‘_三_’;

注意:_表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文字符)

找出“三脚猫”这样teacher为三个字且第一个字是“三”的;

SELECT * FROM class WHERE teacher LIKE ‘三__’;

2.7 对查询结果排序 ORDER BY

在MySQL中,从表中查询出的数据可能是无序的,或者其排列顺序不是用户所期望的顺序,为了使查询结果的顺序满足用户的要求,可以使用关键字 ORDER BY 对记录进行排序,其语法形式如下:

SELECT field1, field2, field3, …, fieldn FROM tablename ORDER BY fieldm [ASC|DESC] 

在上述语句中

参数 tablename 表示所要进行排序的表名,

参数 fieldn 表示表中的字段名字,

参数 fieldm 表示按照该字段进行排序;ASC 表示按升序进行排序;DESC 表示按降序进行排序。默认的情况下按 ASC 进行排序。

注意:如果存在一条记录字段的值为空值(NULL),那么按升序排序时,含空值的记录将最先显示,可以理解为空值是该字段的最小值;按降序排列时,字段为空值的记录将最后显示。

(1)执行 SQL 语句 SELECT ,查询表 grade 中所有的数据记录,按照语文成绩(字段 chinese)升序排序,具体SQL语句如下:

SELECT id,name,chinese FROM class ORDER BY chinese ASC; 
1 mysql>  create database school;   #创建数据库school
2 mysql> use school; #选择数据库school
3 mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, chinese tinyint unsigned); # 创建成绩表 grade
4 mysql> insert into grade values(1, '甲', 87),(2,'乙', 64),(3, '丙', 69),(4,'丁', 79);                   # 插入多条记录
5 mysql> SELECT id,name,chinese FROM class ORDER BY chinese ASC; #按升序的方式查询学员记录

2.8 简单分组查询

MySQL软件提供了5个统计函数来帮助用户统计数据,可以使用户很方便地对记录进行 统计数、计算和、计算平均数、计算最大值最小值,而不需要查询所有数据。

在具体使用统计函数时,都是针对表中所有记录数或指定特定条件(WHERE子句)的数据记录进行统计计算。在现实应用中,经常会先把所有数据记录进行分组,再对这些分组后的数据记录进行统计计算。

MySQL 通过 SQL 语句 GROUP BY 来实现,分组数据查询语法如下:

SELECT function()[,filed ]FROM tablename WHERE CONDITION GROUP BY field;

在上述语句中,参数 field 表示某字段名,通过该字段对名称为 tablename 的表的数据记录进行分组。

注意:在具体进行分组查询时,分组所依据的字段上的值一定要具有重复值,否则分组没有任何意义。

2.8.1 五个统计之一 统计数量

COUNT(*):该种方式可以实现对表中记录进行统计,不管表字段中包含的是 NULL 值还是非 NULL 值。

COUNT(field): 该种方式可以实现对指定字段的记录进行统计,在具体统计时将忽略NULL值。

2.8.2 五个统计之二 统计计算平均值

该函数只有一种使用方式。

AVG(field) 使用方式:该种方式可以实现对指定字段的平均值进行计算,在具体统计时将忽略NULL值。

2.8.3 五个统计之三 统计计算求和

该函数只有一种使用方式。

SUM(field) 使用方式:该种方式可以实现计算指定字段值之和,在具体统计时将忽略NULL值。

2.8.4 五个统计之四 统计最大值

该函数只有一种使用方式。

MAX(field)使用方式: 该种方式可以实现计算指定字段值中的最大值, 在具体统计时将忽略NULL值。

2.8.5 五个统计之五 统计最小值

该函数只有一种使用方式。

MIN(field) 使用方式:该种方式可以实现计算指定字段值中的最小值,在具体统计时将忽略NULL值。

2.9 统计分组查询

在MySQL中,只实现简单的分组查询有时候可能没有任何实际意义,因为关键字 GROUP BY 单独使用时,默认查询出每个分组中随机的一条记录,具有很大的不确定性,一般建议将分组关键字与统计函数一起使用。

如果想显示每个分组中的字段,可以通过函数 GROUP_CONCAT() 来实现。该函数可以实现显示每个分组中的指定字段,函数的具体语法形式如下:

SELECT GROUP_CONCAT(field) FROM tablename WHERE CONDITION GROUP BY field;

在上述语句中会显示每个数组中的字段值。

执行SQL语句GROUP_CONCAT(),显示每个分组,具体SQL语句如下:

1 mysql> create database school;     #创建数据库 school
2 mysql> use school;         #选择数据库 school
3 mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, math tinyint unsigned, class_id int NOT NULL); #创建成绩表 grade
4 mysql> insert into grade values(1, '甲', 80, 1),(2,'乙', 72, 2),(3, '丙', 54, 2),(4,'丁', 1);                           #插入多条记录
5 mysql> SELECT GROUP_CONCAT(name) name, sum(math) FROM grade GROUP BY class_id;               #按class_id 进行分组,统计数学总分并显示每个分组中的姓名

=========================================================================================================================

MySQL - 数据查询 - 简单查询的更多相关文章

  1. 解决:layUI数据表格+简单查询

    解决:layUI数据表格+简单查询 最近在用layui写项目,在做到用户查询时,发现在layui框架里只有数据表格,不能增加查询.于是自己摸索了一下,写个笔记记录一下. 我想要的效果: 1.定义查询栏 ...

  2. MySQL数据操作与查询笔记 • 【目录】

    持续更新中- 我的大学笔记>>> 章节 内容 第1章 MySQL数据操作与查询笔记 • [第1章 MySQL数据库基础] 第2章 MySQL数据操作与查询笔记 • [第2章 表结构管 ...

  3. 《MySQL数据操作与查询》- 综合项目 - 学生管理系统

    <MySQL数据操作与查询>综合项目需求 一.系统整体功能 维护学生信息.老师信息和成绩信息. 支持按多种条件组合查询学生信息和成绩信息. 二.系统的信息需求 一个班级有一个讲师一个班主任 ...

  4. mysql 数据操作 单表查询 简单查询 避免重复DISTINCT

    创建数据库company create database company charset=utf8; use company; company.employee 员工id id int 姓名 emp_ ...

  5. 学习笔记:oracle学习三:SQL语言基础之检索数据:简单查询、筛选查询

    目录 1. 检索数据 1.1 简单查询 1.1.1 检索所有列 1.1.2 检索指定的列 1.1.3 查询日期列 1.1.4 带有表达式的select语句 1.1.5 为列指定别名 1.1.6 显示不 ...

  6. MySQL数据优化总结-查询备忘录

    一.优化分类 二.测试数据样例 参考mysql官方的sakina数据库. 三.使用mysql慢查询日志对有效率问题的sql进行监控 第一个,开启慢查询日志.第二个,慢查询日志存储位置.第三个,没有使用 ...

  7. MySql数据and高级查询

    1.CREATE TABLE grade(stuID INT AUTO_INCREMENT PRIMARY KEY NOT NULL,stuName VARCHAR(32),stuAge INT ) ...

  8. MySQL之数据的简单查询

    我直接把我的mysql学习笔记以图片的形式粘贴在这里了,供自己回顾(都是一些简单的语句)

  9. MySQL数据连表查询思路

    我们在网站开发中,涉及MySQL数据库查询时,常常需要将两个表或多个表联合起来进行查询数据,这就用到了MySQL中的JOIN函数. JOIN函数有三种,分别是: LEFT JOIN  左连接查询: 查 ...

随机推荐

  1. 【应用服务 App Service】解决无法从Azure门户SSH登录问题

    问题描述 中国区的Azure App Service(应用服务)已经支持创建Docker并选择Linux环境.在使用中,我们可以继续通过kudu站点的方式登录查看站点的一些日志及部署文件.它的登录方式 ...

  2. 电脑装MySQL免安装版配置失败提示系统错误2怎么解决?

    一·准备工作 我下载安装的版本是:mysql-8.0.16-winx64(免安装版) 下载地址:https://www.mysql.com/ (官网地址)https://cdn2.lmonkey.co ...

  3. SQL优化思路与解决方案

    1.面对问题SQL的思考 这条查询SQL的语句到底有没有问题? 存在什么问题? 什么情况下存在问题? 怎么去优化? 2.SQL优化思路 where查询字段是否建立索引? 是否有建立索引但是查询时候没有 ...

  4. Leetcode 021 Merge Two Sorted Lists

    摘要:Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...

  5. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  6. 从Linux源码看Socket(TCP)的accept

    从Linux源码看Socket(TCP)的accept 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就从Linux源码的角度看下Serve ...

  7. 关于RequestParam在不同的Spring版本上,接口在controller重载时注解可能失效的踩坑记录

    先抛背景: 我项目中的Spring版本是2.0.3.RELEASE. api-demo负责暴露接口,service-demo负责实现功能.接口参数的@RequestParam和@RequestBody ...

  8. django 自定义存储上传文件的文件名

    一.需求: Django实现自定义文件名存储文件 使文件名看起来统一 避免收到中文文件导致传输.存储等问题 相同的文件也需要使用不同的文件名 二.实现思路: 思路: 生成14位随机字母加数字.后10位 ...

  9. [ASIS 2019]Unicorn shop

    点击进去之后是一个购买独角兽的界面,有四种类型的独角兽,前三种的价格比较便宜,最后的独角兽价格比较贵. 我们先尝试购买前三种独角兽,输入id,然后price输入9 然后就告诉我商品错了,可能复现靶场这 ...

  10. 团队作业6(B)-事后诸葛亮分析

    白给团队e-shop项目Postmortem结果 (整理:政B) 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚? 答:主要是为商户和消费者提供一个网上交易商品的平台,定义明确. 2.我们 ...