MySQL-查询数据

查询数据指从数据库中获取所需要的数据。查询数据是数据库操作中最常用,也是最重要的操作。用户可以根据自己对数据的需求,使用不同的查询方式。通过不同的查询方式,可以获得不同的数据。MySQL中是使用SELECT语句来查询数据的。

基本查询语句

查询数据是数据可以操作中最最常用的操作。通过对数据库的操作,用户可以从数据库中获取需要的数据。数据库中可能包含着无数的表,表中可能包含着无数的记录。因此,要获得所需的数据并非易事。MySQL中使用SELECT语句来查询数据。根据查询的条件不同,数据库系统会找到不同的数据。

MySQL中,select的基本语法形式如下:

SELECT  属性列表

FROM 表名和视图列表

[WHERE 条件表达式1]

[GROUP BY 属性名1[HAVING 条件表达式2]]

[ORDER BY 属性2[ASC|DESC]];

其中,‘属性列表’参数表示需要查询的字段名,‘表名和视图列表’参数表示从此处指定的表或者视图中查询数据,表盒视图可以有多个,‘条件表达式1’参数指定查询条件,‘参数名1’参数指该字段中的数据进行分组,‘条件表达式2’参数表示满足该表达式的数据才能输出,‘属性名2’参数指该字段中的数据进行排序,排序方式由‘ASC’和‘DESC’两个参数指出,ASC参数表示升序,这是默认参数,DESC参数表示按降序的顺序进行排序。

如果有where子句,就按照‘条件表达式1’指定的条件进行查询,如果没有,就查询所有记录。

如果有GROUP BY子句,就按照‘属性名1’指定的字段进行分组,如果后面带有HAVING关键字,那么只有满足‘条件表达式2’中指定的条件才能够输出。GROUP BY子句通常和count()、SUM()等聚合函数一起使用。

如果有ORDER BY子句,就按照‘属性名2’指定的字段进行排序,排序方式由‘ASC’和‘DESC’两个参数指出。默认的情况下是‘ASC’。


单表查询

单表查询是指从一张表中查询所需要的数据。查询数据时,可以从一张表中查询数据,也可以从多张表中同时查询数据。两者的查询方式由一定的区别。因为单表查询只在一张表上进行操作,所以查询比较简单。

 查询所有的字段

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

1.列出表的字段


2.使用“*”查询所有字段


查询指定字段

查询数据时,可以在select语句的‘属性列表’中列出所要查询的字段。这种方式可以指定需要查询的字段,而不需要查询出所有的字段。


查询指定条件

select语句中可以设置查询条件。用户可以根据自己的需要来设置查询条件,按条件进行查询。查询的结果必须满足查询条件。其语法规则如下:

where 条件表达式


带IN关键字的查询

IN关键字可以判断某个字段的值是否在指定的集合中。如果字段的值在集合中,则满足查询条件,该记录将被查询出来。如果不在集合中,则不满足查询条件。其语法规则如下:

[not] in (元素1,元素2,...,元素n)

in图:


not in 图:


带BETWEEN AND的范围查询

BETWEEN AND关键字可以判断某个字段的值是否在指定的范围内。如果字段的值在指定范围内,则满足查询条件,该记录将被查询出来。如果不在指定范围内,则不满足查询条件。其语法规则如下:

[NOT] BETWEEN 取值1 AND 取值2


带LIKE的字符匹配查询

LIKE关键字可以匹配字符串是否相等。如果字段的值与指定的字符串相匹配,则满足查询条件,该记录将被查询出来。如果与指定的字符串不匹配,则不满足查询条件。其语法规则如下:

[NOT] LIKE ‘字符串’

1.匹配完整字符串


2.匹配使用通配符'%'的字符串(%代表后面、中间和前面的所有字符)


3.匹配使用通配符'_'的字符串(_代表其中的一个字符)


4.not LIKE


查询空值

IS NULL关键字可以用来判断字段的值是否为空值(NULL)。如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。其语法规则如下:

IS  [NOT]  NULL

其中,“NOT”是可选参数,加上NOT表示字段不是空值时满足条件。


带AND的多条建查询

AND关键字可以用来联合多个条件进行查询。使用AND关键字时,只有同时满足所有查询条件的记录会被查询出来。如果不满足这些查询条件的其中一个,这样的记录将被排除掉。AND关键字的语法规则如下:

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

其中,AND可以连接两个条件表达式。而且,可以同时使用多个AND关键字,这样可以连接更多的条件表达式。


带OR的多条件查询

OR关键字也可以用来联合多个条件进行查询,但是与AND关键字不同,使用OR关键字时,只要满足这几个查询条件的其中一个,这样的记录将会被查询出来。如果不满足这些查询条件中的任何一个,这样的记录将会被排除掉。OR关键字的语法规则如下:

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

其中,OR可以用来连接两个条件表达式。而且,可以同时使用多个OR关键字,这样可以连接更多的条件表达式。


查询结果不重复

如果表中的某些字段上没有唯一性约束,这些字段可能存在着重复的值,例如,employee表的d_id字段就存在着重复的情况~


可以使用distinct关键字来消除字段中的重复记录,看下图:


对查询结果排序

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

ORDER BY 属性名 [ASC|DESC]

默认是升序ASC



分组查询

GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组。字段中值相等的为一组,其语法规则如下:

GROUP BY 属性名 [HAVING 条件表达式] [with rollup]

1.单独使用GROUP BY关键字来分组


2.GROUP BY关键字与GROUP_CONCAT()函数一起使用

这里先使用GROUP BY字段先进行分组查询,然后再使用GROUP_CONCAT()函数将每个分组的name字段的值显示出来,看图:


3.GROUP BY关键字与聚合函数一起使用

这里先使用GROUP BY字段先进行分组查询,取值相同的为一组,然后对每一组使用聚合函数COUNT()进行计算,求出每一组的记录数,如图:


4.GROUP BY关键字与HAVING一起使用

这里先使用GROUP BY字段先进行分组查询,然后显示记录数大于等于多少的分组,如图:


5.按多个字段进行分组


6.GROUP BY关键字与WITH  ROLLUP一起使用


用LIMIT限制查询结果的数量

查询数据时,可能会查询出很多的记录。而银行需要的记录可能只是很少的一部分。这样就需要来限制查询结果的数量。LIMIT是MySQL中的一个特殊关键字。其中可以用来指定查询结果从哪条记录开始显示。还可以指定一共显示多少条记录。LIMIT关键字有两种使用方式。这两种方式分别是不指定初始位置和指定初始位置。

1.不指定初始位置

显示前几条


2.指定初始位置

指定从第几条开始显示,然后显示多少条,0代表的是第1条,依次类推~


使用集合函数查询

集合函数包括count(),sum(),avg(),max()和min()。其中,count()用来统计记录的条数;sum()用来计算字段的值得总和;AVG()用来计算字段的值得平均值;MAX()用来查询字段的最大值;MIN()用来查询字段的最小值。当需要对表中的记录求和、求平均值、查询最大值、查询最小值等操作时,可以使用集合函数。GROUP BY关键字通常需要与集合函数一起使用。

COUNT()函数

count()函数用来统计记录的条数。如果要统计employee表中有多少条记录,可以使用该函数。如图:


sum()函数

sum()函数是求和函数。使用sum()函数可以求出表中某个字段取值的总和。例如,可以用sum()函数来求学生的总成绩。


AVG()函数

AVG()函数是求平均值的函数。使用AVG()函数可以求出表中某个字段取值的平均值。例如,可以用AVG()函数来求平均年龄,也可以使用AVG()函数来求学生的平均成绩。


MAX()函数

MAX()函数是求最大值的函数。使用MAX()函数可以求出表中某个子弹取值的最大值。例如,可以用该函数来查询最大年龄,也可以求出各科的最高成绩


MIN()函数

MIN()函数是求最小值的函数。使用MIN()函数可以求出表中某个字段取值的最小值。例如,可以用该函数来查询最小年龄,也可以求出各科的最低成绩。


连接查询

连接查询时将两个或两个以上的表按某个条件连接起来,从中选取需要的数据。连接查询是同时查询两个或两个以上的表时使用的。当不同的表中存在表示相同意义的字段时,可以通过该字段来连接这几个表。例如,学生表中有course_id字段来表示所学课程的课程号,课程表中有num字段来表示课程号。那么,可以通过学生表中的course_id字段和课程表中num字段来进行连接查询。连接查询包含内连接查询和外连接查询。

内连接查询

内连接查询是一种最常用的连接查询。内连接查询可以查询两个或两个以上的表。当两个表中存在表示相同意义的字段时,可以通过该字段来连接这两个表。当该字段的值相等时,就查询出该记录。


外连接查询

外连接查询可以查询两个或两个以上的表。外连接查询也需要通过指定字段来进行连接。当该字段取值相等时,可以查询出该记录。而且,该字段不相等的记录也可以查询出来。外连接查询包括左连接查询和右连接查询。其基本语法如下:

SELECT 属性名列表 from 表名1 left|right join 表名2 on 表名1.属性名1=表名2.属性名2

1.左连接查询

当表名1中有值,而表名2没值的时候,表名2值就显示null,按照表名1的值来显示


2.右连接查询

当表名1中有值,而表名2没值的时候,表名1的值就不显示,按照表名2的值来显示


复合条件连接查询

在连接查询时,也可以增加其他的限制条件。通过多个条件的复合查询,可以使查询结果更加准确。例如,当employee表和department表进行连接查询时,可以限制age字段的取值必须大于24。这样,可以更加准确的查询出年龄大于24岁的员工的信息。


子查询

子查询是将一个查询语句嵌套在另一个查询语句中。内层查询语句的查询结果,可以为外层查询语句提供查询条件。因为在特定情况下,一个查询语句的条件需要另一个查询语句来获取。例如,现在需要从学生成绩表中查询计算机系学生的各科成绩。那么,首先就必须知道哪些课程是计算机学生选修的。因此,必须先查询计算机系学生选修的课程,然后根据这些课程来查询计算机系学生的各科成绩。通过子查询,可以实现多表之间的查询。子查询可能包含in,not in,any,all,exists,not exists等关键字。子查询还可能包含比较运算符,如=,!=,>和<等。

带in关键字的子查询

一个查询语句的条件可能落在另一个select语句的查询结果中。这可以通过in关键字来判断。例如查询employee表中的记录,这些记录的d_id字段的值必须在department表中出现过。如图所示:


带比较运算符的子查询

子查询可以使用比较运算符。这些比较运算符包含=,!=,>,<,<=,<>等。其中<>与!=是等价的。比较运算符在查询时使用的非常广泛。如查询分数,年龄,价格,收入等。例如从computer_stu表中查询获得一等奖学金的学生的学号、姓名和分数,各个等级的奖学金的最低分存储在scholarship表中,如图:

带EXISTS关键字的子查询

EXISTS关键字表示存在。使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。如果内层查询语句查询到满足条件的记录,就返回一个真值(true)。否则,就返回一个假值(FALSE)。当返回的值是真值时,外层查询语句将进行查询,当返回值是假值时,外层查询语句不进行查询或者查询不出任何记录。


带ANY关键字的子查询

ANY关键字表示满足其中任一条件。使用ANY关键字时,只要满足内层查询语句返回的结果中的任何一个,就可以通过该条件来执行外层查询语句。例如,需要查询哪些同学能够获得奖学金。那么,首先必须从奖学金表中查询出各种奖学金要求的最低分。只要一个同学的成绩高于不同奖学金的最低分的任何一个,这个同学就可以获得奖学金。ANY关键字通常与比较运算符一起使用。


带ALL关键字的子查询

ALL关键字表示满足所有条件。使用ALL关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。例如,需要查询哪些同学能够获得一等奖学金。首先必须从奖学金表中查询出各种奖学金要求的最低分。因为一等奖学金要求的分数最高,只有当同学的成绩高于所有奖学金的最低分时,才可能获得一等奖学金。ALL关键字也经常与比较运算符一起使用。如图:


合并查询结果

合并查询结果是将多个SELECT语句的查询结果合并到一起。因为某种情况下,需要将几个SELECT语句查询出来的结果合并起来显示。例如,现在需要显示公司甲和公司乙这两个公司所有员工的信息。这就需要从公司甲中查询出所有员工的信息,再从公司乙中查询出所有公司的信息。然后将两次查询到的结果合并到一起。进行合并操作使用UNION和UNION ALL关键字。

使用UNION关键字时,数据库系统会将所有的查询结果合并到一起,然后去掉相同的记录。而UNION ALL关键字则只是简单的合并到一起。其语法规则如下:

SELECT 语句1 UNION|UNION ALL SELECT 语句2  UNION|UNION ALL........ SELECT 语句n;


为表和字段取别名

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

为表取别名

当表的名称特别长时,在查询时直接使用表名很不方便。这时可以为表取一个别名。用这个别名代替表的名称。

MySQL中为表取别名的基本形式如下: 

表名 表的别名


为字段取别名

当查询数据时,MySQL会显示每个输出列的名词。默认的情况下,显示的列明是创建表定义的列名。MySQL中为字段取别名的基本形式如下:属性名 [AS] 别名,看图:


使用正则表达式查询

正则表达式是用某种匹配模式去匹配一类字符串的一个方式。例如,使用正则表达式可以查询出A,B,C其中任何一字符的字符串。正则表达式的查询能力比通配字符的查询能力更强大,而且更加的灵活。正则表达式可以用于非常复杂的查询。MySQL中,使用REGFEXP关键字来匹配查询正则表达式。

其基本形式如下:属性名 regexp ‘匹配方式’

查询以特定字符或字符串开头的记录

使用字符“^”可以匹配以特定字符或字符串开头的记录

下面从info表name字段中查询以字母“L”开头的记录。代码如下:SELECT * FROM INFO WHERE NAME REGEXP '^L';


匹配字符串也是同种方式,看图:


查询以特定字符或字符串结尾的记录

使用字符“$”可以匹配以特定字符或字符串结尾的记录。

看图:


用符号“.”来代替字符串中的任意一个字符

用正则表达式来查询时,可以用“.”来替代字符串中的任意一个字符。看图:


匹配指定字符中的任意一个

使用方括号([])可以将需要查询字符组成一个字符集。只要记录中包含方括号中的任意字符,该记录将会被查询出来。例如,通过“[abc]”可以查询包含这3个字母中任何一个的记录。看图:


第二个查询语句是查询包含0-9数字的记录,第三个是查询a-c或者0-9的记录

下面从info表name字段中查询包含a到w字母和数字之外开头的字符的记录,看图:


匹配指定字符串

正则表达式可以匹配字符串。当表中的记录包含这个字符串时,就可以将该记录查询出来。如果指定多个字符串时,需要用符号“|”隔开。只要匹配这些字符串中的任意一个即可。看图:


使用“*”和“+”来匹配多个字符

正则表达式中,“*”和“+”都可以匹配多个该符号之前的字符。但是,“+”至少表示一个字符。而“*”可以表示零个字符。

看图:


使用{M}或者{M,N}来指定字符串连续出现的次数

正则表达式中,“字符串{M}”表示字符串连续出现M此,“字符串{M,N}”表示字符串连续出现至少M次,最多N次。例如,“ab{2}”表示字符串“ab”连续出现两次。“ab{2,4}”表示字符串“ab”连续出现至少两次,最多四次。



©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值