MySQL进阶查询
在配置实验环境
create database kgc;
use kgc;
###在数据库kgc中创建数据表location,并添加数据记录
create table location (Region char(20),Store_Name char(20));
insert into location values('East','Boston');
insert into location values('East','New York');
insert into location values('West','Los Angeles');
insert into location values('West','Houston');
###在数据库kgc中创建数据表store_info,并添加数据记录
create table store_info (Store_Name char(20),Sales int(10),Date char(10));
insert into store_info values('Los Angeles','1500','2020-12-05');
insert into store_info values('Houston','250','2020-12-07');
insert into store_info values('Los Angeles','300','2020-12-08');
insert into store_info values('Boston','700','2020-12-08');
SELECT
查询内容
语法:SELECT "字段" FROM "表名";
select store_name from store_info;
DISTINCT
不显示重复的数据记录
语法:SELECT DISTINCT "字段" FROM "表名";
SELECT DISTINCT Store_Name FROM store_info;
WHERE
有条件查询
语法:SELECT "字段" FROM "表名" WHERE "条件";
SELECT Store_Name FROM store_info WHERE Sales > 1000;
AND OR
且 或
语法:SELECT "字段" FROM "表名" WHERE "条件1" {[AND|OR] "条件2"}+ ;
SELECT Store_Name FROM store_info WHERE Sales > 1000 OR (Sales < 500 AND Sales > 200);
IN
显示已知的值的数据记录
语法:SELECT "字段" FROM "表名" WHERE "字段" IN ('值1', '值2', ...);
SELECT * FROM store_info WHERE Store_Name IN ('Los Angeles', 'Houston');
BETWEEN
显示两个值范围内的数据记录
语法:SELECT "字段" FROM "表名" WHERE "字段" BETWEEN '值1' AND '值2';
SELECT * FROM store_info WHERE Date BETWEEN '2020-12-06' AND '2020-12-10';
---- 通配符 ----通常通配符都是跟 LIKE 一起使用的
% :百分号表示零个、一个或多个字符
_ :下划线表示单个字符
'A_Z':所有以 'A' 起头,另一个任何值的字符,且以 'Z' 为结尾的字符串。例如,'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字符,而不是一个字符)。
'ABC%': 所有以 'ABC' 起头的字符串。例如,'ABCD' 和 'ABCABC' 都符合这个模式。
'%XYZ': 所有以 'XYZ' 结尾的字符串。例如,'WXYZ' 和 'ZZXYZ' 都符合这个模式。
'%AN%': 所有含有 'AN'这个模式的字符串。例如,'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个模式。
'_AN%':所有第二个字母为 'A' 和第三个字母为 'N' 的字符串。例如,'SAN FRANCISCO' 符合这个模式,而 'LOS ANGELES' 则不符合这个模式。
---- LIKE ----匹配一个模式来找出我们要的数据记录
语法:SELECT "字段" FROM "表名" WHERE "字段" LIKE {模式};
SELECT * FROM store_info WHERE Store_Name like '%os%';
1、按关键字排序(order by)
1、使用order by语句来实现排序 2、排序可针对一个或多个字段 3、ASC:升序,默认排序方式 4、DESC:降序 5、order by的语法结构
select 字段1,字段2 from 表名 order by 字段1 desc|asc,字段2 desc|asc;
2、对结果进行分组
1、使用group by语句来实现分组 2、通常结合聚合函数一起使用 3、可以按一个或多个字段对结果进行分组 4、group by的语法结构
select count(name),score from a where score > 80 group by score;
3、限制结果条目
1、只返回select查询结果的第一行或前几行 2、使用limit语句限制条目 3、limit语法结构
offset:位置偏移量,从0开始 number:返回记录行的最大数目
select 字段1,字段2 from 表名 limit [offset,] number;
offset:位置偏移量,从0开始 number:返回记录行的最大数目
例子:
select * from a limit 2,3; ##从索引2开始,显示3行
4、设置别名
1、使用as语句设置别名,关键字as可省略 2、设置别名时,保证不能与库中其他表或字段名称冲突 3、别名的语法结构 字段别名:
select 字段 as 别名 from 表名;
表的别名:
select 字段 from 表名 as 别名;
5、通配符
1、用于替换字符串中的部分字符 2、通常配合like一起使用,并协同where完成查询 3、常用通配符
% 表示零个、一个或多个即任意字符
_ 表示单个字符
6、子查询
1、也称作内查询或者嵌套查询 2、先于主查询被执行,其结果将作为外层主查询的条件 3、在增删改查中都可以使用子查询 4、支持多层嵌套 5、in语句用来判断某个值是否在给定的结果集中
例:
select id,name from a where id in(1,2);
select * from a where id in(select id from a where score>80);
7、null值
null:真空(什么都没有) ‘’:空气(还有空气) 1、表示缺失的值 2、与数字0或者空白(spaces)是不同的 3、使用is null或is not null进行判断 4、null值和空值(’’)的区别 空值长度为0,不占空间;null值的长度为null,占用空间 is null无法判断空值 空值使用“=”或者“<>”来处理 count()计算时,null会忽略,空值会加入计算
8、正则表达式
^ | 匹配文本的开始字符 |
---|---|
$ | 匹配文本的结束字符 |
. | 匹配任何单个字符 |
* | 匹配前面的字符零次或多次 |
+ | 匹配前面的字符一次或多次 |
字符串 | 匹配包含指定的字符串 |
p1lp2 | 匹配p1或p2 |
[…] | 匹配字符集合中任一字符 |
[^…] | 匹配不在括号中的任一字符 |
{n} | 匹配前面的字符串n次 |
{n,m} | 匹配前面的字符串至少n次,之多m次 |
9、运算符
比较运算符
逻辑运算符
(1)逻辑非
逻辑非将跟在它后面的逻辑测试取反,把真变为假,把假变为真。 如果 NOT 后面的操作数为 0 时,所得值为 1;如果操作数为非 0 时,所得值为 0;如果操作数为 NULL 时,所得值为 NULL。 注意:非0值都是1
(2)逻辑与
如果所有值都是真返回 1,否则返回 0。
(3)逻辑或(最好用or)
逻辑或表示包含的操作数,任意一个为非零值并且不是 NULL 值时,返回 1,否则返回0。
(4)逻辑异或
两个非 NULL 值的操作数,如果两者都是 0 或者都是非 0,则返回 0;如果一个为 0, 另一个为非 0,则返回结果为 1; 当任意一个值为 NULL 时,返回值为 NULL。
运算总结: and运算,只要碰到0就是0,(非0和null是null) or运算,只要碰到非0值就是1,(0和null是null) 异或运算,只要碰到null都是null
位运算符
位运算符实际上是对二进制数进行计算的运算符。
位运算方法: 按位与运算 10–》1010 15–》1111 1010 --》10 按位与运算(&),是对应的二进制位都是 1 的,它们的运算结果为 1,否则为 0
按位或运算 10–》1010 15–》1111 1111–》15 按位或运算(|),是对应的二进制位只要是 1 的,它们的运算结果就为 1,否则为 0
按位异或运算 10–》1010 15–》1111 0101–》5 按位异或运算(^),是对应的二进制位不相同时,运算结果 1,否则为 0
按位取反运算 1–》0001 ~1–》1110 5–》0101 0100–》4 按位取反(~),是对应的二进制数逐位反转,即 1 取反后变为 0, 0 取反后变为 1
按位左移运算 1<<2 1–》0001 按位左移2位,空缺处补0 0100–》4
10<<3 10–》1010 按位左移3位,空缺处补0 1010000–》80 按位右移运算 10>>2 10–》1010 按位右移2位,多余的位数直接删除 0010–》2
15>>2 15–》1111 按位右移2位,多余的位数直接删除 0011–》3 常用的运算符优先级
10、连接查询
通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。 要先确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。
使用较多的连接查询包括:内连接、左连接和右连接
1、内连接
在from子句中使用关键字 inner join 来连接多张表,并使用 on子句设置连接条件。 mysql> select info.name,hob.hobbyname from info inner join hob on info.hobby=hob.id; 内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表。
2、外连接
左连接,主表在左边,主表内容会全部显示出来,在从表中没匹配到的以NULL显示出来
右连接,主表在右边,主表内容会全部显示出来,在从表中没匹配到的以NULL显示出来