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
类型也具有UNSIGNED
和ZEROFILL
属性。 如果使用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