MySQL高级SQL语句

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、运算符

1607585977880

比较运算符

1607586883956

逻辑运算符

                        

(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显示出来

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值