
MySQL数据库的高级查询
MySQL数据库的高级查询
一、数据类型
MySQL中定义数据字段的类型对你数据库的优化是非常重要的,MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型
1.1 数值型
在数值型中还可以进一步分为整数型、浮点型和定点型
1.1.1 整数型
MySQL的整型类型用于保存整数,根据取值范围的不同,整数类型可划分为5种。
注意:
不同整数类型的取值范围是通过字节数计算出来的,一个字节数等于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)。
注意:
当浮点数类型使用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等多种类型,不同数据类型具有不同的特点。
1.3.1 CHAR和VARCHAR类型
CHAR和VARCHAR类型都是用来保存字符串数据,两者不同的是,VARCHAR可以存储可变长度的字符串数据。
在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)存储需求对比
- 对于CHAR(4)无论插入值的长度是多少,所占存储空间就为4字节,而VARCHAR(4)占用的字节数为实际长度加1
1.3.1.2 CHAR(M)和VARCHAR(M)的特点及应用环境
注意:
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类型用于保存大文本数据,例如,文章内容,评论等比较长的文本。
注意:
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类型时指定的成员个数决定
- 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,不同的是,它们所表示的是二进制数据。
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文档等。
注意:
- 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表的数据集,通俗一点说就是求两个表的交集。

语法:
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关键字

语法:
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关键字。

语法:
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>
- 感谢你赐予我前进的力量