MySQL学习——查询表里的数据

摘要:本文主要学习了使用DQL语句查询表里数据的方法。

数据查询

语法

 select [distinct] 列1 [as '别名1'], ..., 列n [as '别名n'] from 表名
[where 表达式]
[group by 表达式]
[having 表达式]
[order by 表达式]
[limit 起始编号, 查询条数]

说明

 列1, ..., 列n:表示查询的字段,查询多个字段用“,”分隔,使用“*”号表示查询全部字段,使用“distinct”关键字去重,使用“as”设置别名。
表名:表示查询数据的来源,可以是单个或多个,多个表名用,分隔。
where 表达式:可选,限定查询满足的条件。
group by 表达式:可选,按照指定的字段分组。
having 表达式:可选,限定查询满足的条件,用于使用了聚合函数限定条件。
order by 表达式:可选,指明排序的方式,升序(asc)和降序(desc)。
limit 起始编号, 查询条数:可选,设置每次显示查询出来的数据条数。

查询全部和指定列

查询所有成绩,通配符“*”查询所有字段:

 mysql> select * from score;
+----+---------+-----------+-------+
| id | student | course | grade |
+----+---------+-----------+-------+
| 1 | 张三 | 计算机 | 98 |
| 2 | 张三 | 英语 | 53 |
| 3 | 李四 | 计算机 | 48 |
| 4 | 李四 | 中文 | 38 |
| 5 | 王五 | 中文 | 95 |
| 6 | 赵六 | 计算机 | 70 |
| 7 | 赵六 | 英语 | 92 |
| 8 | 赵六 | 中文 | 73 |
| 9 | 孙七 | 英语 | 94 |
| 10 | 周八 | 计算机 | 90 |
| 11 | 周八 | 英语 | 85 |
| 12 | 吴九 | 计算机 | 90 |
| 13 | 吴九 | 中文 | 55 |
+----+---------+-----------+-------+
13 rows in set (0.00 sec) mysql>

查询姓名、课程、成绩:

 mysql> select student, course, grade from score;
+---------+-----------+-------+
| student | course | grade |
+---------+-----------+-------+
| 张三 | 英语 | 53 |
| 李四 | 计算机 | 48 |
| 李四 | 中文 | 38 |
| 王五 | 中文 | 95 |
| 赵六 | 计算机 | 70 |
| 赵六 | 英语 | 92 |
| 赵六 | 中文 | 73 |
| 孙七 | 英语 | 94 |
| 周八 | 计算机 | 90 |
| 周八 | 英语 | 85 |
| 吴九 | 计算机 | 90 |
| 吴九 | 中文 | 55 |
+---------+-----------+-------+
12 rows in set (0.00 sec) mysql>

去重查询

查询所有课程名称:

 mysql> select distinct course from score;
+-----------+
| course |
+-----------+
| 英语 |
| 计算机 |
| 中文 |
+-----------+
3 rows in set (0.00 sec) mysql>

使用别名查询

查询姓名、课程、成绩并显示表头为中文,使用别名时,as可省略:

 mysql> select student '姓名', course '课程', grade '成绩' from score;
+--------+-----------+--------+
| 姓名 | 课程 | 成绩 |
+--------+-----------+--------+
| 张三 | 英语 | 53 |
| 李四 | 计算机 | 48 |
| 李四 | 中文 | 38 |
| 王五 | 中文 | 95 |
| 赵六 | 计算机 | 70 |
| 赵六 | 英语 | 92 |
| 赵六 | 中文 | 73 |
| 孙七 | 英语 | 94 |
| 周八 | 计算机 | 90 |
| 周八 | 英语 | 85 |
| 吴九 | 计算机 | 90 |
| 吴九 | 中文 | 55 |
+--------+-----------+--------+
12 rows in set (0.00 sec) mysql>

限制查询条数

查询五条成绩数据:

 mysql> select * from score limit 5;
+----+---------+-----------+-------+
| id | student | course | grade |
+----+---------+-----------+-------+
| 2 | 张三 | 英语 | 53 |
| 3 | 李四 | 计算机 | 48 |
| 4 | 李四 | 中文 | 38 |
| 5 | 王五 | 中文 | 95 |
| 6 | 赵六 | 计算机 | 70 |
+----+---------+-----------+-------+
5 rows in set (0.00 sec) mysql>

对查询结果进行排序

查询中文课程的成绩并从高到低排序:

 mysql> select * from score where course = '中文' order by grade desc;
+----+---------+--------+-------+
| id | student | course | grade |
+----+---------+--------+-------+
| 5 | 王五 | 中文 | 95 |
| 8 | 赵六 | 中文 | 73 |
| 13 | 吴九 | 中文 | 55 |
| 4 | 李四 | 中文 | 38 |
+----+---------+--------+-------+
4 rows in set (0.00 sec) mysql>

对查询结果进行分组

将成绩按课程分组并查询每个课程的平均分:

 mysql> select course, avg(grade) from score group by course;
+-----------+------------+
| course | avg(grade) |
+-----------+------------+
| 计算机 | 74.5000 |
| 英语 | 81.0000 |
| 中文 | 65.2500 |
+-----------+------------+
3 rows in set (0.00 sec) mysql>

将成绩按课程分组并查询每个课程的平均分,只显示平均分大于70的结果:

 mysql> select course, avg(grade) from score group by course having avg(grade) > 70;
+-----------+------------+
| course | avg(grade) |
+-----------+------------+
| 计算机 | 74.5000 |
| 英语 | 81.0000 |
+-----------+------------+
2 rows in set (0.01 sec) mysql>

使用条件查询

查询计算机的成绩:

 mysql> select * from score where course = '计算机';
+----+---------+-----------+-------+
| id | student | course | grade |
+----+---------+-----------+-------+
| 1 | 张三 | 计算机 | 98 |
| 3 | 李四 | 计算机 | 48 |
| 6 | 赵六 | 计算机 | 70 |
| 10 | 周八 | 计算机 | 90 |
| 12 | 吴九 | 计算机 | 90 |
+----+---------+-----------+-------+
5 rows in set (0.00 sec) mysql>

内连接查询

内连接查询返回的是同时满足两个结果集的记录。

使用inner join查询所有学生的计算机课程的成绩,inner可省略:

 mysql> select stu.*, sco.course, sco.grade
-> from student stu
-> join score sco on stu.name = sco.student and sco.course = '计算机';
+-----+--------+------+-------+------------+--------------------+-----------+-------+
| id | name | sex | birth | department | address | course | grade |
+-----+--------+------+-------+------------+--------------------+-----------+-------+
| 904 | 李四 | 男 | 1990 | 英语系 | 辽宁省阜新市 | 计算机 | 48 |
| 908 | 周八 | 男 | 1986 | 中文系 | 北京市昌平区 | 计算机 | 90 |
| 909 | 吴九 | 女 | 1996 | 中文系 | 湖北省武汉市 | 计算机 | 90 |
+-----+--------+------+-------+------------+--------------------+-----------+-------+
3 rows in set (0.00 sec) mysql>

结果仅显示有计算机成绩的记录,没有成绩的不显示。

外连接查询

外连接分为左外连接和右外连接,分别以左表和右表作为主表匹配,保留主表中存在但另一张表中不存在的的数据。

使用left join查询所有学生的计算机课程的成绩:

 mysql> select stu.*, sco.course, sco.grade
-> from student stu
-> left join score sco on stu.name = sco.student and sco.course = '计算机';
+-----+--------+------+-------+--------------+--------------------+-----------+-------+
| id | name | sex | birth | department | address | course | grade |
+-----+--------+------+-------+--------------+--------------------+-----------+-------+
| 904 | 李四 | 男 | 1990 | 英语系 | 辽宁省阜新市 | 计算机 | 48 |
| 908 | 周八 | 男 | 1986 | 中文系 | 北京市昌平区 | 计算机 | 90 |
| 909 | 吴九 | 女 | 1996 | 中文系 | 湖北省武汉市 | 计算机 | 90 |
| 903 | 张三 | 女 | 1990 | 中文系 | 湖南省永州市 | NULL | NULL |
| 905 | 王五 | 女 | 1991 | 英语系 | 福建省厦门市 | NULL | NULL |
| 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | NULL | NULL |
| 907 | 孙七 | 男 | 1985 | 计算机系 | 北京市海淀区 | NULL | NULL |
+-----+--------+------+-------+--------------+--------------------+-----------+-------+
7 rows in set (0.00 sec) mysql>

结果也显示了没有计算机成绩的记录,没有匹配到的数据使用Null表示。

子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。

子查询中常用的关键字有in和exists,也可以使用比较运算符。

in子查询

in子查询主要用于判断指定字段的值是否存在于子查询的结果集中。

如果子查询的记录较少,主查询的记录较多时使用in,因为这时用到了主表上的索引。

查询所有英语系的学生成绩:

 mysql> select * from score where student in (select name from student where department = '英语系');
+----+---------+-----------+-------+
| id | student | course | grade |
+----+---------+-----------+-------+
| 3 | 李四 | 计算机 | 48 |
| 4 | 李四 | 中文 | 38 |
| 5 | 王五 | 中文 | 95 |
+----+---------+-----------+-------+
3 rows in set (0.00 sec) mysql>

exists子查询

exists子查询主要用于判断子查询的结果集是否为空。

如果子查询的记录较多,主查询的记录较少时使用exists,因为这时用到了子表上的索引。

查询是否存在数学系的学生成绩:

 mysql> select * from score where exists (select id from student where department = '数学系');
Empty set (0.00 sec) mysql>

查询是否存在英语系的学生成绩:

 mysql> select * from score sco where exists (select stu.id from student stu where stu.department = '英语系');
+----+---------+-----------+-------+
| id | student | course | grade |
+----+---------+-----------+-------+
| 2 | 张三 | 英语 | 53 |
| 3 | 李四 | 计算机 | 48 |
| 4 | 李四 | 中文 | 38 |
| 5 | 王五 | 中文 | 95 |
| 6 | 赵六 | 计算机 | 70 |
| 7 | 赵六 | 英语 | 92 |
| 8 | 赵六 | 中文 | 73 |
| 9 | 孙七 | 英语 | 94 |
| 10 | 周八 | 计算机 | 90 |
| 11 | 周八 | 英语 | 85 |
| 12 | 吴九 | 计算机 | 90 |
| 13 | 吴九 | 中文 | 55 |
+----+---------+-----------+-------+
12 rows in set (0.00 sec) mysql>

查询所有英语系的学生成绩:

 mysql> select * from score sco where exists (select stu.id from student stu where sco.student = stu.name and stu.department = '英语系');
+----+---------+-----------+-------+
| id | student | course | grade |
+----+---------+-----------+-------+
| 3 | 李四 | 计算机 | 48 |
| 4 | 李四 | 中文 | 38 |
| 5 | 王五 | 中文 | 95 |
+----+---------+-----------+-------+
3 rows in set (0.00 sec) mysql>

比较运算符子查询

使用大于、小于、等于、不等于等其他比较运算符判断子查询是否满足。

 mysql> select * from score sco where sco.student = (select stu.name from student stu where stu.id = 903);
+----+---------+--------+-------+
| id | student | course | grade |
+----+---------+--------+-------+
| 2 | 张三 | 英语 | 53 |
+----+---------+--------+-------+
1 row in set (0.00 sec) mysql>

MySQL学习——查询表里的数据的更多相关文章

  1. MySQL学习——操作表里的数据

    MySQL学习——操作表里的数据 摘要:本文主要学习了使用DML语句操作表里数据的方法. 插入数据 语法 通过传入数据插入: insert into 表名 [(列名1, …, 列名n)] values ...

  2. MySQL时间段查询,无数据补0

    上一节提到分时间段统计,可是无数据的时候不显示,而此时我们需要让他显示0. 首先我们需要建一个时间表. CREATE TABLE `my_date` ( `date` date NOT NULL, P ...

  3. MySql学习—— 查询性能优化 深入理解MySql如何执行查询

    本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...

  4. MySQL学习笔记十一:数据导入与导出

    数据导入 1.mysqlimport命令行导入数据 在使用mysqlimport命令导入数据时,数据来源文件名要和目标表一致,不想改文件名的话,可以复制一份创建临时文件,示例如下. 建立一个文本use ...

  5. MySql频繁查询、插入数据

    当我们需要频繁地从数据库查询.插入数据时,可以将这些数据库操作汇集写到同一个类里,作为工具类直接调用. 将数据库的具体信息保存在.properties文件中,用log4j作为日志记录 MySql.ja ...

  6. MySQL学习笔记_4_MySQL创建数据表(下)

    MySQL创建数据表(下) 五.数据表类型及存储位置 1.MySQL与大多数数据库不同,MySQL有一个存储引擎概念.MySQL可以针对不同的存储需求选择不同的存储引擎. 2. showengines ...

  7. MySQL学习笔记_3_MySQL创建数据表(中)

    MySQL创建数据表(中) 三.数据字段属性 1.unsigned[无符号] 可以让空间增加一倍 比如可以让-128-127增加到0-255 注意:只能用在数值型字段 2.zerofill[前导零] ...

  8. mysql循环查询树状数据

    完整function )) ) CHARSET utf8 BEGIN ) ; ) ; SET str = ''; SET cid =cast(rootId as CHAR); WHILE cid is ...

  9. JDBC mysql 中文查询不到数据解决

    问题现象: Selenium自动测试中,使用JDBC查询mysql数据库中数据,查询条件为中文,例如: select * from XXX where name ='我是测试数据'; 查询结果为空:但 ...

随机推荐

  1. IDEA 护眼色设置

    首先做一些简单的记录,护眼色 等等的设置很久以前机器上已经设置过了,今天偶尔要在其他机器上重新做一些设置反而忘记了很多步骤, 设置后的HTML页面如下图所示: 默认情况下,当只是设置General通用 ...

  2. npm与cnpm的区别

    NPM(Node Package Manager,节点包管理器)是NodeJS的包管理器,用于节点插件的管理(包括安装,卸载和管理依赖等).NPM是随同新版的NodeJS一起安装的包管理工具,所以我们 ...

  3. PAT 1006 Sign In and Sign Out 查找元素

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  4. ASP.NET Core 2.2 WebApi 系列【六】泛型仓储模式

    为什么要使用泛型仓储?好处是? 前两章在autofac注入的时候,用的User类作为例子,写了增删改查四个接口,也就是仓储的GRUD. 当我们再添加一个实体(比如Student)时,StudentRe ...

  5. Elasticsearch核心技术与实战-简介

    讲师阮一鸣介绍ebay的Pronto团队在ebay内部管理上百个Elasticsearch集群,超过4000个数据节点.在生产环境上支持的服务有 订单搜索.商品推荐.日志管理.风险控制.IT运维.安全 ...

  6. cmdb项目-2

    1.命令插件异常处理 + 日志采集 1)为了更清楚发送客户端收集信息的状态 ,优化返回api的数据 ,变为字典存储 {状态 错误信息 数据} ,因为每个插件的每种系统下都要这个返回值我们将他单独做成类 ...

  7. thinkphp 5.x No input file specified 解决

    原规则: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond ...

  8. View和ViewGroup

    1.继承关系 2.组合关系 3.View 的绘制流程 3.1.创建R.attrs.styleable,申明需要用到的属性值,在使用时可以根据属性进行定义   3.2.extends View  ,依次 ...

  9. ABP入门教程3 - 解决方案

    点这里进入ABP入门教程目录 创建项目 点这里进入ABP启动模板 如图操作,我们先生成一个基于.NET Core的MPA(多页面应用).点击"Create my project!" ...

  10. LeetCode解题笔记 - 3. Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...