引言
MySQL菜鸟笔记:
https://www.runoob.com/mysql/mysql-tutorial.html
视频学习:
https://www.bilibili.com/video/BV1NJ411J79W
sql语言菜鸟笔记:
https://www.runoob.com/sql/sql-tutorial.html
这个笔记主要记录用MySQL学习sql语法,学习笔记参考了狂神老师的笔记,整理了一下学习顺序。
一、初识MySQL
1、基本概念
数据库 (DataBase, 简称DB)
概念: 长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据 “仓库”
作用: 保存,并能安全管理数据(如:增删改查等),减少冗余…
数据库总览 :
- 关系型数据库 ( SQL )
- MySQL , Oracle , SQL Server , SQLite , DB2 , …
- 关系型数据库通过外键关联来建立表与表之间的关系
- 非关系型数据库 ( NOSQL )
- Redis , MongoDB , …
- 非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定
RDBMS 术语
在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:
- **数据库:**数据库是一些关联表的集合。
- **数据表:**表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- **列:**一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
- **行:**一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- **外键:**外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- **索引:**使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- **参照完整性:**参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
2、安装与卸载
转我另外一篇文章:
https://blog.csdn.net/busiruoli/article/details/115264125
3、数据库工具的安装
Navicat、SQLyog可视化数据库
转我另外一篇文章:
https://blog.csdn.net/busiruoli/article/details/115264312
SQLyog使用教程:
https://blog.csdn.net/su2231595742/article/details/107967198
二、MySQL的基本认识
1、连接数据库:
mysql -uroot -p
这里-p后面不能有空格,然后输入密码,也可以在p后面输入铭文密码直接登录
2、常用命令
update user set password=password('123456')where user='root'; --修改密码
flush privileges; --刷新数据库,修改密码之后使用。
show databases; --显示所有数据库
use dbname;--打开某个数据库
show tables; --显示数据库mysql中所有的表
describe user; --显示表mysql数据库中user表的列信息
create database name; --创建数据库
use databasename; --选择数据库
describe student; --显示student数据库表信息
exit; 退出Mysql
? 命令关键词 : 寻求帮助
-- 表示注释
注:
- 可用反引号(`)为标识符(库名、表名、字段名、索引、别名)包裹,以避免与关键字重名!中文也可以作为标识符!
- 每个库目录存在一个保存当前数据库的选项文件db.opt。
- 注释:单行注释 # 注释内容,多行注释 /* 注释内容 */,(标准SQL注释风格,要求双破折号后加一空格符(空格、TAB、换行等))
- 模式通配符: _ 任意单个字符, % 任意多个字符,甚至包括零字符,单引号需要进行转义 ’
- CMD命令行内的语句结束符可以为 “;”, “\G”, “\g”,仅影响显示结果。其他地方还是用分号结束。delimiter 可修改当前对话的语句结束符。
- SQL对大小写不敏感 (关键字)
- 清除已有语句:\c
3、数据类型
3.1 数值类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
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的值 | 小数值 |
3.2 日期和时间类型
类型 | 大小 ( 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 | 混合日期和时间值,时间戳 |
3.3 字符串类型
类型 | 大小 | 用途 |
---|---|---|
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 | 极大文本数据 |
3.4 NULL
理解为 “没有值” 或 “未知值”;
不要用NULL进行算术运算 , 结果仍为NULL。
4、数据字段属性
4.1 UnSigned
无符号的
声明该数据列不允许负数 。
4.2 ZEROFILL
0填充的
不足位数的用0来填充 , 如int(3),5则为005
4.3 Auto_InCrement
自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)
通常用于设置主键, 且为整数类型
可定义起始值和步长
当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表
SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局)
4.4 NULL 和 NOT NULL
默认为NULL , 即没有插入该列的数值
如果设置为NOT NULL , 则该列必须有值
4.5 DEFAULT
默认的
用于设置默认值
例如,性别字段,默认为"男" , 否则为 “女” ; 若无指定该列的值 , 则默认值为"男"的值
5、数据表类型
数据表类型也是数据引擎
MySQL的数据表的类型 :MyISAM,InnoDB, HEAP , BOB , CSV等…
常见的 MyISAM 与 InnoDB 类型:
经验 ( 适用场合 ) :
适用 MyISAM : 节约空间及相应速度
适用 InnoDB : 安全性 , 事务处理及多用户操作数据表
注意 :
- . frm – 表结构定义文件
- . MYD – 数据文件 ( data )
- . MYI – 索引文件 ( index )
字符集
创建表的时候:
DEFAULT CHARSET=utf8
或者在my.ini中设置
character-set-server=utf8
这样可以默认使用utf-8,不过在给别人表的时候就可能会出现编码问题。
三、数据库语句
1、概叙
名称 | 解释 | 命令 |
---|---|---|
DDL(数据定义语言) | 定义和管理数据对象,如数据库,数据表等 | CREATE/DPOP/ALTER |
DML(数据操作语言) | 用于操作数据库对象包括的数据 | INSERT/UPDATE/DELETE |
DQL(数据查询语言) | 用于查询数据库数据 | SELECT |
DCL(数据控制语言) | 用于管理数据语言,包括管理权限及数据更改 | GRANT/commit/rollback |
2、DDL数据定义
2.1 数据库操作
创建数据库 : create database [if not exists] 数据库名;
删除数据库 : drop database [if exists] 数据库名;
查看数据库 : show databases;
使用数据库 : use 数据库名;
注:[ ]中可填可不填
SELECT USER FROM student //USER是student中的参数,变大写了
SELECT `user` FROM student//加``可以使其变成小写
**说明 😗*反引号用于区别MySQL保留字与普通字符而引入的 (键盘esc下面的键)。如果字段和关键字重复,使用``给全出来。
2.2 数据表操作
3.1 创建表
create table [if not exists] `表名`(
'字段名1' 列类型 [属性][索引][注释],
'字段名2' 列类型 [属性][索引][注释],
#...
'字段名n' 列类型 [属性][索引][注释]
)[表类型][表字符集][注释];
实例:
-- 目标 : 创建一个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
3.2 查询表
-- 查看数据库的定义
SHOW CREATE DATABASE school;
-- 查看数据表的定义
SHOW CREATE TABLE student;
-- 显示表结构
DESC student; -- 设置严格检查模式(不能容错了)SET sql_mode='STRICT_TRANS_TABLES';
3.3 修改表
- 修改表名 : ALTER TABLE 旧表名 RENAME AS 新表名
- 添加字段 : ALTER TABLE 表名 ADD字段名 列属性[属性]
- 修改字段 : ALTER TABLE 表名 MODIFY 字段名 列类型[属性]
- 重命名:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[属性]
- 删除字段 : ALTER TABLE 表名 DROP 字段名
- 删除表:DROP TABLE [IF EXISTS] 表名
3、DML数据操作
- 用于操作数据库对象中所包含的数据
- 包括 :
- INSERT (添加数据语句)
- UPDATE (更新数据语句)
- DELETE (删除数据语句)
3.1 INSERT添加
语法:
INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')
注意 :
- 字段或值之间用英文逗号隔开 .
- ’ 字段1,字段2…’ 该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应,且数量一致 .
- 可同时插入多条数据 , values 后用英文逗号隔开 .
-- 使用语句如何增加语句?
-- 语法 : INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')
INSERT INTO grade(gradename) VALUES ('大一');
-- 主键自增,那能否省略呢?
INSERT INTO grade VALUES ('大二');
-- 查询:INSERT INTO grade VALUE ('大二')错误代码:1136
Column count doesn`t match value count at row 1
-- 结论:'字段1,字段2...'该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应,且数量一致.
-- 一次插入多条数据
INSERT INTO grade(gradename) VALUES ('大三'),('大四');
3.2 update修改
语法:
UPDATE表名SET column_name=value [,column_name2=value2,...] [WHEREcondition];
注意 :
- column_name 为要更改的数据列
- value 为修改后的数据 , 可以为变量 , 具体指 , 表达式或者嵌套的SELECT结果
- condition 为筛选条件 , 如不指定则修改该表的所有列数据
where条件子句
- 修改年级信息
UPDATE grade SET gradename = '高中' WHERE gradeid = 1;
3.3 删除数据
DELETE命令
语法:
DELETE FROM 表名 [WHERE condition];
注意:condition为筛选条件 , 如不指定则删除该表的所有列数据
-- 删除最后一个数据
DELETE FROM grade WHERE gradeid = 5
TRUNCATE命令
作用:用于完全清空表数据 , 但表结构 , 索引 , 约束等不变 ;
语法:
TRUNCATE [TABLE] table_name;
-- 清空年级表
TRUNCATE grade
注意:区别于DELETE命令
- 相同 : 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快
- 不同 :
- 使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器
- 使用TRUNCATE TABLE不会对事务有影响 (事务后面会说)
测试:
-- 创建一个测试表
CREATE TABLE `test` (
`id` INT(4) NOT NULL AUTO_INCREMENT,
`coll` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
-- 插入几个测试数据
INSERT INTO test(coll) VALUES('row1'),('row2'),('row3');
-- 删除表数据(不带where条件的delete)
DELETE FROM test;