MySQL 入门(九)—— 查询数据

查询数据就是从数据库中获取所需要的数据。

1、基本查询语句

即Select语句

其中,属性列表表示要查询的字段名;表名和视图列表表示从此处指定的表或者视图中查询数据,可以有多个;条件表达式1制定了查询的条件;属性名1指按该字段中的数据进行分组;条件表达式2表示满足该表达式的数据才能被输出;属性名2指按该字段中的数据进行排序,默认顺序为升序ASC,即按从小到大的顺序排列。

Group by子句通常和Count()、Sum()等聚合函数一起使用。

2、单表查询

单表查询顾名思义即从一张表中查询所需数据。

2.1 查询所有字段

具体可分为以下两种方法

(1)列出表的所有字段

即在select语句的属性列表中列出所要查询的表中的所有的字段。

(2)使用*查询所有字段

即使用*符号代替select语句中的属性列表。

显然这种方法简单方便很多。但是使用这种方式只能按照表中字段的顺序进行排列,不能改变字段的排列顺序。

2.2 查询指定字段

顾名思义,就是在属性列表中列出所要查询的指定字段即可。

2.3 查询指定记录

即设定查询条件语句where字句。where子句中常用的查询条件包括

(1)带关键字IN的查询

IN关键字可以判断某个字段的值是否在指定的集合中,其语法规则为

[NOT] IN (元素1,元素2,···,元素n)

其中,元素n表示集合中的元素,注意字符型元素需要加上单引号。

(2)带Between And的范围查询

Between And关键字可以判读某个字段的值是否在指定的范围内,语法规则如下

[NOT] Between 取值1 And 取值2

即选取满足大于等于取值1,二小于等于取值2的范围。

(3)带LIKE的字符匹配查询

Like关键字可以匹配字符串是否相等,语法规则如下

[NOT] Like ‘字符串’

字符串参数的值可以是一个完整的字符串,也可以是包含%或者_的通配字符。其中,%可以代表任意长度的字符串,长度可以为零;_只能表示单个字符。

注意需要匹配的字符串需要加引号,可以单引号也可以双引号。如果要匹配中文,注意一个汉字是两个字符,所以使用_的话应该用两个,例如匹配江某,匹配的字符串应该为“江 _ _”。

(4)查询空值

Is NULL关键字可以用来判断字段的值是否为空值,语法规则为

Is [NOT] NULL

(5)带AND的多条件查询

And关键字可以用来联合多个条件进行查询,语法规则为

条件表达式1 AND 条件表达式2 [··· AND 条件表达式n]

(6)带OR的多条件查询

Or关键字可以用来联合多个条件进行查询,语法规则为

条件表达式1 OR 条件表达式2 [··· OR 条件表达式n]

2.4 查询结果不重复

如果表中的某些字段上没有唯一性约束,这些字段可能存在重复的值。select语句可以使用distinct关键字来消除重复的记录,语法规则为

select distinct 属性名

2.5 对查询结果排序

即使用select语句中的order by子语句。

注意,如果存在一条记录的某字段的值为空值时,在ASC参数情况下,这条记录将显示为第一条记录,而DESC时,则显示为最后一条。

2.6 分组查询

即使用group by关键字将查询结果按某个字段或者多个字段进行分组,字段中值相等的为一组。具体为

Group by 属性名 [Having 条件表达式] [With ROLLUP]

其中with rollup关键字将会在所有记录的最后加上一条记录,该记录为上面所有记录的总和,注意,对于数字类类型,这个总和即将其相加,对于字符串类型,则是取集合,更多情况有待实验。

2.7 利用Limit限制查询结果的数量

Limit时MySQL中的一个特殊关键字,可以用来指定查询结果从哪条记录开始显示,也可以指定一共显示多少条记录。

(1)不指定初始位置

此时记录从第一条记录开始显示,二显示记录的条数由Limit指定,语法为

Limit 显示记录数

此子句用在select语句的“From 表名和视图列表”之后。

(2)指定初始位置

即从该位置开始显示并且可以指定显示多少条记录,语法为

Limit 初始位置, 记录数

注意在MySQL系统中,第一条记录的位置是0。

3、使用集合函数查询

集合函数包括Count()、Sum()、Avg()、Max()和Min(),分别用来统计记录的条数、计算字段的值的总和、计算字段的值的平均值、查询字段的最大值和查询字段的最小值。

这些集合函数除了和group by一起使用外,还可以直接用在select后的属性列表中,即作属性使用。

注意,后两者不仅适用于数值类型,也适用于字符类型,即字母a最小,字母z最大,按ASCII码来比较。

4、连接查询

连接查询是将多个表按某个条件连接起来,从中选取需要的数据。

以两个表为例,当两个表中存在表示相同意义的字段时,可以通过该字段来连接这两个表,当该字段的值相等时,就查询出该记录。

连接查询包括内连接查询和外连接查询。

4.1 内连接查询

最常用的连接查询方式。

举个例子,假设表employee和表department中的d_id字段都是表示部门号,从而可以通过该字段将两个表进行内连接查询。假设我们从表employee中查询出num、name、d_id、age和sex这几个字段,从表department中查询出d_name和function这几个字段,则select语句如下

4.2 外连接查询

相较于内连接查询,外连接查询不仅可以查询出该字段取值相等时的记录,也可以查询出该字段取值不相等时的记录,具体分为左连接查询和右连接查询,基本语法为

其中参数on后面接的就是连接条件。

(1)进行左连接查询时,可以查询出表名1所指的表中的所有记录,而表名2所指的表中,只能查询出匹配的记录。

(2)进行左连接查询时,反之。

连接查询中使用最多的还是内连接查询。

5、子查询

子查询是将一个查询语句嵌套在另一个查询语句中,即实现多表之间的查询。内层查询语句的查询结果,为外层查询语句提供查询条件。

子查询中可能包括IN、NOT IN、ANY、ALL、EXISTS和NOT EXISTS等关键字,还可能包含比较运算符。

5.1 带IN关键字的子查询

在上例中,查询的过程就是,先确定表department中的所有d_id,然后显示出表employee中d_id和前面d_id相同的记录们。

5.2 带比较运算符的子查询

比较运算符<>和!=是等价的。

在上例中,查询的过程就是,先从表employee中招待年龄为24的员工的d_id,然后显示出表depatment中年龄不为24的员工的d_id和d_name信息。

5.3 带EXISTS关键字的子查询

使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。如果内层查询语句查询到满足条件的结果,就返回一个TRUE,外层查询语句将进行查询,如果内层没查到返回一个FALSE,外层查询语句将不进行查询或者查询不出任何记录。

EXISTS关键字还可以与其他的查询条件一起使用,条件表达式与EXISTS关键字一起使用时用AND或者OR连接。

5.4 带ANY关键字的子查询

Any关键字表示满足其中任一条件,即使用ANY关键字时,只要满足内层查询语句返回的结果中的任意一个,就可以通过该条件来执行外层查询语句。

ANY关键字通常与比较运算符一起使用,例如>ANY表示大于任何一个值。

5.5 带ALL关键字的子查询

All关键字标是满足所有条件,即使用All关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。

同样,ALL关键字通常与比较运算符一起使用,例如>ALL表示大于所有值。

6、合并查询结果

合并查询结果是将多个select语句的查询结果合并到一起显示。

进行合并操作可以使用UNION和UNION ALL关键字,使用UNION时,数据库系统会将所有的查询结果合并到一起然后去除掉相同的记录,类似于进行集合;而使用UNION ALL时,只是将所有查询结果进行简单合并,并不剔除相同的记录。

7、为表和字段取别名

在查询时,可以为表和字段取一个别名,这个别名可以代替其指定的表和字段。

7.1 为表取别名

基本形式为

表名 表的别名

通过这种方式,表的别名就可以在此次查询中代替表名了。

7.2 为字段取别名

基本形式为

属性名 [AS] 别名

其中,属性名为字段原来的名称,AS关键字可有可无,实现的作用都是一样的。

注意,字段的别名只是在显示的时候用来替代字段本来的名称,在查询条件中是不能使用这个定义的别名的,即在条件表达式中,不能使用字段的别名。

8、使用正则表达式查询

正则表达式就是用某种模式去匹配一类字符串的一种方式,比前面提到的通配字符的查询能力强大很多也更加灵活。

MySQL中使用Regexp关键字来匹配查询正则表达式,基本形式为

属性名 Regexp ‘匹配方式’

下面是正则表达式的匹配方式常用的模式字符

下面我们一一进行举例

(1)从info表的name字段中查询以字符串’LLL’开头的记录

Select * from info where name regexp ‘^LLL’;

(2)从info表的name字段中查询以字母’a’结尾的记录

Select * from info where name regexp ‘a$’;

(3)从info表的name字段中查询以字母’L’开头,以字母’y’结尾,中间有两个任意字符的记录

Select * from info where name regexp ‘^L..y$’;

(4)从info表的name字段中查询包含数字或者字母a,b和c的记录

Select * from info where name regexp ‘[0-9a-c]’;

如果需要匹配字母a,b和c,则[abc],每个字符之间不需要符号隔开;如果要匹配所有字母,可以适用[a-zA-Z],即a与z之间用-隔开,z与A之间不用符号隔开。

(5)从info表的name字段中查询不含字母a到w和数字的记录

Select * from info where name regexp ‘[^a-w0-9]’;

(6)从info表的name字段中查询包含ic、uc和ab这三个字符串中任意一个的记录

Select * from info where name regexp ‘ic|uc|ab’;

注意每个字符串与|之间不能有空格,否则查询过程中,空格也会被当做一个字符。

(7)从info表的name字段中查询字母’c’之间出现过字母’a’的记录

Select * from info where name regexp ‘a+c’;

如果用*替代上面的+,则由于可表示0个,所以的不能目标结果。

(8)从info表的name字段中查询出现过’ab’最少一次最多三次的记录

Select * from info where name regexp ‘ab{1,3}’;

时间: 2024-08-05 15:01:15

MySQL 入门(九)—— 查询数据的相关文章

MySQL入门-11:数据的增、删、改

1.数据插入 2.数据更新 3.数据删除 4.更新和删除的指导原则 1.数据插入-INSERT 插入数据可以使用以下几种方式: 插入完整的行 插入行的一部分 插入多行 插入某些查询的结果 Syntax: INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]     [INTO] tbl_name [(col_name,...)]     {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

php 基本连接mysql数据库和查询数据

连接数据库,有三种方法 1. 常规方式: $con=mysql_connect($dbhostip,$username,$userpassword) or die("Unable to connect to the MySQL!"); $db = mysql_select_db($dbdatabasename,$con);//执行语句 $qres=mysql_query("SELECT id,GoodsName FROM user"); //提取一条数据 11 $r

MySql数据库,查询数据导出时会出现重复的记录(数据越多越明显)

在查询数据时,数据量多的时候,我们会使用分页功能. 每页显示多少数据. 这种情况下,一半看不出什么问题. 而导出数据时,有时就是通过分页的方法,逐步讲数据追加到导出文件中. 当全部数据都导出之后,就有可能会出现重复的记录数. 原因也算简单,MySql排序字段如果有相同的值,如果没有其他限定,不能保证每次都是同样的顺序. 有可能A在前,B在后,也可能反过来. 这样如果翻页时正好交换了,可能就会出现两个A,少各B. 解决办法就是增加一个不会重复的字段排序.比如ID(自增)字段,一定不会重复. 这样就

Mysql入门到精通之数据表的操作

修改表 ALTER TABLE tb_name; 1.添加字段 ALTER TABLE tb_name ADD 字段名字 字段类型 约束条件 [FIRST/AFTER 字段名称] 1>添加用户名字段 ALTER TABLE test ADD username VARCHAR(20); 2>将字段test添加到表中第一个字段 ALTER TABLE test ADD test VARCHAR(20) FIRST; 3>在id之后添加年龄字段 ALTER TABLE test ADD age

java实现连接mysql数据库单元测试查询数据项目分享

1.按照javaweb项目的要求逐步建立搭建起机构,具体的类包有:model .db.dao.test;具体的架构详见下图: 2.根据搭建的项目架构新建数据库test和数据库表t_userinfo并且添加对应的测试数据; (这里我使用的是绿色版的数据库,具体的下载地址:http://pan.baidu.com/s/1mg88YAc) 具体的建立数据库操作详见下图: 3.编写包中的各种类代码,具体参考代码如下: UserInfo.java /** * FileName: UserInfo.java

IntelliJ IDEA2017 java连接mysql数据库并查询数据

最近自己开始重新学习java基础了,做java开发不可避免要处理数据库,由于好久不写java了,对idea也有点陌生了.所以这里写篇用jdbc来连接mysql的文章 至于mysql怎么装,请自行百度 不多说先看代码 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;

MySQL 查询数据:语法及案例剖析

MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据. 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据. 语法 以下为在MySQL数据库中查询数据通用的 SELECT 语法: SELECT column_name,column_name FROM table_name [WHERE Clause] [LIMIT N][ OFFSET M] 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查

mysql分库 分页查询

Mysql海量数据分表分库如何列表分页? 1.现在使用ElasticSearch了.基于Lucene的解决方案 2.必须将mysql里的数据写入到类似hbase这样的分布式数据库,查询快.但分页.查询的话,可以在hbase前加一层solr,用于建立数据索引 如何对分库后的数据进行分页查询? yeyingsheng 发布于 2015/04/21 10:18 阅读 7K+ 收藏 1 答案 7 Spring iBATIS si项目,现在连接6台mysql数据库,路由分库算法是根据id的hash值%6,

【数据库】9.0 MySQL入门学习(九)——获得数据库和表的信息、日期计算、查询

1.0 SELECT语句用来从数据表中检索信息. SELECT what_to_select FROM which_table WHERE conditions_to_satisfy; what_to_select指出你想要看到的内容,可以是列的一个表,或*表示"所有的列". which_table指出你想要从其检索数据的表. WHERE子句是可选项,如果选择该项,conditions_to_satisfy指定行必须满足的检索条件. 2.0 在我的博文"MySQL入门学习(八