MySQL从入门到精通

第1章:MySQL基础

1.1运算符

1.1.1 算术运算符

算术运算符是MySQL中最常用的一类运算符。MySQL支持的算术运算符包括加、减、乘、除、求余。

算术运算符
符号    作用    符号    作用
+    加法运算    %    求余运算
-    减法运算    DIV    除法运算
*    乘法运算    MOD    求余运算,返回余数
/    除法运算    

加(+)、减(-)和乘(*)可以同时运算多个操作数。除号(/)和求余运算符(%)也可以同时计算多个操作数,但不建议使用。DIV和MOD这两个运算符只有两个参数。进行除法和求余的运算时,如果x2参数是0,计算结果将是空值(NULL)。

1.1.2 比较运算符

比较运算符是查询数据时最常用的一类运算符。SELECT语句中的条件语句经常使用比较运算符。比较运算符可以用于判断表中的哪些记录是符合条件的。比较运算符的符号、名称和应用示例如下表所示。

比较运算符
符号    名称    示例    符号    名称    示例
=    等于    id=5    is not null    n/a    id is not null
>    大于    id>5    between and    n/a    id between 1 and 15
<    小于    id<5    in    n/a    id in (3,4,5)
>=    大于或等于    id>=5    not in    n/a    name not in (shi,li)
<=    小于或等于    id<=5    like    匹配模式    name like ('shi%')
!=或<>    不等于    id!=5    not like    匹配模式    name not like ('shi%')
is null    n/a    id IS NULL    regexp    常规表达式    name 正规表达式
下面对几种较常用的比较运算符进行详解

1、运算符"="

"="用来判断数字、字符串和表达式等是否相等。如果相等,返回1;否则,返回0。

在使用运算符"="判断两个字符是否相同时,数据库系统是根据字符的ASCII码进行判断的。如果ASCII码相等,则表示这两个字符相同;如果ASCII码不相等,则表示两个字符不同。切记空值(NULL)不能使用“=”来判断。

2、运算符"<>"和"!="

"<>"和"!="用来判断数字、字符串、表达式是否不相等。如果不相等,则返回1,否则,返回0。这两个符号也不能用来判断空值(NULL)。

3、运算符">"

">"用来判断左边的操作数是否大于右边的操作数。如果大于,返回1;否则,返回0。同样,空值(NULL)不能使用“>”来判断。

4、运算符IS NULL

IS NULL用来判断操作数是否为空值(NULL)。操作数为NULL时,结果返回1;否则,返回0。IS NOT NULL刚好与IS NULL相反。

“=”、“<>”、“!=”、“>”、“>=”、“<”、“<=”等运算符都不能用来判断空值(NULL)。一旦使用,结果就会返回NULL。如果要判断一个值是否为空值,可以使用“<=>”、IS NULL和IS NOT NULL。

5、运算符BETWEEN AND

BETWEEN AND用于判断数据是否在某个取值返回内,其表达式如下。

x1 BETWEEN m AND n

如果x1大于或等于m,且小于或等于n,结果将返回1;否则,将返回0。

6、运算符IN

IN用于判断数据是否在某个集合中,其表达式如下。

x1 IN(值1,值2,值3,...,值n)

如果x1等于值1到值n中的任何一个值,则结果将返回1;否则,结果将返回0。

7、运算符LIKE

LIKE用来匹配字符串,其表达式如下。

x1 LIKE s1

如果x1与字符串s1匹配,结果将返回1;否则,返回0。

8、运算符REGEXP

REGEXP同样用于匹配字符串,但其使用的是正则表达式进行匹配,其表达式如下。

1.1.3 逻辑运算符

逻辑运算符用来判断表达式的真假。如果表达式是真,则结果返回1;如果表达式是假,则结果返回0。逻辑运算符又称为布尔运算符。MySQL中支持4种逻辑运算符,分别是与、或、非和异或。

逻辑运算符
符号    作用    符号    作用
&&或AND    与    !或NOT    非
||或OR    或    XOR    异或
1、与运算

'&&'或'AND'是与运算的两种表达方式。如果所有数据不为0且不为空值,结果返回1;如果存在任何一个数据为0,则结果返回0;如果存在一个数据为NULL且没有数据为0,则结果返回NULL。与运算符支持多个数据同时进行运算。

2、或运算

“||”或者“OR”表示或运算。如果数据中存在任何一个数据为非0的数字,则结果返回1;如果数据中不包含非0的数字,但包含NULL,则结果返回NULL;如果操作数中有0,则结果返回0。或运算符也可以同时操作多个数据。

3、非运算

“!”或者“NOT”表示非运算。非运算对操作数据进行按位取反,并返回与操作数据相反的操作。如果操作数据是非0数字,则结果返回0;如果操作数据是0,则结果返回1;如果操作数据是NULL,则结果返回NULL。

4、异或运算

XOR表示异或运算。只要其中任何一个操作数据为NULL,结果就返回NULL;如果两个操作数都是非0值,或者都是0,则结果返回0;如果一个为0,另一个为非0值,则结果返回1。

1.1.4 运算符的优先级

由于在实际应用中可能需要同时使用多个运算符,因此必须考虑运算符的运算顺序。

MySQL运算符使用的优先级,按照从高到低、从左到右的级别进行运算操作。

MySQL运算符的优先级
优先级    运算符
1    !
2    ~
3    ^
4    *,/,DIV,%,MOD
5    +、-
6    >>,<<
7    &
8    |
9    =,<=>,<,<=,>,>=,!=,<>,IN,IS,NULL,LIKE,REGERXP
10    BETWEEN AND,CASE,WHEN,THEN,ELSE
11    NOT
12    &&,AND
13    ||,OR,XOR
14    :=

第2章:表数据的增、删、改操作

2.1.1 使用INSERT...VALUES语句插入数据

INSERT...VALUES语句是INSERT语句最常用的语法格式。使用INSERT语句插入数据,语法格式如下

1、插入一条完整数据

(1) 在编写SQL语句之前,先查看数据表tb_admin的结构,具体代码如下

DESC db_database08.tb_admin;

(2) 编写SQL语句,先选择数据表所在的数据库,然后应用INSERT...VALUES语句实现向数据表td-admin插入一条完整的数据,具体代码如下。

USE db_database08;

INSERT INTO tb_admin VALUES(1,'mr','mrsoft','2014-09-05 10:25:20');

(3) 使用SELECT * FROM tb_admin语句来查看数据表tb_admin中的数据,具体代码如下

SELECT * FROM tb_admin;

2、插入数据记录的一部分

(1) 编写SQL语句,先选择数据表所在的数据库,然后应用INSERT..VALUES语句实现向数据表tb_admin中插入一条记录,只包括user和password字段的值,具体代码如下。

USE db_database08;

INSERT INTO tb_admin(user,password)

VALUES('rjkflm','111');

(2)使用SELECT * FROM tb_admin语句来查看数据表tb_admin中的数据,具体代码如下

SELECT * FROM tb_admin;

因为在设计数据表时,将id字段设置为自动编号,所以即使没有指定id的值,MySQL也会自动为它填上相应的编号。

3、插入多条记录

(1) 编写SQL语句,先选择数据表所在的数据库,然后应用INSERT...VALUES语句来实现向数据表tb_admin中插入3条记录,每条记录都只包括user、password和createtime字段的值,具体代码如下。

USE db_database08;

INSERT INTO tb_admin(user,password,createtime)

VALUES ('mrbccd','111','2014-09-05 10:32:26'),

('mrbccd','111','2014-09-05 10:32:26'),

('mrbccd','111','2014-09-05 10:32:26');

(2) 使用SELECT * FROM tb_admin语句来查看数据表tb_admin中的数据,具体代码如下。

SELECT * FROM tb_admin;

2.1.2 使用INSERT..SET语句插入数据

(1) 编写SQL语句,先选择数据表所在的数据库,然后应用INSERT...SET语句实现向数据表tb_admin中插入一条记录,该条记录中包括user、password和createtime字段的值,具体代码如下。

USE db_database08;

INSERT INTO tb_admin

SET user='mrbccd',password='111',createtime='2014-09-06 10:32:26';

(2) 使用SELECT * FROM tb_admin语句来查看数据表tb_admin中的数据,具体代码如下

SELECT * FROM tb_admin;

2.1.3 使用INSERT...SELECT语句插入查询结果

(1) 查看数据表tb_mrbook的结构

DESC db_database08.tb_mrbook;

(2) 查询数据表tb_mrbook中的数据,具体代码如下

SELECT * FROM tb_mrbook;

(3) 编写SQL语句,实现从数据表tb_mrbook中查询user和pass字段的值,并将其插入数据表tb_admin中,具体代码如下

INSERT INTO db_database08.tb_admin

         (user,password)

         SELECT user,pass FROM tb_mrbook

(4) 使用SELECT语句来查看数据表tb-admin中的数据,具体代码如下

SELECT * FROM tb_database08.tb_admin;

2.2 修改数据

(1) 编写SQL语句修改用户名为mrbccd的管理员密码为123,具体代码如下

UPDATE db_database08.tb_admin SET password='123' WHERE user='mrbccd';

更新时一定要保证WHERE子句的正确性,一旦WHERE子句出错,就会破坏所有改变的数据。

(2) 查看修改的数据库中的内容,代码如下

SELECT * FROM db_database08.tb-admin WHERE user='mrbccd';

第3章:数据查询

3.1 基本查询语句

SELECT语句基本语法如下

select selection_list                         //要查询的内容,选择哪些列

from 数据表名                                 //指定数据表

where primary_constraint               //查询时需要满足的条件,行必须满足的条件

group by sorting_cloumns              //如何对结果进行分组

order by sorting_cloumns              //如何对结果进行排序

having secondary_consstraint       //查询时满足的第二条件

limit count                                      //限定输出的查询结果

3.1.1 使用SELECT语句查询一个数据表

使用SELECT语句时,首先要确定要查询的列。“*”代表所有的列。例如,查询db_database09数据库的tb_manager表中的所有的数据,代码如下。

use db_database09;

SELECT * FROM tb_manager;

3.1.2 查询表中的一列或多列

针对表中的多列进行查询,只要在SELECT后面指定要查询的列明即可,多列之间用“,”分割。例如,查询tb_manager表中的id和name列数据,代码如下。

SELECT id,name FROM tb_manager;

3.1.3 从一个或多个表中获取数据

使用SELECT语句进行多表查询,需要确定所要查询的数据在哪个表中,在对多个表进行查询时,同样使用“,”对多个表进行分隔。

例如,从tb_bookinfo表和tb_booktype表中查询出tb_bookinfo.id、tb_bookinfo.bookname、tb_booktype.typename和tb_bookinfo.price字段的值,代码如下

SELECT tb.bookinfo.id,tb_bookinfo.bookname,tb_booktype.typename,

               tb_bookinfo.price from tb_booktype,tb_bookinfo;

使用WHERE子句中使用连接运算来确定表之间的联系,然后根据这个条件返回查询的结果。

例如,从tb_bookinfo表和tb_booktype表中查询出tb_bookinfo.id、tb_bookinfo.bookname、tb_booktype.typename和tb_booinfo.price字段的值,其代码如下

SELECT tb_bookinfo.id,tb_bookinfo.bookname,tb_booktype.typename,tb_booinfo.price

FROM tb_booktype,tb_bookinfo

WHERE tb_bookinfo.typeid=tb_booktype.id;

其中,使用tb_bookinfo.typeid=tb_booktype.id将表tb_bookinfo和tb_booktype连接起来,叫作等同连接;如果不使用tb_bookinfo.typeid=tb_booktype.id,那么产生的结果将是两个表的笛卡尔积,叫作全连接。

3.2 单表查询

3.2.1 查询所有字段

查询所有字段是指查询表中所有字段的数据。这种方式可以将表中所有字段的数据都查询出来。在MySQL中可以使用“*”代表所有的列,语法格式如下。

SELECT * FROM 表名;

3.2.2 查询指定字段

查询指定字段的数据可以使用下面语法格式

SELECT 字段名 FROM 表名;

如果是查询多个字段,可以使用“,”对字段进行分隔。

查询图书信息表tb_bookinfo中图书的名称和作者。从图书馆管理系统db_database09的图书信息表tb_bookinfo中查询图书的名称和作者,代码如下。

SELECT bookname,author FROM tb_bookinfo;

3.2.3 查询指定数据

如果要从很多记录中查询出指定的记录,则需要设定查询的条件。设定查询条件应用的是WHERE子句,该子句可以实现很多实现复杂的条件查询。在使用WHERE子句时,需要使用一些比较运算符来确定查询的条件。

从图书馆管理系统db_database09的管理表tb_manager中查询名称为mr的管理员,主要是通过WHERE子句实现的。具体代码如下。

SELECT * FROM tb_manager WHERE name='mr';

3.2.4 带关键字IN的查询

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

从图书管理系统db_database09的图书信息表tb_bookinfo中查询位于左A-1(对应书架编号为4)或右A-1(对应数据编号为6)的图书信息,查询语句如下

SELECT bookname,author,price,page,bookcase FROM tb_bookinfo WHERE bookcase IN(4,6);

3.2.5 带关键字BETWEEN AND的范围查询

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

从图书管理系统db_database09的借阅表tb_borrow中查询borrowTime值在2021-02-01和2021-02-28之间的借阅信息。查询语句如下。

SELECT * FROM tb_borrow WHERE borrowtime BETWEEN '2021-02-01' AND '2021-02-28';

如果要查询借阅表tb_borrow中borrowTime值不再2021-02-01和2021-02-28之间的数据,则可以通过添加NOT BETWEEN AND来完成。查询语句如下

SELECT * FROM tb_borrow WHERE borrowtime NOT BETWEEN '2021-02-01' AND '2021-02-28'

3.2.6 带LIKE的字符匹配查询

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

"%"可以匹配一个或多个字符,可以代表任意长度的字符串。"_"只匹配一个字符。

3.2.7 用IS NULL关键字查询空值

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

使用IS NOT NULL关键字查询tb_readertype表中name字段的值不为空的记录。查询语句如下。

SELECT * FOM tb_readtype WHERE name IS NOT NULL;

3.2.8 带AND的多条件查询

AND关键字可以用来联合多个条件进行查询。使用AND关键字时,只有同时满足所有查询条件的记录才会被查询出来;如果不满足查询条件中的一个,那么这样的记录将被排除。

判断输入的管理员账号和密码是否存在,即要求查询tb_manager表中name字段值为mr,并且PWD字段值为mrsoft的记录。查询语句如下。

SELECT * FROM tb_manager WHEre name='mr' AND PWD = 'mrsoft';

3.2.9 带OR的多条件查询

OR关键字也可以用来联合多个条件进行查询,但是与AND关键字不同;使用OR关键字时,只要满足查询条件中的一个,那么此记录就会被查询出来;如果不满足查询条件中的任何一个,那么这样的记录将被排除。

从图书馆管理系统查询tb_manager表中name字段值为mr或者mingrisoft的记录。查询语句如下。

SELECT * FROM tb_manager WHERE name='mr' OR name='mingrisoft';

3.2.10 用DISTINCT关键字去除结果中的重复行

使用DISTINCT关键字可以去除查询结果中的重复记录。

使用DISTINCT关键字去除tb_reader表中vocation字段中的重复记录。查询语句如下。

SELECT DISTINCT vocation FROM tb_reader;

3.2.11 用ORDER BY关键字对查询结果进行排序

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

查询tb_borrow表中的所有信息,并按照borrowTime进行降序排列。查询语句如下

SELECT * FROM tb_borrow ORDER BY borrowTime DESC;

3.2.12 用GROUP BY关键字分组查询

1、使用GROUP BY关键字分组

单独使用GROUP BY关键字,查询结果只显示每组的一条记录。使用GROUP BY关键字对tb_borrow表中bookid字段进行分组查询。查询语句如下。

SELECT bookid,COUNT(*) FROM tb_borrow GROUP BY bookid;

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

通常情况下,GROUP BY关键字会与聚合函数一起使用。

使用GROUP BY关键字和GROUP_CONCAT()函数对表中的bookid字段进行分组查询。查询语句如下。

SELECT bookid,GROUP_CONCAT(readerid) FROM tb_borrow GROUP BY bookid;

3、按多个字段分组

使用GROUP BY关键字也可以按多个字段进行分组。在分组过程中,先按照第一个字段进行分组,当第一个字段有相同值时,再按第一个字段进行分组,一次类推。

按tb_borrow表中的bookid字段和readerid字段进行分组,分组过程中,先按照bookid字段进行分组。当bookid字段的值相等时,再按照readerid字段进行分组。查询语句如下。

SELECT bookid,readerid FROM tb_borrow GRPUP BY bookid,readerid;

3.2.13 用LIMIT限制查询结果的数量

查询数据时,可能会查询出很多记录,而用户只需要很少的一部分。这样就需要限制查询结果的数量。LIMIT是MySQL中的一个特殊关键字。LIMIT子句可以对查询结果的记录条数进行限定,控制输出的行数。

具体方法是再tb_borrow1表中,按照借阅时时间进行降序排列,显示前3条记录。查询语句如下。

SELECT * FROM tb_borrow ORDER BY borrowtime DESC LIMIT 3;

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

对tb_borrow表按照借阅时间进行降序排列,并从编号2开始,查询3条记录。查询语句如下

SELECT * FROM tb_borrow ORDER BY borrowTime DESC LIMIT 2,3; 

3.2 聚合函数查询

3.2.1 COUNT()统计函数

COUNT()函数用于对除“*”以外的任何参数,返回所选择集合中非NULL值的行的数目;对于参数“*”,返回选择集合中所有行的数目,包括NULL值的行。没有WHERE子句的COUNT(*)是经过内部优化的,能够快速地返回表中所有的记录总数。

使用COUNT()函数统计tb_reader表中的记录数。查询语句如下。

SELECT COUNT(*) FROM tb_reader;

3.2.2 SUM()求和函数

SUN()函数可以求出表中某个数值类型字段取值的总和。

使用SUM()函数统计tb_bookinfo表中金额字段(price)的总和。在统计前,先来查询tb_bookinfo表中price字段的值,代码如下。

SELECT SUM(price) FROM tb_bookinfo;

3.2.3 AVG()平均数函数

AVG()函数可以求出表中某个数值类型字段取值的平均值。

使用AVG()函数求tb_bookinfo表中图书价格(price)字段值的平均值。查询语句如下。

SELECT AVG(price) FROM tb_bookinfo

3.2.4 MAX()最大值函数

MAX()函数可以求出表中某个数值类型字段取值的最大值。

使用MAX()函数查询tb_bookinfo表中price字段值的最大值。拆线呢语句如下

SELECT MAX(price) FROM tb_bookinfo;

3.2.5 MIN()最小值函数

MIN()函数的用法和MAX()函数基本相同。

3.3 连接查询

3.3.1 内连接查询

内连接是最普遍的连接类型,而且是最均称的。因为它们要求构成连接每一部分的每个表都是匹配,不匹配的行将被排除。

内连接包括相等连接和自然连接,最常见例子是相等链接,也就是使用等号运算符,根据每个表共有列的值匹配两个表中的行。这种情况下,最后的结果集只包含参加连接的表中与指定字段相等符的行。

本实例主要涉及图书信息表tb_bookinfo和借阅表tb_borrow,这两个表通过图书ID进行关联。

(1) 查询图书信息表关键数据,包括id、bookname、author、price和page字段,代码如下。

SELECT id,bookname,author,price,page FROM tb_bookinfo;

(2) 查询借阅表关键数据,包括bookid、borrowTime、backTime和ifback字段,代码如下。

SELECT bookid,borrowTime,backTime,ifback FROM tb_borrow;

(3) 通过tb_bookinfo表的id字段与tb_borrow表的bookid字段相等,因此可以使用它们创建两个表的连接关系。代码如下。

SELECT bookid,borrowTime,backTime,ifback,bookname,authoe,price

FROM tb_borrow,tb_bookinfo WHERE tb_borrow.bookid=tb_bookinfo.id;

3.3.2 外连接查询

与内连接不同,外连接是指使用OUTER JOIN关键字将连哥哥表连接起来。外连接生成的结果集不仅包含连接条件的行数据,而且包括左表、右表或两边连接表中所有的数据行。

1、左外连接

左外连接是指将坐标中的所有数据分别与右边中的每条数据进行连接组合,返回的结果除了内连接的数据,还包括左表中不符合条件的数据,并在右表的相应列中添加NULL值。

例如,使用左外连接查询图书信息表和借阅表,代码如下。

SELECT bookid,borrowTime,backTime,ifback,bookname,author,price

FROM tb_borrow LEFT JOIN tb_bookinfo ON tb_borrow.bookid=tb_bookinfo.id;

2、右外连接

右外连接(RIGHT JOIN)是指将右表中的所有数据分别与左表中的每条数据进行连接组合,返回的结果除了内连接的数据,还包括右表中不符合条件的数据,并在左表的相应列中添加NULL。

两个数据表进行右外连接,其中图书类型表(tb_bookTYPE)作为右表,图书信息表(tb_bookinfo)作为左表,两表通过图书类型ID字段进行关联,代码如下。

SELECT tb_booktype.id,days,bookname,author,price

FROM tb_bookinfo RIGHT JOIN tb_bookTyPE ON tb_booktype.id=tb_bookinfo.typeid

3.3.3 复合条件连接查询

在连接查询时,也可以增加其他的限制条件。多个条件的复合查询可以使查询结果更加准确。

在内连接的基础上,加上判断归还字段的值是否等于0的条件,具体代码如下。

SELECT bookid,borrowTime,backTime,ifback,bookname,author,price

FROM tb_borrow,tb_bookinfo WHERE tb_borrow.bookid=tb_bookinfo.id AND ifback=0;

4.1 子查询

子查询就是SELECT查询是另一个查询的附属。MySQL可以嵌套多个查询,在外面一层的查询中使用里面一层查询产生的结果集。

当遇到这样的多层查询时,MySQL从最内层的查询开始,然后向外向上移动到外层查询,在这个过程中,每个查询产生的结果集都被赋给包围它的父查询,接着这个父查询被执行,其结果也被指定给它的父查询。

4.1.1 带IN关键字的子查询

只有子查询返回的结果列包含一个值时,比较运算符才使用。假如一个子查询返回的结果集是值的列表,这时比较运算符就必须用IN运算符代替。

IN运算符可以检测结果集中是否存在某个特定的值,如果检测成功,则执行外部的查询。代码如下

SELECT id,bookname,author,price

FROM tb_bookinfo WHERE id IN(SELECT bookid FROM tb_borrow);

NOT IN关键字的作用与IN关键字刚好相反。

4.1.2 带比较运算符的子查询

子查询可以使用比较运算符,包括=、!=、>、>=、<、<=等。比较运算符在子查询时使用非常广泛。

从归还表(tb_giveback)中查询图书ID(bookid)等于7的管理员(operator),然后查询tb_manager表中姓名(name)为该管理员的信息,代码如下。

SELECT * FROM tb_manager

WHERE name = (SELECT operator FROM tb_giveback WHERE bookid=7);

4.1.3 带EXISTS关键字的子查询

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

应用带EXISTS关键字的子查询实现查询已经被借阅的图书的信息,具体代码如下。

SELECT id,bookname,author,price FROM tb_bookinfo

WHERE EXISTS (SELECT * FROM tb_borrow WHERE tb_borrow.bookid=tb_bookinfo.id);

当把EXISTS关键字与其他查询条件一起使用时,需要使用AND或者OR来连接表达式与EXISTS关键字。

NOT EXISTS与EXISTS刚好相反。

4.1.4 带ANY关键字的子查询

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

例如查询比一年级三班最低分高的全部学生信息,主要是通过ANY关键字的子查询实现查询成绩高于一年级三班的任何一名同学的学生信息,实例代码如下。

SELECT * FROM tb_student

WHERE score>ANY(SELECT score FROM tb_student WHERE classud=13);

4.1.5 带ALL关键字的子查询

ALL 关键字表示满足所有条件,通常与比较运算符一起使用。使用ALL关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。

例如查询比一年级三班最低分高的全部学生信息,主要是通过ALL关键字的子查询实现查询成绩高于一年级三班的所有同学的学生信息,实例代码如下。

SELECT * FROM tb_student1

WHERE score>ALL(SELECT score FROM tb_student1 WHERE classid=13)

4.2 合并查询结果

合并查询结果是将多个SELECT语句的查询结果合并在一起。

4.2.1 使用UNION关键字

使用UNION关键字可以将多个结果集合合并到一起,并且会去除相同记录。具体代码如下。

SELECT bookname FROM tb_bookinfo

UNION

SELECT bookname FROM tb_bookinfo1;

4.2.2 使用UNION ALL关键字

UNION ALL关键字的使用方法类似于UNION关键字,也是将多个结果集合并到一起,但是该关键字不会去除相同记录。

SELECT bookname FROM tb_bookinfo

UNION

SELECT bookname FROM tb_bookinfo1;

4.3 定义表和字段的别名

4.3.1 为表取别名

为表的名称特别长,或者进行连接查询时,在查询语句中直接使用表名很不方便,这是可以为表取一个贴切的别名。

使用左连接查询实现查询图书的完整信息,并未图书信息表指定别名为book,为图书类别表指定别名为type。

SELECT bookname,author,price,page,typename,days

FROM tb_bookinfo AS book

LEFT JOIN tb_booktype AS type ON book,typeid=type.id;

4.3.2 为字段取别名

当查询数据时,MySQL会显示每个输出列的名称。

实现统计每本图书的借阅次数,并取别名为degree。

在COUNT(*)后面接上AS关键字和别名degree即可,修改后的代码如下。

SELECT bookid,COUNT(*) AS borrow_numbers FROM tb_borrow GROUP BY bookid;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值