DQL基本查询——INSERT INTO SELECT语句


概述:

  • 将一张表的数据导入到另一张表中,可以使用INSERTINTO SELECT语句

格式

insert into 表1(字段1一,字段1二,..)select 字段2一,字段2二 ,...from 表2 或 insert into 表1 select * from 表2

INSERT INTO student1 SELECT*FROM student;

注意:

  • 填写字段的话,前后字段数据类型要一一对应
  • 要求目标表(表2)必须存在

DQL——正则表达式


概述:

  • 正则表达式(regular expression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串
  • 在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本
  • MySQL通过REGEXP关键字支持正则表达式进行字符串匹配

格式

模式

描述

^

匹配输入字符串的开始位置

$

匹配输入字符串的结束位置

.

匹配除“\n”之外的任何单个字符

[...]

字符集合。匹配所包含的任意一个字符。例如,abc]可以匹配“plain”中的'a'

[^...]

负值字符集合。匹配未包含的任意字符。例如,^abc 可以匹配“plain”中的'p'

p1 I p2 I p3

匹配 p1或p2或p3。例如,zfood 能匹配"z”或"food”。zlf)ood' 则匹配zood"或"food"

贪婪的量词

模式

描述

*

匹配前面的子表达式零次或多次。例如,zo* 能匹配“z”以及“zoo”。* 等价于{0,}

+

匹配前面的子表达式一次或多次。例如,'zo+’能匹配“zo”以及“zoo",但不能匹配“z”。+等价于{1,0}

{n}

n是一个非负整数。匹配确定的n次。例如,‘o{2}’不能匹配"Bob”中的‘o’,但是能匹配'food”中的两个o

{n,m}

m和n 均为非负整数,其中n <= m。最少匹配n 次且最多匹配 m 次

注意:

  • 匹配成功为1,失败为0
  • 存在就能匹配,无论在哪个位置,无论被匹配对象有几个字符,只要有一个与匹配规则相符,就是正确
  • 如果要把多个字符作为一个整体去配就需要用到括号,不用括号括起来都是用单个字符去匹配

基本展示

SELECT 'abc' REGEXP 'ab+'; -- 1

MySQL约束——零填充约束(zerofill)


概念

  • 插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
  • zerofill默认为int(10)
  • 当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,(有符号为-128~ +127,无符号为0~256

如果我们添加数据:1,查询到的数据样式如下

MySQL基础内容补充_字段

添加零填充约束:两种方式

格式: CREATE TABLE 表名( 字段名 数据类型 ZEROFILL
);

CREATE TABLE student(
	id INT ZEROFILL  -- 零填充约束
);

格式: ALTER TABLE 表名 MODIFY 字段名 数据类型 ZEROFILL;

ALTER TABLE student MODIFY id INT ZEROFILL;

删除零填充约束

格式: ALTER TABLE 表名 MODIFY 字段名 数据类型;

ALTER TABLE student MODIFY id INT;

(zerofill零填充约束,从Mysql 8.0.17开始,官方不推荐这个约束,未来版本可能会删除)

多表操作——子查询关键字


在子查询中,有一些常用的逻辑关键字,这些关键字可以给我们提供更丰富的查询功能,主要关键字如下:

  1. ALL关键字
  2. ANY关键字
  3. SOME关键字
  4. IN关键字
  5. EXISTS关键字

ALL关键字

格式:

select …from …where c > all(查询语句) 等价于: select ...from ... where c > result1 and c > result2 and c > result3

特点:

  • ALL:与子查询返回的所有值比较为true 则返回true
  • ALL可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。
  • ALL表示指定列中的值必须要大于子查询集的每一个值,即必须要大于子查询集的最大值;如果是小于号即小于子查询集的最小值。同理可以推出其它的比较运算符的情况。

ANY和SOME关键字

格式:

select …from …where c > any(查询语句) 等价于: select ...from ... where c > result1 or c > result2 or c > result3

特点:

  • ANY:与子查询返回的任何值比较为true 则返回true
  • ANY可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的任何一个数据。
  • 表示制定列中的值要大于子查询中的任意一个值,即必须要大于子查询集中的最小值。同理可以推出其它的比较运算符的情况。
  • SOME和ANY的作用一样,SOME可以理解为ANY的别名

IN关键字

格式:

select …from …where c in(查询语句) 等价于: select ...from ... where c = result1 or c = result2 or c = result3

特点:

  • IN关键字,用于判断某个记录的值,是否在指定的集合中
  • 在IN关键字前边加上not可以将条件反过来

EXISTS关键字

格式:

select …from …where exists(查询语句)

特点:

  • 该子查询如果“有数据结果”(至少返回一行数据), 则该EXISTS() 的结果为“true”,外层查询执行
  • 该子查询如果“没有数据结果”(没有任何数据返回),则该EXISTS()的结果为“false”,外层查询不执行
  • EXISTS后面的子查询不返回任何实际数据,只返回真或假,当返回真时 where条件成立

(因为exists条件中,对表的查询是一行一行判断的,所以我比较喜欢用嵌套for循环来理解)

注意:EXISTS关键字,比IN关键字的运算效率高,因此,在实际开发中,特别是大数据量时,推荐使用EXISTS关键字。

使用exists进行全表输出,格式:

select * from 表名 where exists(select 1); -- 全表输出 select * from 表名 where exists(select * from 表名); -- 全表输出

运算符


用处:

  • 数据库中的表结构确立后,表中的数据代表的意义就已经确定。通过MySQL运算符进行运算,就可以获取到表结构以外的另一种数据。
  • 例如,学生表中存在一个birth字段,这个字段表示学生的出生年份。而运用MySQL的算术运算符用当前的年份减学生出生的年份,那么得到的就是这个学生的实际年龄数据。

MySQL支持4种运算符

  1. 算术运算符
  2. 比较运算符
  3. 逻辑运算符
  4. 位运算符

算数运算符

算数运算符

说明

+

加法运算

-

减法运算

*

乘法运算

/ 或 DIV

除法运算,返回尚

% 或 MOD

求余运算,返回余数

比较运算符

比较运算符

说明

=

等于

< 和 <=

小于和小于等于

> 和 >=

大于和大于等于

<=>

安全的等于,两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0

<> 或 !=

不等于

IS NULL 或ISNULL

判断一个值是否为 NULL

IS NOT NULL

判断一个值是否不为 NULL

LEAST

当有两个或多个参数时,返回最小值

GREATEST

当有两个或多个参数时,返回最大值

BETWEEN AND

判断一个值是否落在两个值之间

IN

判断一个值是IN列表中的任意一个值

NOT IN

判断一个值不是IN列表中的任意一个值

LIKE

通配符匹配

REGEXP

正则表达式匹配

逻辑运算符

逻辑运算符

说明

NOT 或者!

逻辑非

AND 或者 &&

逻辑与

OR 或者Il

逻辑或

XOR

逻辑异或

位运算符

位运算符

说明

I

按位或

&

按位与

^

按位异或.

<<

按位左移

>>

按位左移

~

按位取反,反转所有比特

注意:位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算然后再将计算结果从二进制数变回十进制数。

以 | 按位或为例

比如:3|5,我们以二进制的后四位为例,3为0011,5为0101,他们进行相比,只要相同位置上有一个为1,就在 3|5 的相应位置写1,所以 3|5 为 0111=7。(其他的操作差不多,只有 ~:按位取反,反转所有比特 是对一个数进行操作,如:SELECT ~3)

--   3:0011
--   5:0101
-- 3|5:0111=7
SELECT 3|5;