MySQL数据库的高级查询

一、数据类型

MySQL中定义数据字段的类型对你数据库的优化是非常重要的,MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型

1.1 数值型

在数值型中还可以进一步分为整数型、浮点型和定点型

1.1.1 整数型

MySQL的整型类型用于保存整数,根据取值范围的不同,整数类型可划分为5种。

image-20230607150513050

注意:

不同整数类型的取值范围是通过字节数计算出来的,一个字节数等于8位二进制数。

例如,[TINYINT]类型无符号数的最大值为2^8-1(即为255), 有符号数的最大值为2^7-1(即为127)。

其他类型的数据类型的取值范围根据同样的方法可得出

若使用无符号数据类型,需要在数据类型右边添加UNSIGNED关键字。

例如INT UNSIGNED表示无符号INT类型。

范例:

1、创建一个名为my_int表
mysql> create table my_int(   
    -> int_1 int,
    -> int_2 int unsigned,
    -> int_3 tinyint,
    -> int_4 tinyint unsigned);
Query OK, 0 rows affected (0.04 sec)

2、插入测试数据
mysql> insert into my_int values(100,1000,15,30);
Query OK, 1 row affected (0.00 sec)

mysql> insert into my_int values(100,1000,255,300);
ERROR 1264 (22003): Out of range value for column 'int_3' at row 1

由此看出来,第三个字段的取值范围超过了数据类型规定的-128-127之间了。

1.1.1.1 各数据类型的应用场景
  • TINYINT :一般用于枚举数据,比如系统设定取值范围很小且固定的场景。
  • SMALLINT :可以用于较小范围的统计数据,比如统计工厂的固定资产库存数量等。
  • MEDIUMINT :用于较大整数的计算,比如车站每日的客流量等。
  • INT、INTEGER :取值范围足够大,一般情况下不用考虑超限问题,用得最多。比如商品编号。
  • BIGINT :只有当你处理特别巨大的整数时才会用到。比如双十一的交易量、大型门户网站点击量、证券公司衍生产品持仓等。
1.1.2 浮点数类型

在MySQL中,存储的小数都是使用浮点数或定点数来表示的。浮点数的类型有2种,分别为单精度浮点数类型(float)和双精度浮点类型(double)。

image-20230607152700189

注意:

当浮点数类型使用unsigned修饰无符号时,取值范围将不包含负数。
浮点数的取值范围是理论上的极限值,但根据不同的硬件或操作系统,实际范围可能会小。
浮点数虽然取值范围很大,但精度并不高。float类型的精度为6位或7位,double类型的精度大约为15位。
如果给定的数值超出精度,可能会导致给定的数值与实际保存的数值不一致,发生精度损失。
当一个数字的整数部分和小数部分加起来达到7位时,第7位就会进行四舍五入操作。
要避免使用“=”来判断两个浮点数是否相等,因为浮点数是不准确的,存在精度损失

范例:

1、创建my_float表
mysql> create table my_float(float1 float,float2 float);
Query OK, 0 rows affected (0.02 sec)

2、插入数据
mysql> insert into my_float values(1111,11.111);   #正常插入数据
Query OK, 1 row affected (0.01 sec)

mysql> insert into my_float values(1111111,11.11111);   #插入数据超过6位,第7位就四舍五入
Query OK, 1 row affected (0.00 sec)

mysql> insert into my_float values(1111117,11.11111);   #插入数据超过6位,第7位就四舍五入
Query OK, 1 row affected (0.00 sec)

mysql> insert into my_float values(11111,11.111111116);  #插入数据超过6位,第7位就四舍五入
Query OK, 1 row affected (0.01 sec)

mysql> insert into my_float values(111111111,11.111111116); #插入数据超过6位,第7位就四舍五入
Query OK, 1 row affected (0.00 sec)


3、查看数据
mysql> select * from my_float;
+-----------+---------+
| float1    | float2  |
+-----------+---------+
|      1111 |  11.111 |
|   1111110 | 11.1111 |
|   1111120 | 11.1111 |
|     11111 | 11.1111 |
| 111111000 | 11.1111 |
+-----------+---------+
1.1.3 定点数类型

定点数类型(DECIMAL)通过DECIMAL(M,D)设置位数和精度。

M表示数字总位数,不包括’.‘和’-',最大值为65,默认值为10。

D表示小数点后的位数,最大值为30,默认值为0。

例如,DECIMAL(5,2)表示的取值范围为-999.99~999.99。

范例:

1、创建表
mysql> create table my_decimal( my_decimal_1 decimal(5,2), my_decimal_2 decimal(4,2));
Query OK, 0 rows affected (0.03 sec)


2、插入数据
mysql> insert into my_decimal values(111.23,12.34);   #正常插入数据
Query OK, 1 row affected (0.00 sec)

mysql> insert into my_decimal values(1111.23,112.34);
ERROR 1264 (22003): Out of range value for column 'my_decimal_1' at row 1  #超过范围
mysql> 

mysql> insert into my_decimal values(111.232,12.341);
Query OK, 1 row affected, 2 warnings (0.00 sec)     #提示有告警信息

3、查看告警
mysql> show warnings;
+-------+------+---------------------------------------------------+
| Level | Code | Message                                           |
+-------+------+---------------------------------------------------+
| Note  | 1265 | Data truncated for column 'my_decimal_1' at row 1 |
| Note  | 1265 | Data truncated for column 'my_decimal_2' at row 1 |
+-------+------+---------------------------------------------------+
2 rows in set (0.00 sec)

练习:

使用decimal和bigint数据类型存储数据值“123456789987654321123456789987654321”,观察一下有啥区别?

CREATE table t6 (num1 DECIMAL(65))
INSERT INTO t6 VALUES(123456789987654321123456789987654321)
 
 
 #BIGINT 无符号存储的数据最大是2^64-1,因此无法存储下列值
CREATE table t7 (num1 BIGINT)
INSERT INTO t7 VALUES(123456789987654321123456789987654321)

1.2 日期和时间类型

为了方便在数据库中存储日期和时间,MySQL提供了表示日期和时间的数据类型。

YEAR 类型通常用来表示年
DATE 类型通常用来表示年、月、日
TIME 类型通常用来表示时、分、秒
DATETIME 类型通常用来表示年、月、日、时、分、秒
TIMESTAMP 类型通常用来表示带时区的年、月、日、时、分、秒

注意:

1)不同数据类型表示的时间内容不同、取值范围不同,而且占用的字节数也不一样,你要根据实际需要灵活选取。
2)为什么时间类型 TIME 的取值范围不是 -23:59:59~23:59:59 呢?
原因是 MySQL设计的TIME 类型,不光表示一天之内的时间,还可以用来表示一个时间间隔,这个时间间隔可以超过 24小时
1.2.1 YEAR类型

YEAR类型用来表示年份,在所有的日期时间类型中所占用的存储空间最小,只需要1个字节的存储空间,格式为YYYY。

在MySQL中,可使用以下3种格式指定TEAR类型的值:

使用4位字符串或数字表示,为’1901’'2155’或19012155。

例如,输入’2022’或2022,插入到数据库中的值均为2022

使用两位字符串表示,为’00’~‘99’。

‘00’ ~ '69’的值会被转换为2000~2069的YEAR值

‘70’ ~ '99’的值会被自动转换为1970~1999的YEAR值

例如,输入’22’,插入到数据表中的值为2022。

使用两位数字表示,为1~99。

1 ~ 69的值会被转换为2001~2069的YEAR值

70 ~ 99的值会被自动转换为1970~1999的YEAR值

例如,输入22,插入到数据表中的值为2022。

知识点:

当使用YEAR类型时,一定要区分0和’0’。

数字格式的0表示的YEAR值为0000

字符串格式的’0’表示的YEAR值为2000
1.2.2 DATE类型

DATE类型用来表示日期值,不包含时间部分,需要 3个字节 的存储空间,且其格式为 YYYY-MM-DD 。其中,YYYY表示年份,MM表示月份,DD表示日期。

在MySQL中,可以使用以下4种格式指定DATE类型的值:

以’YYYY-MM-DD’或者’YYYYMMDD’字符串格式表示。
以’YY-MM-DD’或者’YYMMDD’字符串格式表示。
以YY-MM-DD或者YYMMDD数字格式表示。
使用CURRENT_DATE或者NOW()输入当前系统日期。

注意:

通过"SELECT CURRENT_DATE;"或者"SELECT NOW();"可查询当前日期。

日期中的分隔符"-“,还可以使用”.“”,“”/"等符号来表示。

范例:

CREATE TABLE t11 (birthday date)
INSERT into t11 VALUES('2024-01-11')
INSERT into t11 VALUES('2024.01.11')
INSERT into t11 VALUES('2024/1/11')
1.2.3 TIME类型

TIME类型用于表示时间值,它的显示形式一般为HH:MM:SS,其中HH表示小时,MM表示分,SS表示秒。

在MySQL中,可以使用以下3种格式指定TIME类型的值:

以’HHMMSS’字符串或者HHMMSS数学格式表示。
以’HH:MM:SS’字符串格式表示。
使用CURRENT_TIME或NOW()输入当前系统时间。

范例:

CREATE TABLE t11 (birthday time)

INSERT into t11 VALUES('12:10:11')
INSERT into t11 VALUES('121011')
1.2.4 DATETIME类型

DATETIME类型在所有的日期时间类型中占用的存储空间最大,总共需要 8 个字节的存储空间,用来表示日期和时间,它的显示形式为’YYYY-MM-DD HH:MM:SS’。

在MySQL中,可以使用以下4种格式指定DATETIME类型的值:

以’YYYY-MM-DD HH:MM:SS’或’YYYYMMDDHHMMSS’字符串格式表示的日期和时间,取值范围为’1000-01-01 00:00:00’~‘9999-12-31-23-59-59’。
以’YY-MM-DD HH:MM:SS’或’YYMMDDHHMMSS’字符串格式表示的日期和时间,
以YYYYMMDDHHMMSS或YYMMDDHHMMSS数字格式表示的日期和时间,
使用NOW()来输入当前系统的日期和时间。

范例:

CREATE TABLE t11 (birthday DATETIME)

INSERT into t11 VALUES('2024-01-11 12:10:11')
INSERT into t11 VALUES('20240111121011')
1.2.5 TIMESTAMP类型

TIMESTAMP(时间戳)类型用于表示日期和时间,需要4个字节的存储空间,它的显示形式与DATETIME类型的相同,但取值范围比DATETIME类型的小。

TIMESTAMP类型与DATETIME类型的不同形式:

使用CURRENT_TIMESTAMP来输入系统当前的日期和时间。
无任何输入,或输入NULL时,实际保存的是系统当前日期和时间。

范例:

CREATE TABLE t12(
id int,
name varchar(50),
login_time TIMESTAMP
NOT NULL DEFAULT CURRENT_TIMESTAMP  #添加当前时间戳
ON UPDATE CURRENT_TIMESTAMP)   #在更新数据时自动更新时间戳


INSERT into t12(id,name) VALUES(1,'lisi')   #插入数据,时间戳自动添加当前的时间戳

mysql>  select * from t12;
+------+------+---------------------+
| id   | name | login_time          |
+------+------+---------------------+
|    1 | lisi | 2024-01-21 00:12:33 |
+------+------+---------------------+
1 row in set (0.00 sec)

 
update t12 set name='zhangsan' WHERE id=1  #更新数据,时间戳也会变化

mysql>  select * from t12;
+------+----------+---------------------+
| id   | name     | login_time          |
+------+----------+---------------------+
|    1 | zhangsan | 2024-01-21 00:12:52 |
+------+----------+---------------------+
1 row in set (0.01 sec)

1.3 字符串类型

MySQL中的字符串类型分别为CHAR,VARHAR,TEXT等多种类型,不同数据类型具有不同的特点。

image-20230607161106289

1.3.1 CHAR和VARCHAR类型

CHAR和VARCHAR类型都是用来保存字符串数据,两者不同的是,VARCHAR可以存储可变长度的字符串数据。

image-20230607161212445

在MySQL中,定义CHAR和VARCHAR类型的语法格式为:

CHAR(M)

VARCHAR(M)

知识点:

1、CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符。
2、如果保存数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度。当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。
3、定义CHAR类型字段时,声明的字段长度即为CHAR类型字段所占的存储空间的字节数。
4、VARCHAR(M) 定义时, 必须指定长度M,否则就会报错。
5、检索VARCHAR类型的字段数据时,会保留数据尾部的空格。VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节。
6、VARCHAR定义的长度范围是65535字节,实际可用的65532字节,另外1-3个字符记录的是字段的大小。UTF8编码最大是21844字符,gbk的编码格式最为32766个字符

---
CREATE TABLE t1 (  
    name VARCHAR(32766) CHARACTER SET gbk  
);

CREATE TABLE t2 (  
    name VARCHAR(21844) CHARACTER SET utf8  
);
1.3.1.1 CHAR(4)和VARCHAR(4)存储需求对比

image-20230607161420895

  • 对于CHAR(4)无论插入值的长度是多少,所占存储空间就为4字节,而VARCHAR(4)占用的字节数为实际长度加1
1.3.1.2 CHAR(M)和VARCHAR(M)的特点及应用环境

image-20230607161524108

注意:

1)存储较短的字段数据信息使用char,若使用varchar,还需要额外1个字节来存储信息长度,造成空间存储浪费。
2)储存固定的字段数据信息使用char,因字段长固定,varchar的可变长的特性对存储空间没有效果了,还需要额外1个字节来存储信息长度。
3)频繁改变的column使用char,因varchar每次存储都要有额外的计算,从而完成得到长度等工作,如果一个非常频繁改变的column操作,那就要花费很多时间和空间来用于计算,而这些对于char来说是不需要的。

范例:

CREATE TABLE t11 (name CHAR(4)CHARACTER SET utf8);
INSERT INTO t11 VALUES("zha")
INSERT INTO t11 VALUES("吴超锋好") 
INSERT INTO t11 VALUES("吴超锋好0") #报错 "too long"

CREATE TABLE t11 (name VARCHAR(4)CHARACTER SET utf8);
INSERT INTO t11 VALUES("zha")
INSERT INTO t11 VALUES("吴超锋好")
INSERT INTO t11 VALUES("吴超锋好0")  #报错 "too long"

思考:为什么有了varchar还需要char数据类型呢?

1.3.2 TEXT类型

TEXT类型用于保存大文本数据,例如,文章内容,评论等比较长的文本。

image-20230607161701815

注意:

1)在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和VARCHAR类型相同。
2)由于实际存储的长度不确定,MySQL不允许TEXT类型的字段做主键,只可使用VARCHAR和CHAR字段类型。
3)TEXT文本类型可以存储较多的文本,但搜索速度较慢,所以不是特别大的文本,可选择使用VARCHAR和CHAR字段类型代替。
4)若一个表被频繁使用,这个表中不建议存在TEXT类型的字段。因TEXT和BLOB类型的数据删除后容易导致空洞,使文件碎片比较多。

范例:

CREATE TABLE t11 (id TEXT CHARACTER SET utf8);
INSERT INTO t11 VALUES("123456789012")
1.3.3 ENUM类型

ENUM类型又称为枚举类型,其定义格式为:

ENUM('值1','值2','值3','值4','值5',....,'值n')

ENUM类型的取值范围需要在定义字段时进行指定。

设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值。

其所需要的存储空间由定义ENUM类型时指定的成员个数决定。

  • 当ENUM类型包含1~255个成员时,需要1个字节的存储空间
  • 当ENUM类型包含256~65535个成员时,需要2个字节的存储空间
  • ENUM类型的成员个数的上限为65535个

范例:

1、创建表my_enum,定义取值范围('male','female')
mysql> create table my_enum( gender enum('male','female'));
Query OK, 0 rows affected (0.02 sec)

2、插入数据
mysql> insert into my_enum values('male'),('female');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into my_enum values('MALE'),('FEMALE');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

#插入数据的编号
mysql> insert into my_enum values(1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into my_enum values(1),(null);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

3、查看结果
mysql> select * from my_enum;
+--------+
| gender |
+--------+
| male   |
| female |
| male   |
| female |
| male   |
| female |
| male   |
| NULL   |
+--------+
8 rows in set (0.00 sec)
1.3.4 SET类型

SET类型用于保存字符串对象,其定义格式与ENUM类型相似。

SET('值1','值2','值3','值4','值5',....,'值n')
  • 其所需要的存储空间由定SET类型时指定的成员个数决定

image-20230607163243871

  • SET类型在存储数据时成员个数越多,其占用的存储空间越大。
  • SET类型在选取成员时,与ENUM类型不同,其可以一次选择多个成员。

范例:

1、创建表my_set,设置A,B,C,D四个可取值
mysql> create table my_set(
    -> s set('A','B','C','D'));
Query OK, 0 rows affected (0.01 sec)

2、插入数据
mysql> insert into my_set values('A'),('B');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into my_set values('A'),('A,B');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

#重复的值自动忽略
mysql> insert into my_set values('A'),('A,B,B');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

3、查看结果
mysql> select * from my_set;
+------+
| s    |
+------+
| A    |
| B    |
| A    |
| A,B  |
| A    |
| A,B  |
+------+
6 rows in set (0.00 sec)
1.3.5 BINARY和VARBINARY类型

BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是,它们所表示的是二进制数据。

image-20230607163839078

BINARY和VARBINARY类型的定义形式:

BINARY(M)
VARBINARY(M)

范例:

CREATE TABLE t13 (f1 BINARY,f2 BINARY(3),f3 VARBINARY(10))

INSERT INTO t13 VALUES('a','b','c')
INSERT INTO t13 VALUES('吴','超','峰哥') #插入失败,一个汉字占2个字节
1.3.6 BLOB类型

BLOB类型用于保存数据量比较大的二进制数据,如图片,PDF文档等。

image-20230607163934633

注意:

  • BLOB类型与TEXT类型相似,但BLOB类型数据是根据二进制编码进行比较和排序,而TEXT类型数据是根据文本模式进行比较和排序。

综合练习

1、创建一个员工表,字段如下:id,name,birthday,job_time,sex,salary,job,resume,请根据字段给出合理的数据类型

 
 # 新建员工表
CREATE TABLE emp (
 id int,
 name VARCHAR(50),
 birthday DATE,
 job_time DATETIME,
 sex char(1),
 salary DOUBLE,
 job VARCHAR(50),
 resume TEXT) CHARACTER SET utf8 CHARSET utf8 COLLATE utf8_bin ENGINE INNODB


INSERT into emp VALUES(1,'zhangsan','2000-12-12','2023-12-12 12:12:12','男','3500.00','销售','我是一个工作狂')

二、MySQL高级查询

导入表数据,以便于后期测试;

mysql> source /root/book_utf8.sql
mysql> show tables;
+-----------------+
| Tables_in_book2 |
+-----------------+
| books           |
| category        |
+-----------------+
2 rows in set (0.00 sec)

mysql> 

2.1 逻辑运算符

and 且

or 或

not 非

例子1:选择出书籍价格为(30,40,50,60)的记录,只显示书籍名称,出版社,价格

mysql>  select bName,publishing,price from books where price=30 or price=40 or price=50 or price=60;

例子2:选择出书籍价格不为(30,40,50,60)的记录,只显示书籍名称,出版社,价格

mysql> select bName,publishing,price from books where not price in(30,40,50,60);

2.2 算术运行符

MySQL中常见的算术运算符如下:

=	等于
<>	不等于  !=
>	大于
<	小于
>=	大于等于
<=	小于等于

例子:

找出价格大于60的记录
mysql> select bName,price from books where price>60;
找出价格为60的
mysql> select bName,price from books where price=60;
找出价格不等于60的
mysql> select bName,price from books where price!=60;
mysql> select bName,price from books where not price=60;

2.3 in运算符

IN 运算符用于 WHERE 表达式中,以列表项的形式支持多个选择,语法如下:

WHERE column IN (value1,value2,...)

WHERE column NOT IN (value1,value2,...)

Not in 与in相反

  • 当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择。

例子:

找出价格是60,50,70的记录
mysql> select bName,price from books where price in (50,60,70);
找出价格不是60,50,70的记录
mysql> select bName,price from books where price not in (50,60,70);

2.4 排序和分组

2.4.1 排序
升序:order by “排序的字段” asc默认

降序:oredr by “排序的字段” desc

例子:查询价格是50,60,70的书籍

mysql> select bName,price from books where price  in (50,60,70) order by price asc;

mysql> select bName,price from books where price  in (50,60,70) order by price desc;

多个字段排序

mysql> select bName,price from books where price  in (50,60,70) order by price desc,bName desc;
+--------------------------------------+-------+
| bName                                | price |
+--------------------------------------+-------+
| Delphi 5程序设计与控件参考           |    60 |
| ASP数据库系统开发实例导航            |    60 |
| ASP数据库系统开发实例导航            |    60 |
| 网站设计全程教程                     |    50 |
| Illustrator 10完全手册               |    50 |
| FreeHand 10基础教程                  |    50 |
+--------------------------------------+-------+
6 rows in set (0.00 sec)

mysql> 
2.4.1 分组
语法:group by [colume] having [colume]  
   
# having 表示满足条件后的过滤操作,常和group by联合使用。

例子:根据bTypeId查询不同类型的书籍的最大价格和平均价格

mysql> select avg(price),max(price),bTypeId from books group by bTypeId;
+------------+------------+---------+
| avg(price) | max(price) | bTypeId |
+------------+------------+---------+
|    82.3333 |         95 | 1       |
|   396.6818 |       7500 | 2       |
|    68.0000 |         91 | 3       |
|    54.0000 |         54 | 4       |
|    61.0000 |         62 | 5       |
|    42.5000 |         44 | 6       |
|    45.0000 |         45 | 7       |
|    48.0000 |         48 | 8       |
|    56.5000 |         83 | 9       |
|    55.5000 |         64 | 10      |
+------------+------------+---------+
10 rows in set (0.00 sec)

例子:根据bTypeId查询不同类型的书籍的最大价格和平均价格,并筛选出平均价格低于60的书籍

mysql> select avg(price),max(price),bTypeId from books group by bTypeId having avg(price) <60;
+------------+------------+---------+
| avg(price) | max(price) | bTypeId |
+------------+------------+---------+
|    54.0000 |         54 | 4       |
|    42.5000 |         44 | 6       |
|    45.0000 |         45 | 7       |
|    48.0000 |         48 | 8       |
|    56.5000 |         83 | 9       |
|    55.5000 |         64 | 10      |
+------------+------------+---------+
6 rows in set (0.00 sec)

可以使用别名来写,效率更高–as

mysql> select avg(price) as  avg_price ,max(price) as max_price,bTypeId from books group by bTypeId having avg_price <60;
+-----------+-----------+---------+
| avg_price | max_price | bTypeId |
+-----------+-----------+---------+
|   54.0000 |        54 | 4       |
|   42.5000 |        44 | 6       |
|   45.0000 |        45 | 7       |
|   48.0000 |        48 | 8       |
|   56.5000 |        83 | 9       |
|   55.5000 |        64 | 10      |
+-----------+-----------+---------+
6 rows in set (0.00 sec)

2.5 范围运算

语法:[not] between ....and....

between and 可以使用大于小于的方式来代替,并且使用大于小于意义表述更明确

例子:查找价格不在30到60之间的书名和价格

mysql> select bName,price from books where price not between 30 and 60 order by price desc;

注:这里的查询条件有三种:between,and,or 和 in

(30,60), >30 and <60

[30,60] ,>=30 and <=60

2.6 模糊匹配查询

字段名 [not] like '通配符'  ----》% 任意多个字符

例子:查找书名中包括"程序"字样记录

mysql> select bName from books where bName like '%程序%';

mysql> select bName from books where bName not like '%程序%';

mysql> select bName from books where bName like '___a%';   #查找第4个字符为a的书籍

2.7 MySQL子查询

概念:在select 的where条件中又出现了select,查询中嵌套着查询

例子:选择 类型名为“网络技术”的图书

mysql> select bName,bTypeId from books where bTypeId=(select bTypeId from category where bTypeName='网络技术');
+----------------------+---------+
| bName                | bTypeId |
+----------------------+---------+
| Internet操作技术     | 7       |
+----------------------+---------+
1 row in set (0.01 sec)

2.8 分页查询-limit

语法:
SELECT * FROM table LIMIT [offset,] rows
                           偏移量   行数

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1):

比如:

select * from table limit m,n

表示其中:

m是指记录开始的index,从0开始,表示第一条记录

n是指从第m+1条开始,取n条。

例子:查出category表中第2条到第6行的记录

首先2到6行有2,3,4,5,6总共有5个数字,从2开始,偏移量为1

mysql>  select * from category limit 1,5;
+---------+--------------+
| bTypeId | bTypeName    |
+---------+--------------+
|       2 | 网站         |
|       3 | 3D动画       |
|       4 | linux学习    |
|       5 | Delphi学习   |
|       6 | 黑客         |
+---------+--------------+
5 rows in set (0.00 sec)

mysql> 

例子:查看所有书籍中价格中最低的三条记录

我们对所有记录排序以升序排列,取出前面3个来

mysql> select bName,price from books order by price asc limit 0,3;
+-----------------------------+-------+
| bName                       | price |
+-----------------------------+-------+
| 网站制作直通车              |    34 |
| 黑客与网络安全              |    41 |
| 网络程序与设计-asp         |    43 |
+-----------------------------+-------+
3 rows in set (0.00 sec)tt

我们将子查询和限制条目,算术运算结合起来查询显示字段bName ,price ;条件:找出价格比电子工业出版社出版的书中最便宜还要便宜的书。

针对这种查询,我们一步步的来,先找出电子工业出版社出版中最便宜的书

mysql>  select bName,price from books where publishing="电子工业出版社" order by price asc limit 0,1;
+-------------------------------------+-------+
| bName                               | price |
+-------------------------------------+-------+
| Delphi 5程序设计与控件参考          |    60 |
+-------------------------------------+-------+
1 row in set (0.00 sec)

mysql> select bName,price from books where price<(select price from books where publishing="电子工业出版社" order by price asc limit 0,1);

或者

多行子查询: all表示小于子查询中返回全部值中的最小值

mysql>  select bName,price from books where price<all(select price from books where publishing="电子工业出版社");

2.9 连接查询

以一个共同的字段,求两张表当中符合条件的并集。 通过共同字段把这两张表连接起来。如下图所示

books表:

mysql> select * from books;
+-----+---------------------------------------------------------+---------+-----------------------------------+-------+------------+-----------+-------------+
| bId | bName                                                   | bTypeId | publishing                        | price | pubDate    | author    | ISBN        |
+-----+---------------------------------------------------------+---------+-----------------------------------+-------+------------+-----------+-------------+
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |
|   2 | 黑客与网络安全                                          | 6       | 航空工业出版社                    |    41 | 2002-07-01 | 白立超    | 7121010925  |
|   3 | 网络程序与设计-asp                                     | 2       | 北方交通大学出版社                |    43 | 2005-02-01 | 王玥      | 75053815x   |
|   4 | pagemaker 7.0短期培训教程                               | 9       | 中国电力出版社                    |    43 | 2005-01-01 | 孙利英    | 7121008947  |
|   5 | 黑客攻击防范秘笈                                        | 6       | 北京腾图电子出版社                |    44 | 2003-06-29 | 赵雷雨    | 7120000233  |
|   6 | Dreamweaver 4入门与提高                                 | 2       | 清华大学出版社                    |    44 | 2004-06-01 | 岳玉博    | 7505397699  |
|   7 | 网页样式设计-CSS                                       | 2       | 人民邮电出版社                    |    45 | 2002-03-01 | 张晓阳    | 7505383663  |
|   8 | Internet操作技术                                        | 7       | 清华大学出版社                    |    45 | 2002-02-01 | 肖铭      | 7121003023  |
|   9 | Dreamweaver 4网页制作                                   | 2       | 清华大学出版社                    |    45 | 2004-04-01 | 黄宇      | 7505380796  |
|  10 | 3D MAX 3.0 创作效果百例                                 | 3       | 北京万水电子信息出版社            |    45 | 2002-09-01 | 耿影      | 7505380796  |
|  11 | Auto CAD职业技能培训教程                                | 10      | 北京希望电子出版社                |    47 | 2004-06-01 | 张晓阳    | 7505380796  |
|  12 | Fireworks 4网页图形制作                                 | 2       | 清华大学出版社                    |    48 | 2004-04-01 | 白立超    | 7505380796  |
|  13 | 自己动手建立企业局域网                                  | 8       | 清华大学出版社                    |    48 | 2003-08-30 | 郭刚      | 7505380796  |
|  14 | 页面特效精彩实例制作                                    | 2       | 人民邮电出版社                    |    49 | 2004-09-01 | 白宇      | 7505380796  |
|  15 | 平面设计制作整合案例详解-页面设计卷                    | 2       | 人民邮电出版社                    |    49 | 2004-04-01 | 陈继云    | 7505380796  |
|  16 | Illustrator 10完全手册                                  | 9       | 科学出版社                        |    50 | 2005-03-01 | 周玉勇    | 7505380796  |
|  17 | FreeHand 10基础教程                                     | 9       | 北京希望电子出版                  |    50 | 2005-02-01 | 耿影      | 7505380796  |
|  18 | 网站设计全程教程                                        | 2       | 科学出版社                        |    50 | 2006-01-01 | 吴守辉    | 7505380796  |
|  19 | 动态页面技术-HTML 4.0使用详解                          | 2       | 人民邮电出版社                    |    51 | 2003-02-01 | 卢立超    | 7505380796  |
|  20 | Auto CAD 3D模型大师                                     | 10      | 中国铁道出版社                    |    53 | 2002-06-01 | 曹泽林    | 7505380796  |
|  21 | Linux傻瓜书                                             | 4       | 清华大学出版社                    |    54 | 2003-02-01 | 朱佳男    | 7505380796  |
|  22 | 网页界面设计艺术教程                                    | 2       | 人民邮电出版社                    |    54 | 2006-01-01 | 刘刚      | 7505380796  |
|  23 | Flash MX 标准教程                                       | 2       | 北京希望电子出版社                |    54 | 2005-05-01 | 郭刚      | 7505371215  |
|  24 | Auto CAD 2000 应用及实例基集锦                          | 10      | 清华大学出版社                    |    58 | 2003-02-01 | 陈继云    | 7505388444  |
|  25 | Access 2000应用及实例基集锦                             | 1       | 北京邮电出版社                    |    59 | 2004-06-01 | 于佳      | 7505396269  |
|  26 | ASP数据库系统开发实例导航                               | 2       | 人民邮电出版社                    |    60 | 2006-01-01 | 刘刚      | 7505374710  |
|  27 | Delphi 5程序设计与控件参考                              | 5       | 电子工业出版社                    |    60 | 2003-02-01 | 孟卫峰    | 7505377353  |
|  28 | 活学活用Delphi5                                         | 5       | 人民邮电出版社                    |    62 | 2003-05-01 | 付强      | 7505396293  |
|  29 | Auto CAD 2002 中文版实用教程                            | 2       | 人民邮电出版社                    |    63 | 2005-01-01 | 赵富雨    | 7121007436  |
|  30 | 3DS MAX 4横空出世                                       | 3       | 清华大学出版社                    |    63 | 2005-01-01 | 付强      | 712100847   |
|  31 | 精通Javascript                                          | 2       | 科学出版社                        |    63 | 2003-05-01 | 齐鹏      | 7505391860  |
|  32 | 深入Flash 5教程                                         | 2       | 北京科海集团公司                  |    64 | 2004-03-01 | 卢立强    | 75053886441 |
|  33 | Auto CAD R14 中文版实用教程                             | 10      | 人民邮电出版社                    |    64 | 2002-11-01 | 杜刚      | 394436      |
|  34 | ASP数据库系统开发实例导航                               | 2       | 人民邮电出版社                    |    60 | 2006-01-01 | 刘刚      | 7505374710  |
|  35 | Frontpage 2000& ASP 网页设计技巧与网站维护             | 2       | 清华大学出版社                    |    71 | 2003-11-01 | 李雪      | 75053764774 |
|  36 | HTML设计实务                                            | 2       | 人民邮电出版社                    |    72 | 2002-11-01 | 韩旭颖    | 77121007460 |
|  37 | 3D MAX R3动画制作与培训教程                             | 3       | 人民邮电出版社                    |    73 | 2003-10-01 | 孙丽英    | 7505391623  |
|  38 | Javascript与Jscript从入门到精通                         | 2       | 电子工业出版社                    |  7500 | 2002-08-01 | 韩旭颖    | 7505391410  |
|  39 | lllustrator 9宝典                                       | 9       | 电子工业出版社                    |    83 | 2004-05-01 | 周玉勇    | 7120000039  |
|  40 | 3D Studio Max 3综合使用                                 | 3       | 人民邮电出版社                    |    91 | 2003-08-01 | 丁佳      | 7505386514  |
|  41 | SQL Server 2000 从入门到精通                            | 1       | 电子工业出版社                    |    93 | 2004-03-01 | 薛聪颖    | 7505383608  |
|  42 | SQL Server 7.0数据库系统管理与应用开发                  | 1       | 人民邮电出版社                    |    95 | 2003-05-01 | 肖铭      | 7121004771  |
|  43 | ASP 3初级教程                                           | 2       | 机械工业出版社                    |   104 | 2003-11-01 | 韩旭日    | 7505375458  |
|  44 | XML 完全探索                                            | 2       | 中国青年出版社                    |   104 | 2004-01-01 | 齐鹏      | 7505357778  |
+-----+---------------------------------------------------------+---------+-----------------------------------+-------+------------+-----------+-------------+
44 rows in set (0.00 sec)

category表:

mysql> select * from category;
+---------+---------------+
| bTypeId | bTypeName     |
+---------+---------------+
|       1 | windows应用   |
|       2 | 网站          |
|       3 | 3D动画        |
|       4 | linux学习     |
|       5 | Delphi学习    |
|       6 | 黑客          |
|       7 | 网络技术      |
|       8 | 安全          |
|       9 | 平面          |
|      10 | AutoCAD技术   |
+---------+---------------+
10 rows in set (0.00 sec)

会出现笛卡尔积,如下:

mysql> select * from books,category;
+-----+---------------------------------------------------------+---------+-----------------------------------+-------+------------+-----------+-------------+---------+---------------+
| bId | bName                                                   | bTypeId | publishing                        | price | pubDate    | author    | ISBN        | bTypeId | bTypeName     |
+-----+---------------------------------------------------------+---------+-----------------------------------+-------+------------+-----------+-------------+---------+---------------+
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |       1 | windows应用   |
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |       2 | 网站          |
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |       3 | 3D动画        |
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |       4 | linux学习     |
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |       5 | Delphi学习    |
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |       6 | 黑客          |
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |       7 | 网络技术      |
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |       8 | 安全          |
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |       9 | 平面          |
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |      10 | AutoCAD技术   |
|   2 | 黑客与网络安全                                          | 6       | 航空工业出版社                    |    41 | 2002-07-01 | 白立超    | 7121010925  |       1 | windows应用   |
|   2 | 黑客与网络安全                                          | 6       | 航空工业出版社                    |    41 | 2002-07-01 | 白立超    | 7121010925  |       2 | 网站          |
|   2 | 黑客与网络安全                                          | 6       | 航空工业出版社                    |    41 | 2002-07-01 | 白立超    | 7121010925  |       3 | 3D动画        |
|   2 | 黑客与网络安全                                          | 6       | 航空工业出版社                    |    41 | 2002-07-01 | 白立超    | 7121010925  |       4 | linux学习     |
|   2 | 黑客与网络安全                                          | 6       | 航空工业出版社                    |    41 | 2002-07-01 | 白立超    | 7121010925  |       5 | Delphi学习    |
|   2 | 黑客与网络安全                                          | 6       | 航空工业出版社                    |    41 | 2002-07-01 | 白立超    | 7121010925  |       6 | 黑客          |
|   2 | 黑客与网络安全                                          | 6       | 航空工业出版社                    |    41 | 2002-07-01 | 白立超    | 7121010925  |       7 | 网络技术      |
.....省略.....
|  44 | XML 完全探索                                            | 2       | 中国青年出版社                    |   104 | 2004-01-01 | 齐鹏      | 7505357778  |       3 | 3D动画        |
|  44 | XML 完全探索                                            | 2       | 中国青年出版社                    |   104 | 2004-01-01 | 齐鹏      | 7505357778  |       4 | linux学习     |
|  44 | XML 完全探索                                            | 2       | 中国青年出版社                    |   104 | 2004-01-01 | 齐鹏      | 7505357778  |       5 | Delphi学习    |
|  44 | XML 完全探索                                            | 2       | 中国青年出版社                    |   104 | 2004-01-01 | 齐鹏      | 7505357778  |       6 | 黑客          |
|  44 | XML 完全探索                                            | 2       | 中国青年出版社                    |   104 | 2004-01-01 | 齐鹏      | 7505357778  |       7 | 网络技术      |
|  44 | XML 完全探索                                            | 2       | 中国青年出版社                    |   104 | 2004-01-01 | 齐鹏      | 7505357778  |       8 | 安全          |
|  44 | XML 完全探索                                            | 2       | 中国青年出版社                    |   104 | 2004-01-01 | 齐鹏      | 7505357778  |       9 | 平面          |
|  44 | XML 完全探索                                            | 2       | 中国青年出版社                    |   104 | 2004-01-01 | 齐鹏      | 7505357778  |      10 | AutoCAD技术   |
+-----+---------------------------------------------------------+---------+-----------------------------------+-------+------------+-----------+-------------+---------+---------------+
440 rows in set (0.00 sec)

解决办法:找出2个表中相同的字段

mysql> select * from books,category where books.bTypeId = category.bTypeId;
+-----+---------------------------------------------------------+---------+-----------------------------------+-------+------------+-----------+-------------+---------+---------------+
| bId | bName                                                   | bTypeId | publishing                        | price | pubDate    | author    | ISBN        | bTypeId | bTypeName     |
+-----+---------------------------------------------------------+---------+-----------------------------------+-------+------------+-----------+-------------+---------+---------------+
|   1 | 网站制作直通车                                          | 2       | 电脑爱好者杂志社                  |    34 | 2004-10-01 | 苗壮      | 7505380796  |       2 | 网站          |
|   2 | 黑客与网络安全                                          | 6       | 航空工业出版社                    |    41 | 2002-07-01 | 白立超    | 7121010925  |       6 | 黑客          |
|   3 | 网络程序与设计-asp                                     | 2       | 北方交通大学出版社                |    43 | 2005-02-01 | 王玥      | 75053815x   |       2 | 网站          |
|   4 | pagemaker 7.0短期培训教程                               | 9       | 中国电力出版社                    |    43 | 2005-01-01 | 孙利英    | 7121008947  |       9 | 平面          |
|   5 | 黑客攻击防范秘笈                                        | 6       | 北京腾图电子出版社                |    44 | 2003-06-29 | 赵雷雨    | 7120000233  |       6 | 黑客          |
|   6 | Dreamweaver 4入门与提高                                 | 2       | 清华大学出版社                    |    44 | 2004-06-01 | 岳玉博    | 7505397699  |       2 | 网站          |
|   7 | 网页样式设计-CSS                                       | 2       | 人民邮电出版社                    |    45 | 2002-03-01 | 张晓阳    | 7505383663  |       2 | 网站          |
|   8 | Internet操作技术                                        | 7       | 清华大学出版社                    |    45 | 2002-02-01 | 肖铭      | 7121003023  |       7 | 网络技术      |
|   9 | Dreamweaver 4网页制作                                   | 2       | 清华大学出版社                    |    45 | 2004-04-01 | 黄宇      | 7505380796  |       2 | 网站          |
|  10 | 3D MAX 3.0 创作效果百例                                 | 3       | 北京万水电子信息出版社            |    45 | 2002-09-01 | 耿影      | 7505380796  |       3 | 3D动画        |
|  11 | Auto CAD职业技能培训教程                                | 10      | 北京希望电子出版社                |    47 | 2004-06-01 | 张晓阳    | 7505380796  |      10 | AutoCAD技术   |
|  12 | Fireworks 4网页图形制作                                 | 2       | 清华大学出版社                    |    48 | 2004-04-01 | 白立超    | 7505380796  |       2 | 网站          |
|  13 | 自己动手建立企业局域网                                  | 8       | 清华大学出版社                    |    48 | 2003-08-30 | 郭刚      | 7505380796  |       8 | 安全          |
|  14 | 页面特效精彩实例制作                                    | 2       | 人民邮电出版社                    |    49 | 2004-09-01 | 白宇      | 7505380796  |       2 | 网站          |
|  15 | 平面设计制作整合案例详解-页面设计卷                    | 2       | 人民邮电出版社                    |    49 | 2004-04-01 | 陈继云    | 7505380796  |       2 | 网站          |
|  16 | Illustrator 10完全手册                                  | 9       | 科学出版社                        |    50 | 2005-03-01 | 周玉勇    | 7505380796  |       9 | 平面          |
|  17 | FreeHand 10基础教程                                     | 9       | 北京希望电子出版                  |    50 | 2005-02-01 | 耿影      | 7505380796  |       9 | 平面          |
|  18 | 网站设计全程教程                                        | 2       | 科学出版社                        |    50 | 2006-01-01 | 吴守辉    | 7505380796  |       2 | 网站          |
|  19 | 动态页面技术-HTML 4.0使用详解                          | 2       | 人民邮电出版社                    |    51 | 2003-02-01 | 卢立超    | 7505380796  |       2 | 网站          |
|  20 | Auto CAD 3D模型大师                                     | 10      | 中国铁道出版社                    |    53 | 2002-06-01 | 曹泽林    | 7505380796  |      10 | AutoCAD技术   |
|  21 | Linux傻瓜书                                             | 4       | 清华大学出版社                    |    54 | 2003-02-01 | 朱佳男    | 7505380796  |       4 | linux学习     |
|  22 | 网页界面设计艺术教程                                    | 2       | 人民邮电出版社                    |    54 | 2006-01-01 | 刘刚      | 7505380796  |       2 | 网站          |
|  23 | Flash MX 标准教程                                       | 2       | 北京希望电子出版社                |    54 | 2005-05-01 | 郭刚      | 7505371215  |       2 | 网站          |
|  24 | Auto CAD 2000 应用及实例基集锦                          | 10      | 清华大学出版社                    |    58 | 2003-02-01 | 陈继云    | 7505388444  |      10 | AutoCAD技术   |
|  25 | Access 2000应用及实例基集锦                             | 1       | 北京邮电出版社                    |    59 | 2004-06-01 | 于佳      | 7505396269  |       1 | windows应用   |
|  26 | ASP数据库系统开发实例导航                               | 2       | 人民邮电出版社                    |    60 | 2006-01-01 | 刘刚      | 7505374710  |       2 | 网站          |
|  27 | Delphi 5程序设计与控件参考                              | 5       | 电子工业出版社                    |    60 | 2003-02-01 | 孟卫峰    | 7505377353  |       5 | Delphi学习    |
|  28 | 活学活用Delphi5                                         | 5       | 人民邮电出版社                    |    62 | 2003-05-01 | 付强      | 7505396293  |       5 | Delphi学习    |
|  29 | Auto CAD 2002 中文版实用教程                            | 2       | 人民邮电出版社                    |    63 | 2005-01-01 | 赵富雨    | 7121007436  |       2 | 网站          |
|  30 | 3DS MAX 4横空出世                                       | 3       | 清华大学出版社                    |    63 | 2005-01-01 | 付强      | 712100847   |       3 | 3D动画        |
|  31 | 精通Javascript                                          | 2       | 科学出版社                        |    63 | 2003-05-01 | 齐鹏      | 7505391860  |       2 | 网站          |
|  32 | 深入Flash 5教程                                         | 2       | 北京科海集团公司                  |    64 | 2004-03-01 | 卢立强    | 75053886441 |       2 | 网站          |
|  33 | Auto CAD R14 中文版实用教程                             | 10      | 人民邮电出版社                    |    64 | 2002-11-01 | 杜刚      | 394436      |      10 | AutoCAD技术   |
|  34 | ASP数据库系统开发实例导航                               | 2       | 人民邮电出版社                    |    60 | 2006-01-01 | 刘刚      | 7505374710  |       2 | 网站          |
|  35 | Frontpage 2000& ASP 网页设计技巧与网站维护             | 2       | 清华大学出版社                    |    71 | 2003-11-01 | 李雪      | 75053764774 |       2 | 网站          |
|  36 | HTML设计实务                                            | 2       | 人民邮电出版社                    |    72 | 2002-11-01 | 韩旭颖    | 77121007460 |       2 | 网站          |
|  37 | 3D MAX R3动画制作与培训教程                             | 3       | 人民邮电出版社                    |    73 | 2003-10-01 | 孙丽英    | 7505391623  |       3 | 3D动画        |
|  38 | Javascript与Jscript从入门到精通                         | 2       | 电子工业出版社                    |  7500 | 2002-08-01 | 韩旭颖    | 7505391410  |       2 | 网站          |
|  39 | lllustrator 9宝典                                       | 9       | 电子工业出版社                    |    83 | 2004-05-01 | 周玉勇    | 7120000039  |       9 | 平面          |
|  40 | 3D Studio Max 3综合使用                                 | 3       | 人民邮电出版社                    |    91 | 2003-08-01 | 丁佳      | 7505386514  |       3 | 3D动画        |
|  41 | SQL Server 2000 从入门到精通                            | 1       | 电子工业出版社                    |    93 | 2004-03-01 | 薛聪颖    | 7505383608  |       1 | windows应用   |
|  42 | SQL Server 7.0数据库系统管理与应用开发                  | 1       | 人民邮电出版社                    |    95 | 2003-05-01 | 肖铭      | 7121004771  |       1 | windows应用   |
|  43 | ASP 3初级教程                                           | 2       | 机械工业出版社                    |   104 | 2003-11-01 | 韩旭日    | 7505375458  |       2 | 网站          |
|  44 | XML 完全探索                                            | 2       | 中国青年出版社                    |   104 | 2004-01-01 | 齐鹏      | 7505357778  |       2 | 网站          |
+-----+---------------------------------------------------------+---------+-----------------------------------+-------+------------+-----------+-------------+---------+---------------+
44 rows in set (0.00 sec)

但是联合查询之后,表中存在相同的字段-bTypeId,所以需要解决这个问题,手动指定具体的表的字段。

mysql> select bId,bTypeName,price,books.bTypeId from books,category where books.bTypeId = category.bTypeId;
+-----+---------------+-------+---------+
| bId | bTypeName     | price | bTypeId |
+-----+---------------+-------+---------+
|   1 | 网站          |    34 | 2       |
|   2 | 黑客          |    41 | 6       |
|   3 | 网站          |    43 | 2       |
|   4 | 平面          |    43 | 9       |
|   5 | 黑客          |    44 | 6       |
|   6 | 网站          |    44 | 2       |
|   7 | 网站          |    45 | 2       |
|   8 | 网络技术      |    45 | 7       |
|   9 | 网站          |    45 | 2       |
|  10 | 3D动画        |    45 | 3       |
|  11 | AutoCAD技术   |    47 | 10      |
|  12 | 网站          |    48 | 2       |
|  13 | 安全          |    48 | 8       |
|  14 | 网站          |    49 | 2       |
|  15 | 网站          |    49 | 2       |
|  16 | 平面          |    50 | 9       |
|  17 | 平面          |    50 | 9       |
|  18 | 网站          |    50 | 2       |
|  19 | 网站          |    51 | 2       |
|  20 | AutoCAD技术   |    53 | 10      |
|  21 | linux学习     |    54 | 4       |
|  22 | 网站          |    54 | 2       |
|  23 | 网站          |    54 | 2       |
|  24 | AutoCAD技术   |    58 | 10      |
|  25 | windows应用   |    59 | 1       |
|  26 | 网站          |    60 | 2       |
|  27 | Delphi学习    |    60 | 5       |
|  28 | Delphi学习    |    62 | 5       |
|  29 | 网站          |    63 | 2       |
|  30 | 3D动画        |    63 | 3       |
|  31 | 网站          |    63 | 2       |
|  32 | 网站          |    64 | 2       |
|  33 | AutoCAD技术   |    64 | 10      |
|  34 | 网站          |    60 | 2       |
|  35 | 网站          |    71 | 2       |
|  36 | 网站          |    72 | 2       |
|  37 | 3D动画        |    73 | 3       |
|  38 | 网站          |  7500 | 2       |
|  39 | 平面          |    83 | 9       |
|  40 | 3D动画        |    91 | 3       |
|  41 | windows应用   |    93 | 1       |
|  42 | windows应用   |    95 | 1       |
|  43 | 网站          |   104 | 2       |
|  44 | 网站          |   104 | 2       |
+-----+---------------+-------+---------+
44 rows in set (0.00 sec)

常用的连接:

内连接:根据表中的共同字段进行匹配

外连接分两种:左外连接、右外链接。
2.9.1 内连接

内连接,也叫等值连接, inner join得出同时存在t1表和t2表的数据集,通俗一点说就是求两个表的交集。

image-20230608093020953
语法:
select 字段  from 表1 inner join 表2  on 表1.字段=表2.字段

为了更好的体现内连接,我们如下验证一下:

1、创建2张表,分别为课程表(course)和教师表(teacher)

课程表:
 mysql> create table course(c_id int,c_name varchar(50),t_id int);
Query OK, 0 rows affected (0.02 sec)

教师表:
mysql> create table teacher(t_id int,t_name varchar(50));
Query OK, 0 rows affected (0.01 sec)

mysql> desc course;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| c_id   | int(11)     | YES  |     | NULL    |       |
| c_name | varchar(50) | YES  |     | NULL    |       |
| t_id   | int(11)     | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> desc teacher;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| t_id   | int(11)     | YES  |     | NULL    |       |
| t_name | varchar(50) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

2、插入数据

---课程表---
  mysql> insert into course values(1,'语文',1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into course values(2,'数学',2);
Query OK, 1 row affected (0.00 sec)

mysql> insert into course values(3,'英语',3);
Query OK, 1 row affected (0.00 sec)

mysql> insert into course values(4,'化学',5);
Query OK, 1 row affected (0.00 sec)


---教师表---
mysql> insert into teacher values(1,'王老师');
Query OK, 1 row affected (0.00 sec)

mysql> insert into teacher values(2,'李老师');
Query OK, 1 row affected (0.01 sec)

mysql> insert into teacher values(3,'刘老师');
Query OK, 1 row affected (0.00 sec)

mysql> insert into teacher values(4,'吴老师');
Query OK, 1 row affected (0.01 sec)

如果在插入过程中出现无法插入中文的问题,请修改一下字段的字符集,默认是 latin1,修改成 UTF-8

mysql> alter table teacher change t_name t_name varchar(20) character set utf8;

3、查看记录

mysql> select * from teacher;
+------+-----------+
| t_id | t_name    |
+------+-----------+
|    1 | 王老师    |
|    2 | 李老师    |
|    3 | 刘老师    |
|    4 | 吴老师    |
+------+-----------+
4 rows in set (0.00 sec)

mysql> select * from course;
+------+--------+------+
| c_id | c_name | t_id |
+------+--------+------+
|    1 | 语文   |    1 |
|    2 | 数学   |    2 |
|    3 | 英语   |    3 |
|    4 | 化学   |    5 |
+------+--------+------+
4 rows in set (0.00 sec)

4、测试内连接

mysql> select * from course a inner join teacher b on a.t_id=b.t_id;
+------+--------+------+------+-----------+
| c_id | c_name | t_id | t_id | t_name    |
+------+--------+------+------+-----------+
|    1 | 语文   |    1 |    1 | 王老师    |
|    2 | 数学   |    2 |    2 | 李老师    |
|    3 | 英语   |    3 |    3 | 刘老师    |
+------+--------+------+------+-----------+
3 rows in set (0.01 sec)

上述还是存在相同的字段,可修改

SELECT course.c_id,course.c_name,teacher.t_id from course INNER JOIN teacher on course.t_id=teacher.t_id;
2.9.2 左连接

left [outer] join,左连接从左表取出所有记录,与右表匹配。如果没有匹配,以null值代表右边表的列。outer 可以不写,默认情况下不写outer关键字

image-20230608104701168
语法:
 select  字段 from a表 left join b表  on 连接条件

注意:
a表是主表,都显示。
b表从表
主表内容全都有,从表内没有的显示null。

注意:“left join”两边的表的位置不可以互换,交换后结果可能不一样。需要考虑好哪个是主表,哪个是从表。写在前面的是主表

mysql> SELECT course.c_id, course.c_name, teacher.t_name FROM course LEFT JOIN teacher ON course.t_id = teacher.t_id;
+------+--------+-----------+
| c_id | c_name | t_name    |
+------+--------+-----------+
|    1 | 语文   | 王老师    |
|    2 | 数学   | 李老师    |
|    3 | 英语   | 刘老师    |
|    4 | 化学   | NULL      |
+------+--------+-----------+
2.9.3 右连接

right [outer] join,右连接从右表取出所有记录,与左表匹配。如果没有匹配,以null值代表左边表的列。outer 可以不写,默认情况下不写outer关键字。

image-20230608104450400
语法:
select 字段 from a表 right join  b表 on 条件 

注意:
a表是从表,
b表主表,都显示。
mysql> SELECT course.c_id, course.c_name, teacher.t_name FROM course RIGHT JOIN teacher ON course.t_id = teacher.t_id;
+------+--------+-----------+
| c_id | c_name | t_name    |
+------+--------+-----------+
|    1 | 语文   | 王老师    |
|    2 | 数学   | 李老师    |
|    3 | 英语   | 刘老师    |
| NULL | NULL   | 吴老师    |
+------+--------+-----------+

2.10 聚合函数

函数:执行特定功能的代码块。

2.10.1 算数运算函数
2.10.1.1 Sum()求和

例子:显示所有图书单价的总和

mysql>  select sum(price) from books; 
+------------+
| sum(price) |
+------------+
|      10048 |
+------------+
1 row in set (0.00 sec)

mysql> select sum(price) as 图书总价 from books;
+--------------+
| 图书总价     |
+--------------+
|        10048 |
+--------------+
1 row in set (0.00 sec)
2.10.1.2 avg()平均值

例子:求书籍Id小于3的所有书籍的平均价格

mysql> select avg(price) from books where bId<=3;
+------------+
| avg(price) |
+------------+
|    39.3333 |
+------------+
1 row in set (0.01 sec)

mysql> 
2.10.1.3 max() 最大值

例子:求所有图书中价格最贵的书籍

mysql> select bName,price from books where price=(select max(price) from books);
+----------------------------------------+-------+
| bName                                  | price |
+----------------------------------------+-------+
| Javascript与Jscript从入门到精通        |  7500 |
+----------------------------------------+-------+
1 row in set (0.00 sec)

mysql> 
2.10.1.4 min()最小值

例子:求所有图书中价格便宜的书籍

mysql> select bName,price from books where price=(select min(price) from books);
+-----------------------+-------+
| bName                 | price |
+-----------------------+-------+
| 网站制作直通车        |    34 |
+-----------------------+-------+
1 row in set (0.00 sec)

综合案例1:求所有书籍的最大价格和最小价格之差是多少?

mysql> select max(price)-min(price)  from books;
+-----------------------+
| max(price)-min(price) |
+-----------------------+
|                  7466 |
+-----------------------+
1 row in set (0.00 sec)

综合案例2:找出所有书籍价格大于50元的前3本书

mysql> select price from books group by price having price>50 order by price desc limit 0,3;
+-------+
| price |
+-------+
|  7500 |
|   104 |
|    95 |
+-------+
3 rows in set (0.00 sec)
2.10.1.5 count()统计记录数

count(*)和count(colume)的区别在于,count(colume)会忽略为空的列

例子:统计价格大于40的书籍数量

mysql>  select count(*) from books where price>40;
+----------+
| count(*) |
+----------+
|       43 |
+----------+
1 row in set (0.00 sec)

Count()中还可以增加你需要的内容,比如增加distinct来配合使用

mysql> select count(distinct price) from books where price>40;
+-----------------------+
| count(distinct price) |
+-----------------------+
|                    26 |
+-----------------------+
1 row in set (0.00 sec)

2.11 算数运算

+ - * / 

例子:给所有价格小于40元的书籍,涨价5元

mysql> update books set price=price+5 where price<40;

例子:给所有价格高于70元的书籍打8折

mysql> update books set price=price*0.8 where price>70;

2.12 字符串函数

substr(string ,start,len) 截取:从start开始,截取len长.start 从1开始算起

mysql>  select substr(bTypeName,1,7) from category where bTypeId=10;
+-----------------------+
| substr(bTypeName,1,7) |
+-----------------------+
| AutoCAD               |
+-----------------------+
1 row in set (0.00 sec)

mysql> select substr(bTypeName,8,2)from category where bTypeId=10;
+-----------------------+
| substr(bTypeName,8,2) |
+-----------------------+
| 技术                  |
+-----------------------+
1 row in set (0.00 sec)

mysql> 

concat(str1,str2,str3.....) 拼接。 把多个字段拼成一个字段输出

mysql> select concat(bName,publishing) from books;

2.13 大小写转换

2.13.1 upper()大写: 转为大写输出
mysql> select upper(bname) from books where bId=9;
+---------------------------+
| upper(bname)              |
+---------------------------+
| DREAMWEAVER 4网页制作     |
+---------------------------+
1 row in set (0.00 sec)

mysql> 
2.13.2 lower()小写 :转为小写输出
mysql> select lower(bName) from books where bId=10;
+-------------------------------+
| lower(bName)                  |
+-------------------------------+
| 3d max 3.0 创作效果百例       |
+-------------------------------+
1 row in set (0.00 sec)

mysql>