MySQL查询数据表中数据记录(包括多表查询)

在MySQL中创建数据库的目的是为了使用其中的数据。

使用select查询语句可以从数据库中把数据查询出来。

select语句的语法格式如下:

select selection_list                  // 要查询的内容,选择哪些列
from table_list // 从什么表中查询,从何处选择行
where primary_constraint // 查询时需要满足的条件,行必须满足的条件
group by grouping_columns // 如何对结果进行分组
order by sorting_columns // 如何对结果进行排序
having secondary_constraint // 查询时满足的第二条件
limit count // 限定输出的查询结果

下面对select查询语句的参数进行详细的讲解。

首先,连接MySQL服务器,其次,选择指定的数据库:

use db_xuesheng;

要确保该数据库已经建立。

还要确保已经建立了数据表tb_chengji,并且已经添加了数据,然后才能更好地理解下面的内容。

1. selection_list

设置查询的内容。

1)如果要查询一个表中的所有列,可以将其设置为“*”。

比如,查询tb_chengji数据表中的所有列。代码如下:

select * from tb_chengji;   // 查询数据表中的所有数据

2)如果只查询一个表中的某一列或多列,可以直接输入列名,并以“,”分隔。代码如下:

select xuesheng,yuwen from tb_chengji;   // 查询数据表中xuesheng和yuwen列的数据

2. table_list——多表查询

指定查询的数据表。

既可以从一个数据表中查询,也可以从多个数据表中进行查询,多个数据表之间用“,”进行分隔,并且可以通过where子句使用连接运算来确定表之间的联系。

多表查询的sql语句格式如下:

select 表名.字段名 from 表1,表2... where 表1.字段=表2.字段 and 其它查询条件

例如,首先查看一下tb_chengji数据表中的数据记录。在上图有显示效果。

然后查看一下tb_info数据表中的数据记录。代码如下:

select * from tb_info;

下面从tb_chengji和tb_info数据表中查询yuwen大于等于100的数据记录。代码如下:

select tb_chengji.id,tb_chengji.xuesheng,xingbie,dizhi,yuwen,shuxue,yingyu from
tb_chengji,tb_info where tb_chengji.xuesheng=tb_info.xuesheng and tb_chengji.yuwen>=100;

在上面的SQL语句中,因为2个表都有id字段和xuesheng字段,为了告诉服务器要显示的是哪个表中的字段信息,所以要加上前缀。语法格式如下:

表名.字段名

tb_chengji.xuesheng=tb_info.xuesheng将表tb_chengji和tb_info连接起来,叫做等同连接。如 果不使用tb_chengji.xuesheng=tb_info.xuesheng,那么产生的结果将是两个表的笛卡尔积,叫做全连接。

3. where条件语句

在使用查询语句时,比如要从很多的记录中查询出想要的记录,就需要一个查询的条件。只有设定了查询的条件,查询才有实际的意义。

设定查询条件应用的是where子句。

通过where子句,可以实现很多复杂的条件查询。在使用where子句时,需要使用一些比较运算符。常用的比较运算符如下表所示:

运算符 名称 示例
= 等于 id=10
> 大于 id>10
< 小于 id<10
>= 大于等于 id>=10
<= 小于等于 id<=10
!=或<> 不等于 id!=10
is null n/a id is null
is not null n/a id is not null
between n/a id between 1 and 15
in n/a id in(3,4,5)
not in n/a xuesheng not in(shi,li)
like 模式匹配 xuesheng like('shi%')
not like 模式匹配 xuesheng not like('shi%')
regexp 常规表达式 xuesheng正则表达式

上表中列举的是where子句常用的比较运算符。示例中的id是记录的编号,xuesheng是表中的学生名。

例如,使用where子句,查询tb_chengji表,条件是xuesheng为李丽的数据记录。代码如下:

select * from tb_chengji where xuesheng='李丽';

提示:where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据。因此,在使用where子句时,条件中不能包含聚合函数来显示特定的行。

4. GROUP BY对结果分组

通过GROUP BY子句,可以将行数据划分成较小的组,以实现对记录进行分组查询。在与AVG()函数或SUM()函数等聚合函数一起使用时,GROUP BY子句能够发挥最大的作用。

GROUP BY子句可以将查询结果分组,并返回行的汇总信息。

在带有GROUP BY子句的查询语句中,在SELECT列表中指定的列要么是GROUP BY子句中指定的列,要么就包含在了聚合函数中。

查询语句的SELECT和GROUP BY、HAVING子句是聚合函数唯一出现的地方,因此,在where子句中不能使用聚合函数。

例如,在tb_chengji02数据表中。如下图所示:

就可以使用GROUP BY子句,按照xuesheng进行分组,求出每个学生的平均成绩。代码如下:

select xuesheng,avg(fenshu) from tb_chengji02 group by xuesheng;

group by xuesheng是按学生分组,那么在xuesheng列中,相同名字的学生就会分为一组,然后计算出它们的平均成绩。

5. HAVING子句

HAVING子句的作用是筛选满足条件的组,即在分组之后过滤数据。在HAVING子句中经常包含聚合函数。可以使用HAVING条件显示特定的组,也可以使用多个分组标准进行分组。

当在GROUP BY子句中使用HAVING子句时,查询结果中只返回满足having条件的组。

例如,在tb_chengji02表中查询总成绩大于等于280的记录。代码如下:

select xuesheng,sum(fenshu) from tb_chengji02 group by xuesheng having sum(fenshu)>=280;

我们也可以在tb_chengji02表中查询张冬雪或者李丽的总成绩大于等于270的记录是否存在,如果存在,则显示出来。代码如下:

select xuesheng,sum(fenshu) from tb_chengji02 where xuesheng='张冬雪' or xuesheng='李丽' group by xuesheng having sum(fenshu)>=270;

6. DISTINCT在结果中去除重复行

使用DISTINCT关键字,可以去除结果中重复的行。

DISTINCT语句中SELECT显示的字段只能是DISTINCT指定的字段,其他字段是不能出现的。

例如,查询tb_chengji02表,并在结果中去掉xuesheng字段中的重复数据。代码如下:

select distinct xuesheng from tb_chengji02;

7. ORDER BY对结果进行排序

使用ORDER BY可以对查询的结果进行升序(ASC)或降序(DESC)排列,在默认情况下,ORDER BY按升序输出结果。如果要按降序排列可以使用DESC来实现。

在对含有null值的列进行排序时,如果按升序排列,null值将出现在最前面;如果按降序排列,null值将出现在最后面。

例如,查询tb_chengji表中的所有信息,按照“id”进行降序排列。代码如下:

select * from tb_chengji order by id desc;

8. LIKE模糊查询

LIKE属于比较常用的比较运算符,通过它可以实现模糊查询。它有两种通配符:“%”和下划线“_”。

“%”可以匹配一个或多个字符,而“_”只能匹配一个字符。

例如,在tb_chengji表中查找所有第二个字符是“冬”的学生。代码如下:

select * from tb_chengji where xuesheng like('_冬%');

9. CONCAT联合多列

使用CONCAT函数可以联合多个字段,构成一个总的字符串。

例如,把tb_chengji表中的yuwen、shuxue和yingyu字段合并到一起,构成一个新的字符串。代码如下:

select id,xuesheng,concat(yuwen,":",shuxue,":",yingyu) as fenshu from tb_chengji;

10. LIMIT限定结果行数

LIMIT子句可以对查询结果的记录条数进行限定,控制它输出的行数。

例如,查询tb_chengji表,按照id字段降序排列,显示3条记录。代码如下:

select * from tb_chengji order by id desc limit 3;

使用LIMIT还可以从查询结果的中间部分取值。首先要定义两个参数,参数1是开始读取的第一条记录的编号(在查询结果中,第一个结果的记录编号是0,而不是1),参数2是要查询记录的个数。

select * from tb_chengji order by id desc limit 1,2;

11. 使用函数和表达式

在MySQL中,还可以使用表达式来计算各列的值,作为输出结果。表达式还可以包含一些函数。

例如,计算tb_chengji表中学生的总分数。代码如下:

select id,xuesheng,yuwen,shuxue,yingyu,sum(yuwen+shuxue+yingyu) as zongfen from tb_chengji group by id; 

或者:

select *,sum(yuwen+shuxue+yingyu) as zongfen from tb_chengji group by id; 

计算tb_chengji表中学生的三门平均分数。代码如下:

select *,format(avg(yuwen+shuxue+yingyu)/3),1) as pingjun feng from tb_chengji group by id;

在对MySQL数据库进行操作时,有时候需要对数据库中的记录进行统计,例如求平均值、最小值或最大值等,这时可以使用MySQL中的统计函数。

常用的统计函数如下表所示:

名称 说明
avg(字段名) 获取指定列的平均值。
count(字段名) 如果指定了一个字段,则会统计出该字段中的非空记录。如果在前面增加DISTINCT,则会统计不同值的记录,相同的值当做一条记录。如果使用count(*),则统计包含空值的所有记录数。
min(字段名) 获取指定字段的最小值。
max(字段名) 获取指定字段的最大值。
std(字段名) 指定字段的标准背离值。
stdtev(字段名) 与std相同。
sum(字段名) 指定字段所有记录的总和。

除了使用函数之外,还可以使用算术运算符、字符串运算符以及逻辑运算符来构成表达式。

例如,计算数学成绩打八折之后的分数。代码如下:

select *,(shuxue * 0.8) as '80%' from tb_chengji;

原文:http://www.baike369.com/content/?id=5355

MySQL查询数据表中数据记录(包括多表查询)的更多相关文章

  1. MySQL数据库基础(三)(操作数据表中的记录)

    1.插入记录INSERT 命令:,expr:表达式 注意:如果给主键(自动编号的字段)赋值的话,可以赋值'NULL'或'DEFAULT',主键的值仍会遵守默认的规则:如果省略列名的话,所有的字段必须一 ...

  2. MySQL基础(三)(操作数据表中的记录)

    1.插入记录INSERT 命令:,expr:表达式 注意:如果给主键(自动编号的字段)赋值的话,可以赋值‘NULL’或‘DEFAULT’,主键的值仍会遵守默认的规则:如果省略列名的话,所有的字段必须一 ...

  3. (转)MySQL数据表中带LIKE的字符匹配查询

    MySQL数据表中带LIKE的字符匹配查询 2014年07月15日09:56    百科369 MySQL数据表中带LIKE的字符匹配查询 LIKE关键字可以匹配字符串是否相等. 如果字段的值与指定的 ...

  4. mysql进阶(五)数据表中带OR的多条件查询

    MySQL数据表中带OR的多条件查询 OR关键字可以联合多个条件进行查询.使用OR关键字时: 条件 1) 只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来. 2) 如果不符合这些查询条件 ...

  5. MySQL表的创建和表中数据操作

    这篇文章主要介绍在navicat的命令界面操作mysql.主要涉及建立表结构,和对表中数据的增加删除修改查询等动作.站在一个新手角度的简单mysql表结构和数据操作. ☆ 准备工作 1,保证自己的电脑 ...

  6. 清除mysql表中数据

    delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内 ...

  7. Mysql清空表(truncate)与删除表中数据(delete)的区别

    来源:http://blog.is36.com/mysql_difference_of_truncate_and_delete/ 为某基于wordpress搭建的博客长久未除草,某天升级的时候发现已经 ...

  8. mysql利用navicat导出表结构和表中数据

    LZ在网上搜索了要如何导出mysql的表结构和表中数据,发现有的方法不好用 记录一下好用的方式: 用navicat打开DB链接后,点击数据库,右击选择转储SQL文件,然后选择结构和数据: 之后弹出新的 ...

  9. Sql Server删除数据表中重复记录 三种方法

    本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1 ...

随机推荐

  1. 基于jquery的页面预载入效果(loading)

    css代码: <style> #loading{ position:absolute; width:300px; top:0px; left:50%; margin-left:-150px ...

  2. js本地存储解决方案(localStorage与userData)

    WEB应用的快速发展,是的本地存储一些数据也成为一种重要的需求,实现的方案也有很多,最普通的就是cookie了,大家也经常都用,但是cookie的缺点是显而易见的,其他的方案比如:IE6以上的user ...

  3. 不要依赖hibernate的二级缓存

    一.hibernate的二级缓存   如果开启了二级缓存,hibernate在执行任何一次查询的之后,都会把得到的结果集放到缓存中,缓存结构可以看作是一个hash table,key是数据库记录的id ...

  4. 机器人操作系统ROS | 简介篇

    同样,从个人微信公众号Nao(ID:qRobotics)搬运. 前言 先放一个ROS Industrial一周年剪辑视频. ROS已经发布八周年了,在国外科研机构中非常受欢迎.目前,以美国西南研究院为 ...

  5. 热门usb无线网卡

    拓实 N910 N95 N82 N81 N89 都是3070的 拓实 N87 G618 是8187的硬功夫 216 310 217 218 300 315 335 350 370 380 510 53 ...

  6. 转: fscanf()函数详解

    以前解析有规律的文件的时候要么用正则表达式,要么就是傻傻的自己写程序来解析有规律的文件.今天突然发现c的库函数中有一个现成的可以解析有规律的文件的函数,就是fscanf()函数.哎 以前自己做了这么多 ...

  7. uva 10026 Shoemaker's Problem

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  8. Kcptun 是一个非常简单和快速的,基于KCP 协议的UDP 隧道,它可以将TCP 流转换为KCP+UDP 流

    本博客曾经发布了通过 Finalspeed 加速 Shadowsocks 的教程,大家普遍反映能达到一个非常不错的速度.Finalspeed 虽好,就是内存占用稍高,不适合服务器内存本来就小的用户:而 ...

  9. 在Linux上配置vsftpd

    一般安装好vsftpd这个服务,它的默认配置文件在这里:/etc/vsftpd/vsftpd.conf 用vim在里面可以添加一些变量控制权限之类的.还有很多chroot相关的东西,里面的变量都有作用 ...

  10. 深入 JavaScript(6) - 一静一动

    这里是JavaScript核心的内容了. 挺多的JavaScript测试题也是围绕这个出的. 这里的一静一动指的是: 静, 词法作用域 - Lexical scoping 动, 动态绑定this的值 ...