MySQL 是最流行的关系型数据库管理系统
数据库与表
◆数据库相关命令◆
创建数据库: 创建数据库可以使用Create database命令,创建一个lyshark数据库,并查看。
查询数据库: 查询数据库可以使用Show databases命令,也可以通过like限定查询结果。
更新数据库: 将数据库的字符集从 utf8 修改为gbk格式。
删除数据库: 手动删除数据库 lyshark并查询。
◆数据表相关命令◆
创建数据表: 创建lyshark库,用来存储表结构,并指定采用utf8编码,在该数据库中创建tb_user表.
查询表结构: 在MySQL中,查看表结构可以使用describe和show create table语句.
定义单字段主键: 创建表tab_1将id字段定义为primary key主键,其SQL语句的写法如下.
定义多字段主键: 创建表tab_2,将name字段与deptid字段组合在一起,成为tab_2的多字段联合主键.
使用非空约束: 创建表tab_3,指定name字段不能为空,为空则报错误.
使用默认约束: 创建表tab_4,指定salary字段自动默认工资为500,如不填写此项默认是500.
使用唯一约束: 创建表tab_5,并指定字段name列唯一,允许为空,但只能出现一个空值,唯一约束可以确保数据不重复.
注意:unique和primary key的区别,一个表可以有多个字段声明成unique,但只能有一个primary key声明.
设置表自增长: 创建表tab_6指定id员工编号为自动增长模式,并插入数据,省略ID编号这一栏即可.
使用外键约束: 外键用来在两个表的数据之间建立连接,每个外键值必须等于另一个表中主键的某个值.
1.创建一个tb_dept并指定为主表,把tb_emp指定为从表,将两表指定字段相关联.
2.接着创建数据表tb_emp,让它的deptid字段,作为外键关联到tb_dept的主键id字段上.
3.以上语句执行,在表tb_emp上添加了名称为fk_empdept的外键约束,外键字段为deptid,其依赖于tb_dept表中的,主键id.
修改字段与数据
◆操作表中字段◆
修改表名称: 通过alter table语句,将数据表tab_1,改名成lyshark.
修改字段名: 将表中tab_test的salary字段名改为lyshark并修改数据类型为varchar(30).
只修改字段类型: 将表tab_test的name字段数据类型由varchar(20)修改为varchar(40).
在末尾添加字段: 在tab_test表,结尾添加clound字段,类型为varchar(20),并具有not null属性.
在开头添加字段: 在tab_test表的第一列添加一个新字段,字段名wang类型int(4).
在指定位置添加字段: 在tab_test表的指定位置添加一个字段,在name列的后面插入一个xxxx字段类型为int.
删除表中指定字段: 使用alert table drop命令,删除tab_test表中的clound字段.
修改字段排列到第一列: 将tab_test表中的lyshark字段移动到第1列.
修改指定字段到任意位置: 把tab_test表中的manager字段放到lyshark字段的后面.
修改表的存储引擎: 使用show create table查看引擎,并修改tab_test表的默认存储引擎为MyISAM.
MySQL中主要存储引擎有:MyISAM、InnoDB、MEMORY、BDB、FEDERATED等.
删除表的外键约束: 使用drop foreign key命令删除外键,删除tb_emp的外键约束
删除指定表: 删除lyshark数据库中的tab_test表结构.
◆操作表中数据◆
创建一个数据表: 为了方便后续的练习,我们先来创建一个表结构,SQL语句如下:
在所有字段插入数据: 在person表中,插入一条新记录id=1,name=LyShark,age=22,info=Lawyer,SQL语句如下:
在指定字段插入数据: 在person表中,插入一条新记录,name=Willam,age=18,info=sports,我们不给其指定ID,SQL语句如下:
同时为表插入多条记录: 在person表中,同时插入3条新记录,有多条只需要在每一条的后面加,即可,SQL语句如下:
将查询结果插入到表中: 新建一个person_old表,其表结构和person相同,我们将person_old表中的内容全部迁移到person中去,SQL语句如下:
1.创建一个person_old表,并插入测试字段:
2.接下来我们将person_old表中的内容迁移到person中去
更新表中指定字段: 修改person表中数据,将id=11的name字段的值改为xxxx,age字段改为200,SQL语句如下:
更新表的一个范围: 更新person表中的记录,将1-12的info字段全部改为lyshark blog,SQL语句如下:
删除表中指定记录: 通过id号,删除表中指定列,此处删除第id=12号,这条记录,SQL语句如下:
删除表的一个范围: 在person表中,删除age字段值在19-22的记录,SQL语句如下:
清空表中所有记录:
数据类型相关
◆整数数据类型◆
数值型类型主要用来存储数字,MySQL提供了多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需要的存储空间也会越大,MySQL主要提供的整形有:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,整数类型的属性字段可以添加AUTO_INCREMENT自增长约束条件,如下表所示:
类型名称 | 说明信息 | 存储占比 |
---|---|---|
TINYINT | 很小的整数 | 1个字节 |
SMALLINT | 小的整数 | 2个字节 |
MEDIUMINT | 中等大小整数 | 3个字节 |
INT | 普通大小整数 | 4个字节 |
BIGINT | 大整数 | 8个字节 |
上表可看出,不同类型的数据字节是不同的,整数类型的取值范围也是固定的,基本上分为有符号和无符号型,下表就是他们的相应取值范围,仅供参考:
数据类型 | 有符号 | 无符号 |
---|---|---|
TINYINT | -128-127 | 0-255 |
SMALLINT | 32768-32767 | 0-65535 |
MEDIUMINT | -8388608-8388607 | 0-16777215 |
INT | -2147483648-2147483647 | 0-4294967295 |
BIGINT | 这个范围不多说,(大) | 0-无法形容的大 |
实例1: 创建一个整数类型的表.
以上是uid就是一个整数类型的字段,注意后面的(10)意思是指定能够显示的数值中数字的个数.
实例2: 分别创建整形的数据类型字段看看.
◆浮点数和定点数◆
在MySQL中浮点数和定点数都是用来表示小数的,浮点数类型有两种:单精度浮点数(FLOAT)和双精度浮点数(DOUBLE),定点类型的话只有一种(DECIMAL),下表是这几个数值的说明信息:
类型名称 | 说明信息 | 存储占比 |
---|---|---|
FLOAT | 单精度浮点数 | 4个字节 |
DOUBLE | 双精度浮点数 | 8个字节 |
DECIMAL | 压缩的定点数 | M+2个字节 |
实例: 创建temp表,其中字段x,y,z数据类型分别是 float(5.1) double(5.1) decimal(5.1)并向表中插入一些数据.
向表中插入数据,并查看结果,MySQL默认自动截断小数点后面的数据,具体截断位数由计算机硬件和操作系统决定.
◆日期与时间类型◆
MySQL中有多种表示日期的数据类型,主要有LDATETIME、DATE、TIME和YEAR.例如,当只记录年信息的时候,可以只使用 YEAR类型而没有必要使用DATE,每一个类型都有合法的取值范围,当指定确实不合法的值时系统将"0"值插入到数据库中,下面先来看一下他的类型说明吧:
类型名称 | 日期格式 | 日期范围 | 存储需求 |
---|---|---|---|
YEAR | YYYY | 1901-2155 | 1字节 |
TIME | HH:MM:SS | -838:59:59-838:59:59 | 3字节 |
DATE | YYYY-MM-DD | 1000-01-01-9999-12-3 | 3字节 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00-9999:12-31 23:59:59 | 8字节 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC-2038-01-19 03:14:07 UTC | 4字节 |
YEAR类型: 主要用于存储一个年份,例如:1997 2018
1.创建temp表,定义数据类型为year的字段x,并向表中插入数据.
TIME类型:主要用于存储时间,例如:12:12:21
1.创建temp1表,定义数据类型为time的字段x,并向表中插入数据.
2.当然啦我们可以简写省略冒号.
3.向temp表中的x字段插入当前系统运行时间,通过函数(CURRENT_TIME),(NOW()取出.
DATE类型:Date类型主要用于存储年月日,例如:1997-10-05
1.创建temp表,表中是date类型的x字段,并插入一条数据.
2.向temp表中插入系统当前日期,通过函数(CURRENT_DATE()),(NOW())取出系统日期.
DATATIME:DateTime类型用于存储日期和时间,例如:2018-01-24 22:12:24
1.创建temp表dt字段类型为datetime,并插入一条数据.
2.取系统当前日期并插入temp表的dt字段.
TIMESTAMP类型:TimeStamp与DateTime相同,但是TimeStamp是使用的UTC(世界标准时间)
1.创建temp表并插入timestamp类型的x字段,插入一条数据.
◆文本字符串类型◆
字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其他数据,比如图片和声音的二进制数据.MySQL支持两类字符型数据:文本字符串和二进制字符串,本小节主要介绍文本字符串类型,文本字符串可以进行区分或者不区分大小写的串比较,另外还可以进行模式匹配查找.MysQL中文本字符串类型指CHAR,VARCHAR,TEXT,ENUM和SET,如下表所示.
类型名称 | 说明信息 | 存储需求 |
---|---|---|
CHAR | 固定长度非二进制字符串 | M字节,1<=M<=255 |
VARCHAR | 变长非二进制字符串 | L+1字节 |
TIMYTEXT | 非常小的非二进制字符串 | L+1字节 |
TEXT | 小的非二进制字符串 | L+2字节 |
MEDIUMTEXT | 中等非二进制字符串 | L+3字节 |
LONGTEXT | 大的非二进制字符串 | L+4字节 |
ENUM | 枚举类型 | l或2个字节 |
SET | SET成员类型 | 1,2,3,4或8个字节 |
CHAR和VARCHAR:定长和不定长字符串类型
CHAR和VARCHAR的长度区别:
● CHAR是一种定长字符串,它的长度在初始化时就被固定比如说:char(10)则固定分配10个字符的长度,如果使用了CHAR类型,不论你的数据填充多少都会消耗4字节存储空间.
● VARCHAR是一种不定长字符串,它的长度取决于你输入的字符数,使用VARCHAR的话,它会动态的分配空间大小,但最大也不能超过定义的长度
1.定义一个temp表,里面有两个字段分别是ch,vch类型是char(4)和varchar(4)插入数据查看区别.
TEXT类型:用于保存非二进制字符串,如文章内容评论内容等,当保存或查询text列的值时,不删除尾部空格.
关于TEXT类型的取值范围:
● TINYTEXT 最大长度为255(2^8-1)字符的TEXT列.
● TEXT 最大长度为65535(2^16-1)字符的TEXT列.
● MEDIUMTEXT 最大长度为16777215(2^24-1)字符的TEXT列.
● LONGTEXT 最大长度为4294967295字符的TEXT列.
1.创建一个表temp1,并创建text字段,写入一段话看看.
ENUM枚举类型:enum的值根据列索引顺序排列,并且空字符串排在非空字符串前,NULL值排在其他所有的枚举值前面
1.来看一个枚举的小例子,注意:枚举默认标号从1开始.
set集合:但在声明成集合时,其取值就已经固定了
◆二进制字串类型◆
在MySQL中的二进制数据类型有:BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB,LONGBLOB,老样子,看下面的表格,就清晰啦.
类型名称 | 说明信息 | 存储需求 |
---|---|---|
BIT | 位字段类型 | (M+7/8)个字节 |
BINARY | 固定长度二进制字符串 | M个字节 |
VARBINARY | 可变长二进制字符串 | M+1字节 |
TINYBLOB | 非常小的BLOB | L+1字节 |
BLOB | 小BLOB | L+2字节 |
MEDIUMBLOB | 中等大小的BLOB | L+3字节 |
LONGBLOB | 非常大的BLOB | L+4字节 |
bit类型:位字段类型,也就是说插入的数据会被转换成101011011这样的格式
1.定义并插入数据测试,x+0表示将二进制结果转换为对应的数字的值,bin()函数将数字转换为2进制.
BINARY和VARBINARY类型: 定长与不定长二进制字符串类型.
1.binary类型是一个定长,二进制字节字符串类型,在字段不足制定字节是会自动在后面填0.
2.varbinary类型是一个可变长,二进制字节字符串类型,而vb字段不会填充.
创建一个temp10,分别有两个字段b,vb类型分别是binary(3)和varbinary(30)
运算符类型
运算符链接表达式中各个操作数,其作用是用来指明对操作数所进行的运算,运用运算符可以更加灵活的使用表中的数据,常见的运算符有:算术运算,比较运算,逻辑运算,位运算等,下面我们将依次介绍这几种运算符的运用.
◆算术运算符◆
运算符 | 作用 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算 |
% | 求余运算 |
加法运算(+)
减法运算(-)
乘法运算(*)
除法运算(/)
取余数运算(%)
◆比较运算符◆
运算符 | 作用 |
---|---|
= | 等于 |
<=> | 安全的等于 |
<>(!=) | 不等于 |
<= | 小于等于 |
>= | 大于等于 |
> | 大于 |
IS NULL | 判断一个值是否为NULL |
IS NOT NULL | 判断一个值是否不为NULL |
LEAST | 在有两个或多个参数时,返回最小值 |
GREATEST | 当有两个或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
ISNULL | 与IS NULL作用相同 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
等于运算符(=): 使用等于运算符进行相等判断
全等于(<=>): 这个运算符和=功能相同,但是全等于可以用来判断NULL值,而等于是不能的
不等于(<>或!=): 俩数不相等返回1,相等返回0
小于运算符(<): 两数相比较,左边小于右边返回1,否则返回0
小于等于(<=): 两数相比较,左边小于或者等于右边返回1,否则返回0
大于运算符(>): 两数相比较,左边大于右边返回1,否则返回0
大于等于(>=): 两数相比较,左边大于或者等于右边返回1,否则返回0
IS NULL运算符(ISNULL)和IS NOT NULL运算符(ISNOTNULL): is null如果为NULL返回1否则返回0,而is not null则相反.
between and 运算符(expr BETWEEN min AND max): 假如expr大于或等于min并且小于或等于max,则beetween返回1,否则返回0
letsa运算符(least 值1,值2.....值n): 在定义的数值列表中返回最小的那个元素的数值
greatest运算符(greatest 值1,值2....值n): 在定义的数值列表中返回最大的那个元素的数值
IN 和NOT IN 运算符(值1 IN (值1,值2.....值n)): in运算符判断指定数值是否在指定的一个列表里,有则返回1无则返回0,而not in运算符恰恰相反.
LIKE匹配运算符(expr LIKE 匹配条件): like运算符用来匹配字符串,如果expr满足条件则返回1否则返回0,若expr或匹配条件中任何一个为NULL则结果为NULL.
LIKE通配符:
%:匹配任意字符,贪婪匹配
_:只匹配一个字符
t__:表示匹配以t开头,长度为2个字符的字符串
%d:表示匹配以字母d结尾的字符串
regexp字符串匹配运算符(expr regexp 匹配条件): regexp运算符能够更加精确的匹配,如果expr满足条件则返回1否则返回0,若expr或匹配条件中任何一个为NULL则结果为NULL.
REGEXP通配符:
^:匹配以该字符后面的字符开头的字符串
$:匹配以该字符后面的字符结尾的字符串
.:匹配任意一个单一字符
[...]:匹配在方括号内的任意字符
◆逻辑运算符◆
运算符 | 作用 |
---|---|
NOT 或 ! | 逻辑非 |
AND 或 && | 逻辑与 |
OR | 逻辑或 |
XOR | 逻辑异或 |
NOT逻辑非: not或!逻辑非运算符,当操作数为0时返回1,当操作为1时返回0,当操作数为NULL时,返回NULL
AND逻辑与: and是逻辑与运算符,当两边都为真是结果为1,否则结果为0
OR逻辑或: or是逻辑或运算符,两边的结果如果有一边为真,则返回1否则返回0
XOR异或: xor逻辑异或运算符,当任意一个操作数为null时返回null,如果两边都为0则返回1否则返回0
◆移位运算符◆
运算符 | 作用 |
---|---|
\ | 位或 |
& | 位与 |
^ | 位异或 |
<< | 位左移 |
>> | 位右移 |
~ | 位取反 |
位或(|): 位或运算符,按照提供数据的二进制形式依次或运算,最后输出结果
位与(&): 位与运算符,按照提供数据的二进制形式依次与运算,最后输出结果
位异或(^): 将指定数据的二进制形式,逐一按位或运算
按位左移(expr<<需要左移的位数): 将指定数据expr,的二进制形式,按位左移
按位右移(expr>>需要右移的位数): 将指定数据expr,的二进制形式,按位右移
按位取反(~): 将相应位数的二进制形式,逐位反转