MySQL深入剖析 ---【狂神篇】

1、初始MySql

1.1、为什么学习数据库?

1、岗位技能需求

2、现在的世界,得数据者得天下

3、存储数据的方法

4、程序,网站中,大量数据如何长久保存?

5、数据库是几乎软件体系中最核心的一个存在。

1.2、什么是数据库?

数据库 ( DataBase , 简称DB )

概念 : 长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据 “仓库”

作用 : 保存,并能安全管理数据(如:增删改查等),减少冗余…

数据库总览 :

  • 关系型数据库 ( SQL )

    • MySQL , Oracle , SQL Server , SQLite , DB2 , …
    • 关系型数据库通过外键关联来建立表与表之间的关系
  • 非关系型数据库 ( NOSQL )

    • Redis , MongoDB , …

    • 非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定

1.3、什么是DBMS?

数据库管理系统 ( DataBase Management System )

数据库管理软件 , 科学组织和存储数据 , 高效地获取和维护数据

在这里插入图片描述

为什么要说这个呢?

因为我们要学习的MySQL应该算是一个数据库管理系统

1.4、MySQL简介

概念 : 是现在流行的,开源的,免费关系型数据库

历史 : 由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。

特点 :

  • 免费 , 开源数据库
  • 小巧 , 功能齐全
  • 使用便捷
  • 可运行于Windows或Linux操作系统
  • 可适用于中小型甚至大型网站应用

官网: https://www.mysql.com/

教程: https://www.runoob.com/mysql/mysql-tutorial.html

1.5、安装MySQL

这里建议使用压缩版,安装快,方便,不复杂

软件下载

mysql5.7 64位下载地址:

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip

电脑是64位的就下载使用64位版本的!

安装步骤

1、下载后得到zip压缩包

2、解压到自己想要安装到的目录

3、添加环境变量:我的电脑->属性->高级->环境变量

选择PATH,在其后面添加: 你的 mysql 安装文件下面的bin文件夹

4、编辑 my.ini 文件,注意替换路径位置

[mysqld]
#windows下用反斜杠 /
basedir=D:/Program Files/mysql-5.7

datadir=D:/Program Files/mysql-5.7/data

port=3306

# 允许最大连接数
# max_connections=1000

#跳过密码验证。修改完密码后注释掉
skip-grant-tables

5、启动管理员模式下的CMD,并将路径切换至mysql下的bin目录,然后输入mysqld –install (安装mysql)

6、再输入 mysqld --initialize-insecure --user=mysql 初始化数据文件

7、然后再次启动mysql : net start mysql

然后用命令 mysql –u root –p 进入mysql管理界面(密码可为空)。p后面不能加空格

8、进入界面后更改root密码

update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';

9、刷新权限

flush privileges;

10、修改 my.ini文件,删除最后一句skip-grant-tables

#取消跳过密码验证。已经有了新密码,登录后才可以进入
#skip-grant-tables

11、重启mysql即可正常使用

net stop mysql

net start mysql

12、连接上测试出现以下结果就安装好了

在这里插入图片描述

1.6、可视化工具SQLyog

1.7、常见命令

打开MySQL命令窗口

  • 在DOS命令行窗口进入 安装目录\mysql\bin
  • 设置了path环境变量,可以在任意目录打开!
-- 单行注释
/*
多行注释
*/

--连接数据库。p与密码间不能有空格
mysql -h 服务器主机地址 -u 用户名 -p 用户密码

--修改密码
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';

--刷新权限:修改密码后操作
flush privileges;

--显示所有数据库
show databases; 

--打开某个数据库
use dbname;

--显示数据库mysql中所有的表
show tables; 

--显示表user的列信息
describe user; 

--创建数据库
create database name; 

--选择数据库
use databasename; 

--退出Mysql
exit; 

--命令关键词 : 寻求帮助
? 

2、操作数据库

2.1、常用语句分类

名称 简称 解释 命令
数据库定义语言 DDL 定义和管理数据对象,如数据库、表等 CREATE、DROP、ALTER
数据库操作语言 DML 用于操作数据库对象中的数据 INSERT、UPDATE、DELETE
数据库查询语言 DQL 查询数据库数据 SELECT
数据库控制语言 DCL 用于管理数据库的语言,包含权限管理和数据更改 GRANT、COMMIT、ROLLBACK

D(database):数据库

D(definition):定义

L(language):语言

M(management):管理

Q(quary):查询

C(control):控制

命令不区分大小写。库名、表名、字段名建议两边加``符号(Tab键上方),如果不是关键词可以省略

2.2、数据库操作

--创建数据库
create database [if not exists] `数据库名`;

--删除数据库
drop database [if exists] `数据库名`;

--查看数据库
show databases;

--使用数据库
use `数据库名`;

2.3、列数据类型

  • 数值类型
类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 byte (-128,127) (0,255) 小整数值
SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2,否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

DECIMAL:多用于金融

MySQL DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确度的列,例如会计系统中的货币数据。

要定义数据类型为DECIMAL的列,请使用以下语法:

`column_name`  `DECIMAL`(P,D);

在上面的语法中:

  • P是表示有效数字数的精度。 P范围为1〜65
  • D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P

DECIMAL(P,D)表示列可以存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。

与INT数据类型一样,DECIMAL类型也具有UNSIGNEDZEROFILL属性。 如果使用UNSIGNED属性,则DECIMAL UNSIGNED的列将不接受负值。

如果使用ZEROFILL,MySQL将把显示值填充到0以显示由列定义指定的宽度。 另外,如果我们对DECIMAL列使用ZERO FILL,MySQL将自动将UNSIGNED属性添加到列。

  • 字符类型
类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据
  • 日期和时间类型
类型 大小 ( bytes) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038
结束时间是第 2147483647 秒,
北京时间 2038-1-19 11:14:07
格林尼治时间 2038年1月19日 凌晨 03:14:07
YYYYMMDD HHMMSS 混合日期和时间值,时间戳
  • NULL值
    • 理解为 “没有值” 或 “未知值”
    • 不要用NULL进行算术运算 , 结果仍为NULL

2.4、数据字段属性【重点】

UnSigned

  • 无符号的
  • 声明该数据列不允许负数

ZEROFILL

  • 0填充的
  • 不足位数的用0来填充 , 如int(3),5则为005;如为1250,仍然为1250。只有位数不足时才补0

Auto_InCrement

  • 自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)

  • 通常用于设置主键 , 且为整数类型

  • 可定义起始值和步长

    • 当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表

    • SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局)

NULL 和 NOT NULL

  • 默认为NULL , 即没有插入该列的数值
  • 如果设置为NOT NULL , 则该列必须有值

DEFAULT

  • 默认的
  • 用于设置默认值
  • 例如:性别字段,默认为"男" , 否则为 “女” ; 若无指定该列的值 , 则默认值为"男"的值

2.5、创建数据库表【重点】

-- 目标 : 创建一个school数据库
-- 创建学生表(列,字段)
-- 学号int 登录密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭住址,email
-- 创建表之前 , 一定要先选择数据库

CREATE TABLE IF NOT EXISTS `student` (
	`id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
	`name` varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
	`pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密码',
	`sex` varchar(2) NOT NULL DEFAULT '男' COMMENT '性别',
	`birthday` datetime DEFAULT NULL COMMENT '生日',
	`address` varchar(100) DEFAULT NULL COMMENT '地址',
	`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

格式:[可选]

CREATE TABLE [IF NOT EXISTS] `表名`(
	`字段名` 列类型 [属性] [索引] [注释],
    `字段名` 列类型 [属性] [索引] [注释],
    ......
    `字段名` 列类型 [属性] [索引] [注释]
)[表类型][字符集设置][注释]

2.6、数据表类型(引擎)

引擎是建表的规定, 提供给表使用的, 不是数据库

# mysql> show engines; # 展示所有引擎

# innodb(默认引擎): 支持事务,行级锁,外键

# myisam: 查询效率要优于innodb, 当不需要支持事务, 行级锁, 外键, 可以通过设置myisam来优化数据库
比较 MYISAM INNODB==(默认)==
事务 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文检索 支持 MySql5.6以前不支持,5.6及以后支持
所占空间 大,约2倍

经验 ( 适用场合 ) :

  • 适用 MyISAM :节约空间及响应速度
  • 适用 InnoDB :安全性 , 事务处理及多用户操作数据表
  • 只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引

2.7、数据存储位置

  • MySQL数据表以文件方式存放在磁盘中

    • 包括表文件 , 数据文件 , 以及数据库的选项文件

    • 位置 : Mysql安装目录\data\下存放数据表 。目录名对应数据库名 , 该目录下文件名对应数据表

  • 注意 :

    • *.frm – 表结构定义文件

    • *.MYD – 数据文件 ( data )

    • *.MYI – 索引文件 ( index )

    • InnoDB 类型数据表只有一个 *.frm文件 , 以及*.ibd 索引文件+数据文件

    • MyISAM 类型数据表对应三个文件 :

在这里插入图片描述

2.8、设置字符集

我们可为数据库,数据表,数据列设定不同的字符集,设定方法 :

  • 创建时通过命令来设置 , 如 : CREATE TABLE 表名()CHARSET = utf8;
  • 如无设定 , 则根据MySQL数据库配置文件 my.ini 中的参数设定

2.9、修改数据库

1、修改表、字段

--修改表名
ALTER TABLE `旧表名` RENAME AS `新表名`
 
--添加字段
ALTER TABLE `表名` ADD `字段名` 列属性[属性]

--修改字段(列类型)
ALTER TABLE `表名` MODIFY `字段名` 列类型[属性]

--修改字段(重命名、列类型)
ALTER TABLE `表名` CHANGE `旧字段名` `新字段名` 列属性[属性]

--删除字段
ALTER TABLE `表名` DROP `字段名`
  • change 可以更改列名 和 列类型 (每次都要把新列名和旧列名写上, 即使两个列名没有更改,只是改了类型)

  • modify 只能更改列属性 只需要写一次列名, 比change 省事点

2、删除表

DROP TABLE [IF EXISTS] `表名`
  • IF EXISTS为可选 ,判断是否存在该数据表
  • 如删除不存在的数据表会抛出错误

所有的创建和删除,尽量加上判断

2.10、注意点

  • 可用反引号 ` 为标识符(库名、表名、字段名、索引、别名)包裹,以避免与关键字重名!中文也可以作为标识符!
  • 每个库目录存在一个保存当前数据库的选项文件 db.opt
  • 注释
    • 单行注释 # 注释内容
    • 单行注释 -- 注释内容 (标准SQL注释风格,要求双破折号后加一空格符(空格、TAB、换行等)
    • 多行注释 /* 注释内容 */
  • 模式通配符
    • _ 模式通配符
    • % 任意多个字符,甚至包括零字符
    • 单引号需要进行转义 \'
  • CMD命令行内的语句结束符可以为 ;\G\g,仅影响显示结果。其他地方还是用分号结束。delimiter 可修改当前对话的语句结束符

3、MYSQL数据管理

3.1、外键【了解】

外键概念

如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表

在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreign key)。

外键作用

保持数据一致性完整性,主要目的是控制存储在外键表中的数据,约束。使两张表形成关联,外键只能引用外表中的列的值或使用空值。

  • 创建外键

    • 建表时一起创建外键

      -- 创建外键的方式一 : 创建子表同时创建外键
      
      -- 年级表 (id\年级名称)
      CREATE TABLE IF EXISTS `grade` (
      	`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',
      	`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
      	PRIMARY KEY (`gradeid`)
      ) ENGINE=INNODB DEFAULT CHARSET=utf8
      
      -- 学生信息表 (学号,姓名,性别,年级,手机,地址,出生日期,邮箱,身份证号)
      CREATE TABLE IF EXISTS `student` (
      	`studentno` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
      	`studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
      	`sex` TINYINT(1) DEFAULT '1' COMMENT '性别',
      	`gradeid` INT(10) DEFAULT NULL COMMENT '年级',
      	`phoneNum` VARCHAR(50) NOT NULL COMMENT '手机',
      	`address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
      	`borndate` DATETIME DEFAULT NULL COMMENT '生日',
      	`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
      	`idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
      	PRIMARY KEY (`studentno`),
      	KEY `FK_gradeid` (`gradeid`),
      	CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
      ) ENGINE=INNODB DEFAULT CHARSET=utf8
      

      在这里插入图片描述

    • 建表后添加外键

      -- 创建外键方式二 : 创建子表完毕后,修改子表添加外键
      ALTER TABLE `student`
      ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);
      
  • 删除外键

    -- 第一步
    -- 删除外键
    ALTER TABLE `student` DROP FOREIGN KEY `FK_gradeid`;
    
    -- 第二步
    -- 发现执行完上面的,索引还在,所以还要删除索引
    -- 注:这个索引是建立外键的时候默认生成的
    ALTER TABLE `student` DROP INDEX `FK_gradeid`;
    

    注意 :

    • 删除具有主外键关系的表时 , 要先删子表 , 后删主表

    • 上面所说的外键是物理外键,也就是数据库层面的外键。

    • 数据库中不推荐使用外键约束,一切外键概念在应用层解决

      原因:https://www.cnblogs.com/youngdeng/p/12857093.html

3.2、DML数据库管理语言【重点】

1、添加

--添加  insert
INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')

-- 一次添加多个值 
insert into ``(`字段2`)
values ('值1'),('值2'),('值3')

-- 自增字段可以省略
insert into `student`(`name`,`sex`) 
values ('sss','男')

2、修改

--修改 update
UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];

3、删除

--删除 delete
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土味儿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值