【基础篇】SQL语句基础、MySQL的数据类型和MySQL中的运算符


  数据库一直是热门话题,今天有了开源的新的技术,明天又有了某某某,尤其现在绝大多数企业对数据的重视程度增加,使得应聘时,数据库成了必备技能。而MySQL 由于具有免费使用、配置简单、稳定性好、性能优良等优点,在众多数据库中脱颖而出,虽然现在最热最受欢迎的并不是MySQL ,但作为学习,掌握MySQL带领走进数据库的殿堂 。

一、SQL基础

  当面对一个陌生的数据库时,通常需要一种方式与它进行交互,以完成用户所需要的各种工作,这个时候,就要用到 SQL 语言了。SQL 是 Structure Query Language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言,由 IBM 在 20 世纪 70 年代开发出来,作为 IBM 关系数据库原型 System R 的原型关系语言,实现了关系数据库中的信息检索。
  20 世纪 80 年代初,美国国家标准局(ANSI)开始着手制定 SQL 标准,最早的 ANSI 标准于1986 年完成,就被叫作 SQL-86。标准的出台使 SQL 作为标准关系数据库语言的地位得到了加强。SQL 标准目前已几经修改更趋完善。正是由于 SQL 语言的标准化,所以大多数关系型数据库系统都支持 SQL 语言,它已经发展成为多种平台进行交互操作的底层会话语言。

1、SQL分类

  SQL 语句主要可以划分为以下 3 个类别。

  • DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter等。
  • DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、udpate 和select 等。
  • DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke 等。

2、DDL语句

  DDL 是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建、删除、修改的操作语言。它和 DML 语言的最大区别是 DML 只是对表内部数据的操作,而不涉及到表的定义、结构的修改,更不会涉及到其他对象。DDL 语句更多的被数据库管理员(DBA)所使用,一般的开发人员很少使用。

1.创建语句----create

1.创建数据库语句:(注意后面的分号)
CREATE DATABASE dbname;

当数据库存在时,会出错,可以使用以下语句查看系统现存的数据库
show databases;
使用数据库:
USE dbname

2.创建表
CREATE TABLE tablename (column_name_1 column_type_1 constraints,…)
其中column_name是列名,column_type是数据类型,constraints是约束条件

例如,创建一个emp表。表包括3个字段,ename,hiredate、sal,字段类型分别为 varchar(10)、date、int(2)
create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));

1、查看数据库有哪些表
show tables;
2、 查看表信息
DESC tablename

2.删除语句----drop

删除数据库语法:
drop database dbname;

注意:数据库删除后,下面的所有表数据都会全部删除,所以删除前一定要仔细检查并做好相应备份

3.修改语句----Alter

  对于已经创建好的表,尤其是已经有大量数据的表,如果需要对表做一些结构上的改变,我们可以先将表删除(drop),然后再按照新的表定义重建表。这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载。而且,如果有服务在访问表,也会对服务产生影响。
  因此,在大多数情况下,表结构的更改一般都使用 alter table 语句,以下是一些常用的命令。

1.修改表字段类型
ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name];

例如:修改表emp的 ename 字段定义,将 varchar(10)改为 varchar(20)
alter table emp MODIFY ename varchar(20);
该语句也可以指定顺序,用法同add

2.增加表字段
ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name];

例如,表 emp 上新增加字段 age,类型为 int(3):
alter table emp ADD column age int(3);
在指定位置增加
例如,表 emp 上新增加字段 age,使其在字段ename之后,类型为 int(3):
alter table emp ADD column age int(3) after ename;

3.删除表字段
ALTER TABLE tablename DROP [COLUMN] col_name

例如,将字段 age 删除掉:
alter table emp DROP column age;

4.修改字段名
ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]

例如,将 age 改名为 age1,同时修改字段类型为 int(4):
alter table emp CHANGE age age1 int(4);
需要注意的是:change和modify都可以修改表的定义,但modify不能改字段名字
该语句也可以指定顺序,用法同add

5.表改名
ALTER TABLE tablename RENAME [TO] new_tablename

例如,将表 emp 改名为 emp1,命令如下:
alter table emp rename emp1;
注意:这里是表改名,和改表字段名字不一样哦

3、DML语句

  DML 操作是指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select),是开发人员日常使用最频繁的操作。下面将依次对它们进行介绍

1.插入语句----insert

  表创建好后,就可以往里插入记录了,插入记录的基本语法如下:

INSERT INTO tablename (field1,field2,……fieldn) VALUES (value1,value2,……valuesn);

单条插入
  单条插入时,如果是插入全部字段,则可以省略字段名,但必须保证数据顺序一致。

insert into emp(ename,hiredate,sal) values('张三','2022-04-01',1000);
--等价于
insert into emp values('张三','2022-04-01',1000);

  但是,如果是插入的不是全部字段,就必须指定列名,且必须保证数据顺序一致。没指定的列名(这里必不能是非空字段),会自动的填充NULL值或者自增的下一个。

insert into emp(ename,hiredate) values('张三','2022-04-01');

多条插入
  在 MySQL 中,insert 语句还有一个很好的特性,可以一次性插入多条记录,每条记录之间都用逗号进行了分隔。具体语法如下:

INSERT INTO tablename (field1, field2,……fieldn)
VALUES
(record1_value1, record1_value2,……record1_valuesn),
(record2_value1, record2_value2,……record2_valuesn),
……
(recordn_value1, recordn_value2,……recordn_valuesn)
;

 insert into emp values('张三','2022-04-01',1200),('李四','2022-04-10',1000);

2. 更新语句----update

  对于表里的记录值,可以通过 update 命令进行更改,语法如下:

UPDATE tablename SET field1=value1,field2.=value2,……fieldn=valuen [WHERE CONDITION]

--例子1:更新emp表中ename为“lisa”的薪水(sal)从 3000 更改为 4000:
update emp set sal=4000 where ename='lisa';

  在 MySQL 中,update 命令可以同时更新多个表中数据,语法如下:

UPDATE t1,t2…tn set t1.field1=expr1,tn.fieldn=exprn [WHERE CONDITION]

--例子2:同时更新表 emp 中的字段 sal 和表 dept 中的字段 deptname:
update emp as a,dept b set a.sal=a.sal*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;

--as用于起别名,像a,可省略,像b。

  注意:多表更新的语法更多地用在了根据一个表的字段,来动态的更新另外一个表的字段

3.删除语句----delete

  如果记录不再需要,可以用 delete 命令进行删除,语法如下:

DELETE FROM tablename [WHERE CONDITION]

--例如,在 emp 中将 ename 为‘dony’的记录全部删除,命令如下:
delete from emp where ename='dony';

  同样的,在 MySQL 中可以一次删除多个表的数据,语法如下:

DELETE t1,t2…tn FROM t1,t2…tn [WHERE CONDITION]

--将表 emp 和 dept 中 deptno 为 3 的记录同时都删除:
 delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;

  如果 from 后面的表名用别名,则 delete 后面的也要用相应的别名,否则会提示语法错误。
  注意:不管是单表还是多表,不加 where 条件将会把表的所有记录删除,所以操作时一定要小心。

4.查询语句----select

  数据插入到数据库中后,就可以用 SELECT 命令进行各种各样的查询,使得输出的结果符合我们的要求。由于 SELECT 的语法很复杂,所有这里只介绍最基本的语法,后续使用就会慢慢了解更多的用法。

SELECT [field1,field2,……fieldn] fun_name
FROM tablename
[WHERE where_contition]
[ORDER BY field1 [DESC|ASC]
[GROUP BY field1,field2,……fieldn
[WITH ROLLUP]]
[HAVING where_contition]

  对其参数进行以下说明。

  • fun_name 表示要做的聚合操作,也就是聚合函数,常用的有 sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。
  • [ORDER BY 结果排序,可以使用[DESC|ASC]进行降序/升序的排序。
  • GROUP BY 关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门就应该写在 group by 后面。
  • WITH ROLLUP 是可选语法,表明是否对分类聚合后的结果进行再汇总。
  • HAVING 关键字表示对分类后的结果再进行条件的过滤。

  上面讲的是最基础的语法,但实际中并不是所有的都会使用,下面通过具体的例子经行各个语法的讲解。

最简单的查询
-- 查询所有字段,不加任何条件
select * from emp;
-- 查询想要的字段,加条件(条件可以是多个)
select ename, sales from emp where sales < 1000 and deptno = 1;
去重查询和排序限制输出
-- 去重查询
select distinct ename,sales from emp;
-- 排序(默认升序)
select ename,sales from emp order by sales;
-- 排序指定排序方式(可以多条件排序)
select * from emp order by deptno,sales desc;
select * from emp order by deptno asc,sales desc; 
-- 限制输出(输出销售额前五的数据)
select * from emp order by sales desc limit 5;
-- 甚至可以指定开始的行数(从第二行开始取5条数据)
select * from emp order by sales desc limit 1,5;

注意:
1、limit 经常和 order by 一起配合使用来进行记录的分页显示。
2、limit 属于 MySQL 扩展 SQL92 后的语法,在其他数据库上并不能通用

聚合查询

  正常很多情况下,我们都是需要进行一些汇总操作,而不是直接输出某些个数据,比如统计整个公司的人数或者统计每个部门的人数,这个时就要用到 SQL 的聚合操作。

--要 emp 表中统计公司的总人数:
select count(1) from emp;
--在此基础上,要统计各个部门的人数:(需要注意的是分组字段必须在输出字段中,不然会报错)
select deptno,count(1) as 各部门人数 from emp group by deptno;
-- 更细一些,既要统计各部门人数,又要统计总人数:
select deptno,count(1) from emp group by deptno with rollup;
-- 统计人数大于1的部门(注意输出和筛选的字段要么都用原始,要么都用别名,混用会报错)
select deptno count(1) from emp group by deptno having count(1)>1;
--统计公司所有员工的薪水总额、最高和最低薪水:(as 可以省略)
select sum(sales) as 总额,max(sales) 最高薪水,min(sales) 最低薪水 from emp;

注意:
having 和 where 的区别在于 having 是对聚合后的结果进行条件的过滤,而 where 是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用 where 先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用 having 进行再过滤。

表链接

  当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是內连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。我们最常用的是内连接。

内联

-- 查询员工及其对应的部门名称
select ename,deptname from emp,dept where emp.deptno=dept.deptno;

外联接
  外连接有分为左连接和右连接,具体定义如下。

  • 左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
  • 右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录
-- 查询 emp 中所有用户名和所在部门名称:(没有部门的会自动NULL补充)
select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
-- 右联实现上述问题(只是顺序变了,链接方式变了)
select ename,deptname from deft right join emp on dept.deptno=emp.deptno;

注意:mysql没有全外联,需要使用其他的方法实现,后续遇到再举例子

子查询

  某些情况下,当我们查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就要用到子查询。用于子查询的关键字主要包括 in、not in、=、!=、exists、not exists 等。

-- 从 emp 表中查询出所有部门在 dept 表中的所有记录:
select * from emp where deptno in (select deptno from dept);
-- 某些情况下,子查询可以转化为表连接,但不是全部,要自行判断逻辑的合理性
select emp.* from emp ,dept where emp.deptno=dept.deptno;

注意:表连接在很多情况下用于优化子查询

联合输出

  我们经常会碰到这样的应用,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用 union 和 union all 关键字来实现这样的功能,具体语法如下:

SELECT * FROM t1
UNION|UNION ALL
SELECT * FROM t2
……
UNION|UNION ALL
SELECT * FROM tn;

  UNION 和 UNION ALL 的主要区别是 UNION ALL 是把结果集直接合并在一起,而 UNION 是将UNION ALL 后的结果进行一次 DISTINCT,去除重复记录后的结果。

4、DCL语句

  DCL 语句主要是 DBA 用来管理系统中的对象权限时所使用,一般的开发人员很少使用。这里不做过多的讲解,感兴趣的可以自行查阅。

二、MyQSL的数据类型

  每一个常量,变量和参数都有数据类型,它用来指定一定的存储格式、约束和有效范围。MySQL 提供了多种数据类型,主要包括数值型、字符串类型、日期和时间类型。不同的 MySQL版本支持的数据类型可能会稍有不同,用户可以通过查询相应版本的帮助文件来获得具体信息。

1、数值类型

在这里插入图片描述
  在整数类型中,按照取值范围和存储方式不同,分为 tinyint、smallint、mediumint、int、bigint 这 5 个类型。如果超出类型范围的操作,会发生“Out of range”错误提示。为了避免此类问题发生,在选择数据类型时要根据应用的实际情况确定其取值范围,最后根据确定的结果慎重选择数据类型。
  对于整型数据,MySQL 还支持在类型名称后面的小括号内指定显示宽度,例如 int(5)表示当数值宽度小于 5 位的时候在数字前面填满宽度,如果不显示指定宽度则默认为 int(11)。一般配合 zerofill 使用,顾名思义,zerofill 就是用“0”填充的意思,也就是在数字位数不够的空间用字符“0”填满。
  所有的整数类型都有一个可选属性 UNSIGNED(无符号),如果需要在字段里面保存非负数或者需要较大的上限值时,可以用此选项,它的取值范围是正常值的下限取 0,上限取原值的 2 倍,例如,tinyint 有符号范围是-128~+127,而无符号范围是 0~255。如果一个列指定为 zerofill,则 MySQL 自动为该列添加 UNSIGNED 属性。
  另外,整数类型还有一个属性:AUTO_INCREMENT。在需要产生唯一标识符或顺序值时,可利用此属性,这个属性只用于整数类型。AUTO_INCREMENT 值一般从 1 开始,每行增加 1。在插入 NULL 到一个AUTO_INCREMENT 列时,MySQL 插入一个比该列中当前最大值大 1 的 值。一个表中最多只能有一个AUTO_INCREMENT列。对于任何想要使用AUTO_INCREMENT 的 列,应该定义为 NOT NULL,并定义为 PRIMARY KEY 或定义为 UNIQUE 键。

-- 添加自增主键的方式有以下三种
CREATE TABLE AI (ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY);
CREATE TABLE AI(ID INT AUTO_INCREMENT NOT NULL ,PRIMARY KEY(ID));
CREATE TABLE AI (ID INT AUTO_INCREMENT NOT NULL ,UNIQUE(ID));

  对于小数的表示,MySQL 分为两种方式:浮点数和定点数。浮点数包括 float(单精度) 和 double(双精度),而定点数则只有 decimal 一种表示。定点数在 MySQL 内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。
  浮点数和定点数都可以用类型名称后加“(M,D)”的方式来进行表示,“(M,D)”表示该值一共显示 M 位数字(整数位+小数位),其中 D 位位于小数点后面,M 和 D 又称为精度和标度。当设置D参数,则数据根据参数D截取数据,不设置时,按默认的截取,float和double都默认会按照实际的精度(由实际的硬件和操作系统决定),而decimal时按照decimal(10,0)截取数据。

2、日期时间类型

  MySQL 中有多种数据类型可以用于日期和时间的表示,不同的版本可能有所差异,下表 中列出了 MySQL 5.7 中所支持的日期和时间类型。
在这里插入图片描述
这些数据类型的主要区别如下:

  • 如果要用来表示年月日,通常用 DATE 来表示。
  • 如果要用来表示年月日时分秒,通常用 DATETIME 表示。
  • 如果只用来表示时分秒,通常用 TIME 来表示。  如果需要经常插入或者更新日期为当前系统时间,则通常使用TIMESTAMP 来表示。TIMESTAMP 值返回后显示为“YYYY-MM-DD HH:MM:SS”格式的字符串,显示宽度固定为 19 个字符。如果想要获得数字值,应在 TIMESTAMP 列添加+0。
  • 如果只是表示年份,可以用 YEAR 来表示,它比 DATE 占用更少的空间。YEAR 有 2 位或4 位格式的年。默认是 4 位格式。在 4 位格式中,允许的值是 1901~2155 和 0000。在 2 位格式中,允许的值是 70~69,表示从 1970~2069年。MySQL 以 YYYY 格式显示 YEAR值。

  DATE、TIME 和 DATETIME 是最常使用的 3 种日期类型,以下例子在 3 种类型字段插入了相同的日期值,来看看它们的显示结果:

-- 创建一个有三种类型的表
create table t1 (d date,t time,dt datetime);
-- 插入数据
insert into t1 values(now(),now(),now());
-- 查看数据
select * from t1;

+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2007-07-19 | 17:41:13 | 2007-07-19 17:41:13 |
+------------+----------+---------------------+
1 row in set (0.00 sec)

  TIMESTAMP也用来表示日期,但是和DATETIME有所不同,后面会专门讲解,这里首先说一个概念,就是TIMESTAMP时区相关,当插入日期时,会先转换为本地时区后存放;而从数据库里面取出时,也同样需要将日期转换为本地时区后显示。这样,两个不同时区的用户看到的同一个日期可能是不一样的。

  日期类型的插入格式有很多,包括整数(如2100)、字符串(如 2038-01-19 11:14:08)、函数(如 NOW())等,大家可能会感到疑惑,到底什么样的格式才能够正确地插入到对应的日期字段中呢?下面以 DATETIME 为例进行介绍;

  • YYYY-MM-DD HH:MM:SS 或 YY-MM-DD HH:MM:SS 格式的字符串。允许“不严格”语法:任何标点符都可以用做日期部分或时间部分之间的间割符。例如,“98-12-31 11:30:45”、“98.12.31 11+30+45”、“98/12/31 113045”和“98@12@31 11^30^45”是等价的。对于包括日期部分间割符的字符串值,如果日和月的值小于 10,不需要指定两位数。“1979-6-9”与“1979-06-09”是相同的。同样,对于包括时间部分间割符的字符串值,如果时、分和秒的值小于 10,不需要指定两位数。“1979-10-30 1:2:3”与“1979-10-30 01:02:03”相同。
  • YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,“19970523091528”和“970523091528”被解释为“1997-05-23 09:15:28”,但“971122129015”是不合法的(它有一个没有意义的分钟部分),将变为“0000-00-00 00:00:00”。
  • YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的数字,假定数字对于日期类型是有意义的。例如,19830905132800和830905132800被解释为“1983-09-05 13:28:00”。数字值应为 6、8、12 或者 14 位长。如果一个数值是 8 或 14 位长,则假定为YYYYMMDD 或 YYYYMMDDHHMMSS 格式,前 4 位数表示年。如果数字 是 6 或 12位长,则假定为 YYMMDD 或 YYMMDDHHMMSS 格式,前 2 位数表示年。其他数字被解释为仿佛用零填充到了最近的长度。
  • 函数返回的结果,其值适合 DATETIME、DATE 或者 TIMESTAMP 上下文,例如 NOW()或 CURRENT_DATE
--不同的格式将日期“2007-9-3 12:10:10”插入到 DATETIME列中。
create table t6(dt datetime);
insert into t6 values('2007-9-3 12:10:10');
insert into t6 values('2007/9/3 12+10+10');
insert into t6 values('20070903121010');
insert into t6 values(20070903121010);

3、字符串类型

  MySQL 中提供了多种对字符数据的存储类型,不同的版本可能有所差异。以 5.7 版本为例,MySQL 包括了 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET 等多种字符串类型。具体如下表:
在这里插入图片描述

1. CHAR和VARCHAR

  CHAR 和 VARCHAR 很类似,都用来保存 MySQL 中较短的字符串,也是最常见的保存字符串的类型。二者的主要区别在于存储方式的不同:CHAR 是定长的(指定多少就是多少); 而 VARCHAR 是可变长的(根据实际数据的长度调整)。在检索的时候,CHAR 列删除了尾部的空格,而 VARCHAR 则保留这些空格。下面的例子中通过给表 vc 中的VARCHAR(4)和 char(4)字段插入相同的字符串来描述这个区别。

--创建测试表 t1,并定义两个字段 v VARCHAR(4)和 c CHAR(4):
create table t1(v varchar(4), c char(4));
-- 插入相同的数据
INSERT INTO t1 VALUES ('ab ', 'ab ');
-- 查看结果
select length(v),length(c) from t1;
| length(v) | length(c) |
+-----------+-----------+
| 4 | 2 | 
+-----------+-----------+
1 row in set (0.01 sec)

-- 更加直观的查看
SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM t1;
+----------------+----------------+
| CONCAT(v, '+') | CONCAT(c, '+') |
+----------------+----------------+
| ab + | ab+ |
+----------------+----------------+
1 row in set (0.00 sec)

2. BINARY 和 VARBINARY 类型

  BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不包含非二进制字符串。

3. ENUM 类型

  ENUM 中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对 1~255 个成员的枚举需要 1 个字节存储;对于 255~65535 个成员,需要 2 个字节存储。最多允许有 65535 个成员。下面往测试表 t3 中插入几条记录来看看 ENUM 的使用方法。

--创建测试表 t3,定义 gender 字段为枚举类型,成员为'M'和'F'
create table t3 (gender enum('M','F'));
--插入 4 条不同的记录
 INSERT INTO t3 
 VALUES('M'),
 ('1'),
 ('f'),
 (NULL);
 -- 查看数据
select * from t3;
+--------+
| gender |
+--------+
| M |
| M |
| F |
| NULL |
+--------+
4 rows in set (0.01 sec)

  从上面的例子中,可以看出 ENUM 类型是忽略大小写的,对’M’、‘f’在存储的时候将它们都转成了大写,还可以看出对于插入不在 ENUM 指定范围内的值时,并没有返回警告,而是插入了 enum(‘M’,‘F’)的第一值’M’,这点用户在使用时要特别注意。另外,ENUM 类型只允许从值集合中选取单个值,而不能一次取多个值。

4. SET 类型

  Set 和 ENUM 类型非常类似,也是一个字符串对象,里面可以包含 0~64 个成员。根据成员的不同,存储上也有所不同。

  • 1~8 成员的集合,占 1 个字节。
  • 9~16 成员的集合,占 2 个字节。
  • 17~24 成员的集合,占 3 个字节。
  • 25~32 成员的集合,占 4 个字节。
  • 33~64 成员的集合,占 8 个字节。

  Set 和 ENUM 除了存储之外,最主要的区别在于 Set 类型一次可以选取多个成员,而 ENUM则只能选一个。下面的例子在表 t4 中插入了多组不同的成员:

--创建测试表 t4,
Create table t4 (col set('a','b','c','d'));
--插入 5 条不同的记录
insert into t values('a,b'),('a,d,a'),('a,b'),('a,c'),('a');
 -- 查看数据
select * from t4;
+------+
| col |
+------+
| a,b |
| a,d |
| a,b |
| a,c |
| a |
+--------+
5 rows in set (0.01 sec)

  SET 类型可以从允许值集合中选择任意 1 个或多个元素进行组合,所以对于输入的值只要是在允许值的组合范围内,都可以正确地注入到 SET 类型的列中。对于超出允许值范围的值例如(‘a,d,f’)将不允许注入到上面例子中设置的 SET 类型列中,而对于(‘a,d,a’)这样包含重复成员的集合将只取一次,写入后的结果为“a,d”,这一点请注意。

三、MySQL中的运算符

1、算术运算符

在这里插入图片描述

2、比较运算符

在这里插入图片描述
  当使用SELECT语句进行查询时,MySQL允许用户对表达式的左边操作数和右边操作数进行比较,比较结果为真,则返回 1,为假则返回 0,比较结果不确定则返回 NULL。
  比较运算符可以用于比较数字、字符串和表达式。数字作为浮点数比较,而字符串以不区分大小写的方式进行比较。

3、逻辑运算符

运算符作用
NOT 或!逻辑非
AND 或&&逻辑与
OR 或 ||逻辑或
XOR逻辑异或

4、位运算符

  位运算是将给定的操作数转化为二进制后,对各个操作数每一位都进行指定的逻辑运算,得到的二进制结果转换为十进制数后就是位运算的结果。常用的位运算如下表:
在这里插入图片描述
需要注意的是:位运算符中的位与“&”和位或“|”和前面介绍的逻辑与和逻辑或非常类似。千万不能写错哦。

5、运算符的优先级

  前面介绍了很多的运算符,那如果当两个以上的运算符同时存在时,先算哪个后算哪个呢?请看下表:
在这里插入图片描述
  在实际运行的时候,很少有人能将这些优先级熟练记忆,很多情况下我们都是用“()”来将需要优先的操作括起来,这样既起到了优先的作用,又使得其他用户看起来更加易于理解。

补充:
  
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值