🍬 博主介绍
- 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~
- ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】
- 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
- 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
- 🙏作者水平有限,欢迎各位大佬指点,相互学习进步!
我之前学习 MySQL 是在b站看的狂神说MySQL,收获很大。
初学 Mysql 的话建议大家去看一看。
一、对数据库的操作
1. 创建数据库
CREATE DATABASE [IF NOT EXISTS] li; --[]可选 {}必选
CREATE DATABASE `数据库名` CHARACTER SET utf8 COLLATE utf8_general_ci
2. 删除数据库
DROP DATABASE [IF EXISTS] LI;
3. 使用数据库
USE school --如果表名或者字段名是一个特殊字符,就需要带``(tab键的上面)
4. 查找数据库
查看所有数据库:SHOW DATABASES
可以对照 sqlyog 可视化历史记录查看 sql
固定的语法或关键字必须要强行记住!
二、数据库的数据类型
MySQL中的数据类型大的方面来分,可以分为:数值、以及字符串、日期和时间三个方面。
下面就分开来进行总结。
1. 数值数据类型
1. 整型:
MySQL数据类型 | 含义(有符号) |
tinyint | 1字节,范围(-128~127) |
smallint | 2字节,范围(-32768~32767) |
mediumint | 3字节,范围(-8388608~8388607) |
int | 4字节,范围(-2147483648~2147483647) |
bigint | 8字节,范围(+-9.22*10的18次方) |
上面定义的都是有符号的,当然了,也可以加上unsigned关键字,定义成无符号的类型,那么对应的取值范围就要翻翻了,比如:tinyint unsigned的取值范围为0~255
2. 浮点型
MySQL数据类型 | 含义 |
float(m, d) | 4字节,单精度浮点型,m总个数,d小数位 |
double(m, d) | 8字节,双精度浮点型,m总个数,d小数位 |
decimal(m, d) | decimal是存储为字符串的浮点数 |
decimal 字符串形式的浮点数 金融计算的时候一般使用 decimal DECIMAL(P,D);
(p是有效数字的长度、D是小数点后的位数)
2. 字符串数据类型
MySQL数据类型 | 含义 |
char(n) | 固定长度,最多255个字符 |
varchar(n) | 可变长度,最多65535个字符,常用的变量 String |
tinytext | 可变长度,最多255个字符,2^8-1,保存微型文本 |
text | 可变长度,最多65535个字符,2^16-1,保存大文本 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
注意:
1.char(n)和varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节。
2.同时char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间,而varchar只会占用实际字符应该占用的空间+1,并且实际空间+1<=n。
3.超过char和varchar的n设置后,字符串会被截断。
4.char的上限为255字节,varchar的上限65535字节,text的上限为65535。
5.char在存储的时候会截断尾部的空格,varchar和text不会。
6.varchar会使用1-3个字节来存储长度,text不会。
3. 时间日期数据类型
MySQL数据类型 | 含义 |
date | 3字节,日期,格式:YYYY-MM-DD。如:2014-09-18 |
time | 3字节,时间,格式:HH:mm:ss。如08:42:30 |
datetime | 8字节,日期时间,格式:YYYY-MM-DD HH:mm:ss。如:2014-09-18 08:42:30 |
timestamp | 4字节,自动存储记录修改的时间。时间戳:1970.1.1 到现在的毫秒数 |
year | 1字节,年份 |
4. 其他类型
1. enum(“member1″, “member2″, … “member65535″)
enum数据类型就是定义了一种枚举,最多包含65535个不同的成员。
当定义了一个enum的列时,该列的值限制为列定义中声明的值。
如果列声明包含NULL属性,则NULL将被认为是一个有效值,并且是默认值。
如果声明了NOT NULL,则列表的第一个成员是默认值。
2. set(“member”, “member2″, … “member64″)
set数据类型为指定一组预定义值中的零个或多个值提供了一种方法,这组值最多包括64个成员。
值的选择限制为列定义中声明的值。
三、数据库的字段属性(重点)
上面大概总结了MySQL中的数据类型,当然了,上面的总结肯定是不全面的,如果要非常全面的总结这些内容,好几篇文章都不够的。下面就再来总结一些常用的属性。
(每一个表,都必须存在以下五个字段!未来做项目用的,表示一个记录存在的意义
id:主键
version:乐观锁
is_delete:伪删除
gmt_create:创建时间
gmt_update:修改时间)
1.auto_increment
通常理解为自增,自动在上一条记录的基础上+1(默认)
通常用来设计唯一的主键,必须是整数类型
可以自定义设计主键自增的起始值和步长
auto_increment能为新插入的行赋一个唯一的整数标识符。为列赋此属性将为每个新插入的行赋值为上一次插入的ID+1。
MySQL要求将auto_increment属性用于作为主键的列。此外,每个表只允许有一个auto_increment列。例如:id smallint not null auto_increment primary key
2.binary
binary属性只用于char和varchar值。
当为列指定了该属性时,将以区分大小写的方式排序。与之相反,忽略binary属性时,将使用不区分大小写的方式排序。
例如:hostname char(25) binary not null
3.default
设置默认的值!
如果不指定该列的值,则会有默认的值!
default属性确保在没有任何值可用的情况下,赋予某个常量值,这个值必须是常量,因为MySQL不允许插入函数或表达式值。
此外,此属性无法用于BLOB或TEXT列。如果已经为此列指定了NULL属性,没有指定默认值时默认值将为NULL,否则默认值将依赖于字段的数据类型。
例如:subscribed enum('0', '1') not null default '0'
4.index
如果所有其他因素都相同,要加速数据库查询,使用索引通常是最重要的一个步骤。
索引一个列会为该列创建一个有序的键数组,每个键指向其相应的表行。
以后针对输入条件可以搜索这个有序的键数组,与搜索整个未索引的表相比,这将在性能方面得到极大的提升。
create table employees
(
id varchar(9) not null,
firstname varchar(15) not null,
lastname varchar(25) not null,
email varchar(45) not null,
phone varchar(10) not null,
index lastname(lastname),
primary key(id)
);
我们也可以利用MySQL的create index命令在创建表之后增加索引:
create index lastname on employees (lastname(7));
这一次只索引了名字的前7个字符,因为可能不需要其它字母来区分不同的名字。因为使用较小的索引时性能更好,所以应当在实践中尽量使用小的索引。
5.not null
假设设置为 not null ,如果不给它赋值,就会报错
NULL ,如果不填写值,默认就是null
如果将一个列定义为not null,将不允许向该列插入null值。建议在重要情况下始终使用not null属性,因为它提供了一个基本验证,确保已经向查询传递了所有必要的值。
6.null
为列指定null属性时,该列可以保持为空,而不论行中其它列是否已经被填充。记住,null精确的说法是“无”,而不是空字符串或0。
7. Unsigned:
无符号的整数
声明了该列不能声明为负数
8. zerofill:
0填充的(不能是负数)
不足的位数,使用0来填充 int(3) , 5 -->005
zerofill属性可用于任何数值类型,用0填充所有剩余字段空间。例如,无符号int的默认宽度是10;因此,当“零填充”的int值为4时,将表示它为0000000004。例如:
orderid int unsigned zerofill not null
9. unique:
被赋予unique属性的列将确保所有值都有不同的值,只是null值可以重复。一般会指定一个列为unique,以确保该列的所有值都不同。例如:email varchar(45) unique
10. primary key
primary key属性用于确保指定行的唯一性。指定为主键的列中,值不能重复,也不能为空。为指定为主键的列赋予auto_increment属性是很常见的,因为此列不必与行数据有任何关系,而只是作为一个唯一标识符。主键又分为以下两种:
(1)单字段主键
如果输入到数据库中的每行都已经有不可修改的唯一标识符,一般会使用单字段主键。注意,此主键一旦设置就不能再修改。
(2)多字段主键
如果记录中任何一个字段都不可能保证唯一性,就可以使用多字段主键。这时,多个字段联合起来确保唯一性。如果出现这种情况,指定一个auto_increment整数作为主键是更好的办法。
四、创建数据库表(重点)
1. 定义数据表
1. 规则:
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
<用户名>可替换为[<表定义子句>|<视图定义子句>|<授权定义子句>]
2. 举例:
为用户WANG定义一个学生-课程模式S-T
CREATE SCHEMA “S-T” AUTHORIZATION WANG;
3. 注意:
上面是sqlserver数据库,而mysql数据库跟这个规则有区别,mysql数据库直接在命令窗口写create database S-T;
2. 格式
CREATE TABLE [IF NOT EXISTS] `表名`(
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
........
`字段名` 列类型 [属性] [索引] [注释],
PRIMARY KEY(`id`))[表类型][表字符集设置][注释]
3. 创建实例:
1. 要求:
1. 目标:创建一个school数据库
2. 创建学生表(列、字段) 使用SQL创建
3. 学号int 登录密码varchar(20),性别(2),出生如期(datatime),家庭住址,email
4. 注意点:使用(),表的名称和字段尽量使用 ``括起来
5. AUTO_INCREMENT 自增
6. 字符串使用 '' 单引号括起来
7. 所有语句后面加 , (英文的), 最后一个不用加
8. PRIMARY KEY 主键,一般一个表只有一个唯一的主键,建议写在最后面
2. 代码:
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`birthday` DATETIME DEFAULT NULL COMMENT '生日',
`address` VARCHAR(20) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(20) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
4. 常用命令
SHOW CREATE DATABASE school -- 查看创建数据库的语句
SHOW CREATE TABLE student -- 查看student数据表的定义语句
DESC student -- 显示表的结构
五、数据表的类型
1. 关于数据库引擎
INNODB:默认使用
MYISAM:早些年使用
MYISAM | INNODB | |
事物支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大,是MYISAM的两倍 |
2. 常规使用操作:
MYISAM:节约空间,速度较快
INNODB:安全性高,支持事物的处理,多表多用户操作
3. 在物理空间存在的位置
所有的数据库文件都存在data目录下,一个文件夹就对应一个数据库
本质还是文件的存储
4. MySQL 引擎在物理文件上的区别
InnoDB 在数据库表中只有一个 *.frm文件,以及上级目录下的ibdata1文件
MYISAM对应的文件
*.frm 表结构的定义文件
*.MYD 数据文件(data)
*MYI 索引文件(index)
色湖之数据库表的字符集编码
CHARSET=utf8
不设置的话,会是mysql默认的字符集编码 (不支持中文!)
MySQL的默认编码是Latin1,不支持中文
在my.ini中配置默认的编码
character-set-server=utf8
六、修改删除表
1. 修改
1. 修改表名:
ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher1
2. 增加表的字段
ALTER TABLE 表名 ADD 字段名 列类型
ALTER TABLE teacher ADD age INT(11)
3. 修改表的字段
-- ALTER TABLE 表名 MODIFY 字段名 列类型[]
ALTER TABLE teacher1 MODIFY age VARCHAR(10)-- 修改约束--
ALTER TABLE 表名 CHANGE 旧名字 新名字 列类型[]
ALTER TABLE teacher1 CHANGE age age1 INT(1)
4. 字段重命名-- 删除表的字段:
ALTER TABLE 表名 DROP 字段名
ALTER TABLE teacher1 DROP age1
2. 删除
1. 删除表:
DROP TABLE IF EXISTS treacher1
2. 注意点:
`` 字段名,使用这个符号包裹
注释 – /**/
sql 关键字大小写不敏感,建议写小写
所有的符号都用英文
七、专栏分享
每个专栏都在持续更新中~~~