MySQL学习笔记1---MySQL基本命令

1、SQL 指令

1.1、DDL—数据定义语言

连接数据库语句 : mysql -h 服务器主机地址 -u 用户名 -p 用户密码
注意 : -p后面不能加空格,否则会被当做密码的内容,导致登录失败 !
update user set password=password('123456')where user='root'; 修改密码
flush privileges; 刷新数据库
use dbname;打开某个数据库
show tables; 显示数据库mysql中所有的表
describe user; 显示表mysql数据库中user表的列信息
创建数据库 :  create database [if not exists] 数据库名;
删除数据库 : drop database [if exists] 数据库名;
查看数据库 : show databases;
使用数据库 : use 数据库名;
-- 查看数据库的定义
SHOW CREATE DATABASE school;
-- 查看数据表的定义
SHOW CREATE TABLE student;
-- 显示表结构
DESC student;  -- 设置严格检查模式(不能容错了)  SET sql_mode='STRICT_TRANS_TABLES';

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

修改字段 :
ALTER TABLE 表名 MODIFY 字段名 列类型[属性]
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[属性]

删除字段 :  ALTER TABLE 表名 DROP 字段名

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

1.2、数据类型

1.2.1、数值类型

类型 说明 存储字节数
tinyint 非常小的数据 1字节
smallint 较小的数据 2字节
mediumint 中等大小的数据 3字节
int 标准整数 4字节
bigint 较大的整数 8字节
float 单精度浮点数 4字节
double 双精度浮点数 8字节
decimal 字符串形式的浮点数 16字节

1.2.2、字符串类型

类型 说明 最大长度
char[(M)] 固定长度字符串,检索快但浪费空间,0 <= M <= 255 M字符
varcahr[(M)] 可变长度字符串,0 <= M <= 65535 可变长度
tinytext 微型文本串 28-1字节
text 文本串 216-1字节

1.2.3、日期和时间类型

类型 说明 取值范围
date YYYY-MM-dd,日期格式 1000-01-01~9999-12-31
time HH:mm:ss,时间格式 -838:59:59~838:59:59
datetime YY-MM-dd HH:mm:ss 最常用的时间格式
timestamp 时间戳 1970.1.1 到现在的毫秒数
year YYYY格式的年月份 1901~2155

1.2.4、NULL值

  • 理解为 “没有值” 或 “未知值”
  • 不要用NULL进行算术运算 , 结果仍为NULL

1.3、数据字段属性

UnSigned

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

ZEROFILL

  • 0填充的
  • 不足位数的用0来填充 , 如int(3),5则为005。

Auto_InCrement

  • 自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)
  • 通常用于设置主键 , 且为整数类型
  • 可定义起始值和步长
    • 当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表
    • SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局)

NULL 和 NOT NULL

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

DEFAULT

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

拓展

每一张表,都必须存在以下五个字段!在项目中,表示一个记录存在意义!
id            主键
version       乐观锁
is_delete     伪删除
gmt_create    创建时间
gmt_update    修改时间

1.4、数据引擎

MySQL的数据表的引擎 : MyISAM , InnoDB , HEAP , BOB , CSV等…

名称 MyISAM InnoDB
事务处理 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间大小 较小 较大,约为MyISAM的2倍

经验 ( 适用场合 ) :

  • 适用 MyISAM : 节约空间及相应速度
  • 适用 InnoDB : 安全性 , 事务处理及多用户操作数据表

1.5、数据表的存储位置

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

  • 包括表文件 , 数据文件 , 以及数据库的选项文件
  • 位置 : Mysql安装目录\data\下存放数据表,目录名对应数据库名,该目录下文件名对应数据表

注意 :

  • * . frm – 表结构定义文件
  • * . MYD – 数据文件 ( data )
  • * . MYI – 索引文件 ( index )
  • InnoDB类型数据表只有一个 *.frm文件 , 以及上一级目录的ibdata1文件
  • MyISAM类型数据表对应三个文件 :
    在这里插入图片描述

1.6、DML—数据操作语言

DML语言   :数据操作语言
用于操作数据库对象中所包含的数据
包括 :
INSERT (添加数据语句)
INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')

UPDATE (更新数据语句)
UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];

DELETE (删除数据语句)
DELETE FROM 表名 [WHERE condition];

TRUNCATE命令:作用:用于完全清空表数据 , 但表结构、索引、约束等不变 ;
注意:区别于DELETE命令
相同 : 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快
不同 :
	使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器
	使用TRUNCATE TABLE 不会对事务有影响

1.7、DQL—数据查询语言

1.7.1、SELECT语法

SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
    [left | right | inner join table_name2]  -- 联合查询
    [WHERE ...]  	-- 指定结果需满足的条件
    [GROUP BY ...]  -- 指定结果按照哪几个字段来分组
    [HAVING]  		-- 过滤分组的记录必须满足的次要条件
    [ORDER BY ...]  -- 指定查询记录按一个或多个条件排序
    [LIMIT {[offset,]row_count | row_countOFFSET offset}];
    --  指定查询的记录从哪条至哪条
    注意 : [ ] 括号代表可选的 , { }括号代表必选得

AS 子句作为别名

作用:

  • 可给数据列取一个新别名
  • 可给表取一个新别名
  • 可把经计算或总结的结果用另一个新名称来代替

DISTINCT关键字的使用

作用 : 去掉SELECT查询返回的记录结果中重复的记录 ( 返回所有列的值都相同 ) , 只返回一条

JOIN 连接查询

操作符名称 描述
inner join 返回两个表的交集
left join 以左表为主,返回左表中的所有行,然后查询右表,不满足条件的显示NULL
right join 以右表为主,返回右表中的所有行,然后查询左表,不满足条件的显示NULL

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GfLKgK42-1606011738827)(images/image-20201115165932369.png)]

自连接

核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)

示例:
SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'
FROM category AS a,category AS b
WHERE a.`categoryid`=b.`pid`

排序和分页

排序
    ORDER BY 语句用于根据指定的列对结果集进行排序。
    ORDER BY 语句默认按照ASC升序对记录进行排序。
    如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

分页
	语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
	好处 : (用户体验,网络传输,查询压力)

子查询

分步写简单sql语句,然后将其嵌套起来
SELECT studentno,studentname FROM student WHERE studentno IN(
    SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
        SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2'
    )
)

分组

 SELECT subjectname,AVG(studentresult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
 FROM result AS r
 INNER JOIN `subject` AS s
 ON r.subjectno = s.subjectno
 GROUP BY r.subjectno
 HAVING 平均分>80;
 
 having是从前面筛选的字段再筛选,而where是从数据表中的>字段直接进行筛选的

1.7.2、MySQL函数

常用函数

数据函数

 SELECT ABS(-8);  		/*绝对值*/
 SELECT CEILING(9.4);   /*向上取整*/
 SELECT FLOOR(9.4);   	/*向下取整*/
 SELECT RAND();  		/*随机数,返回一个0-1之间的随机数*/
 SELECT SIGN(0); 		/*符号函数: 负数返回-1,正数返回1,0返回0*/

字符串函数

 SELECT CHAR_LENGTH('狂神说坚持就能成功');   /*返回字符串包含的字符数*/
 SELECT CONCAT('我','爱','程序');  			/*合并字符串,参数可以有多个*/
 SELECT INSERT('我爱编程helloworld',1,2,'超级热爱');  /*替换字符串,从某个位置开始替换某个长度*/
 SELECT LOWER('KuangShen'); 	 /*小写*/
 SELECT UPPER('KuangShen'); 	 /*大写*/
 SELECT LEFT('hello,world',5);   /*从左边截取*/
 SELECT RIGHT('hello,world',5);  /*从右边截取*/
 SELECT REPLACE('狂神说坚持就能成功','坚持','努力');  /*替换字符串*/
 SELECT SUBSTR('狂神说坚持就能成功',4,6); 		/*截取字符串,开始和长度*/
 SELECT REVERSE('狂神说坚持就能成功'); 			/*反转
 
 -- 查询姓周的同学,改成邹
 SELECT REPLACE(studentname,'周','邹') AS 新名字
 FROM student WHERE studentname LIKE '周%';

日期和时间函数

 SELECT CURRENT_DATE();   /*获取当前日期*/
 SELECT CURDATE();   /*获取当前日期*/
 SELECT NOW();   /*获取当前日期和时间*/
 SELECT LOCALTIME();   /*获取当前日期和时间*/
 SELECT SYSDATE();   /*获取当前日期和时间*/
 
 -- 获取年月日,时分秒
 SELECT YEAR(NOW());
 SELECT MONTH(NOW());
 SELECT DAY(NOW());
 SELECT HOUR(NOW());
 SELECT MINUTE(NOW());
 SELECT SECOND(NOW());

系统信息函数

 SELECT VERSION();  /*版本*/
 SELECT USER();     /*用户*/

聚合函数(常用)

函数名称 描述
COUNT() 返回满足Select条件的记录总和数,如 select count(*) 【不建议使用 *,效率低】
SUM() 返回数字字段或表达式列作统计,返回一列的总和。
AVG() 通常为数值字段或表达列作统计,返回一列的平均值
MAX() 可以为数值字段,字符字段或表达式列作统计,返回最大的值。
MIN() 可以为数值字段,字符字段或表达式列作统计,返回最小的值。
 SELECT COUNT(studentname) FROM student;
 SELECT COUNT(*) FROM student;
 SELECT COUNT(1) FROM student;  	/*推荐*/
 
 -- 从含义上讲,count(1) 与 count(*) 都表示对全部数据行的查询。
 -- count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
 -- count(*) 包括了所有的列,相当于行数,在统计结果的时候,包含字段为null 的记录;
 -- count(1) 用1代表代码行,在统计结果的时候,包含字段为null 的记录 。
  1. 在表没有主键时,count(1)比count(*)快
  2. 有主键时,主键作为计算条件,count(主键)效率最高;
  3. 若表格只有一个字段,则count(*)效率较高。

MD5 函数

新建一个表 testMD5

CREATE TABLE `testmd5` (
   `id` INT(4) NOT NULL,
   `name` VARCHAR(20) NOT NULL,
   `pwd` VARCHAR(50) NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=INNODB DEFAULT CHARSET=utf8

插入一些数据,并对pwd这一列数据进行加密

INSERT INTO testmd5 VALUES(1,'zhangsan','123456'),(2,'lisi','456789')
update testmd5 set pwd = md5(pwd);

对插入新的数据时自动加密

INSERT INTO testmd5 VALUES(4,'wangwu',md5('123456'));

查询登录用户信息(md5对比使用,查看用户输入加密后的密码进行比对)

SELECT * FROM testmd5 WHERE `name`='zhangsan' AND pwd=MD5('123456');

1.8、事务

什么是事务

  • 事务就是将一组SQL语句放在同一批次内去执行
  • 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
  • MySQL事务处理只支持InnoDB和BDB数据表类型

事务的四大特性

原子性(Atomic)

  • 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(ROLLBACK)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性(Consist)

  • 一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。

隔离性(Isolated)

  • 隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

持久性(Durable)

  • 在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

四大隔离级别

脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read(Mysql的默认隔离级别) × ×
Serializable × × ×

1.9、索引

分类

  • 主键索引 (Primary Key)
  • 唯一索引 (Unique)
  • 常规索引 (Index)
  • 全文索引 (FullText)

主键索引

主键 : 某一个属性组能唯一标识一条记录

特点 :

  • 最常见的索引类型
  • 确保数据记录的唯一性
  • 确定特定数据记录在数据库中的位置

唯一索引

作用 : 避免同一个表中某数据列中的值重复

与主键索引的区别

  • 主键索引只能有一个
  • 唯一索引可能有多个

常规索引

作用 : 快速定位特定数据

注意 :

  • index 和 key 关键字都可以设置常规索引
  • 应加在查询找条件的字段
  • 不宜添加太多常规索引,影响数据的插入,删除和修改操作

全文索引

百度搜索:全文索引

作用 : 快速定位特定数据

注意 :

  • 只能用于MyISAM类型的数据表
  • 只能用于CHAR , VARCHAR , TEXT数据列类型
  • 适合大型数据集
 #ALTER TABLE在已存在的表上创建索引
 ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 (字段名[(长度)]  [ASC |DESC]) ;
 
 #删除索引:DROP INDEX 索引名 ON 表名字;
 #删除主键索引: ALTER TABLE 表名 DROP PRIMARY KEY;

 #显示索引信息: SHOW INDEX FROM student;
 
/*EXPLAIN : 分析SQL语句执行性能*/
EXPLAIN SELECT * FROM student WHERE studentno='1000';

MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

索引准则

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表建议不要加索引
  • 索引一般应加在查找条件的字段
-- 我们可以在创建上述索引的时候,为其指定索引类型,分两类
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)

1.10、MySQL备份

数据库备份必要性

  • 保证重要数据不丢失
  • 数据转移

MySQL数据库备份方法

  • mysqldump备份工具
  • 数据库管理工具,如SQLyog
  • 直接拷贝数据库文件和相关配置文件
导出
导出一张表	mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql)
mysqldump -uroot -p123456 school student >D:/a.sql
导出多张表	mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 文件名(D:/a.sql)
mysqldump -uroot -p123456 school student result >D:/a.sql
导出所有表	mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql)
mysqldump -uroot -p123456 school >D:/a.sql
导出一个库	mysqldump -u用户名 -p密码 -B 库名 > 文件名(D:/a.sql)
mysqldump -uroot -p123456 -B school >D:/a.sql

导入
在登录mysql的情况下	source  备份文件
source D:/a.sql
在不登录的情况下	   mysql -u用户名 -p密码 库名 < 备份文件

1.11、三大范式

第一范式 (1st NF)

第一范式的目标是确保每列的原子性,如果每列都是不可再分的最小数据单元,则满足第一范式

第二范式(2nd NF)

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。

第二范式要求每个表只描述一件事情

第三范式(3rd NF)

如果一个关系满足第二范式,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式.

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

规范化和性能的关系

(关联查询的表不得超过三张表)

  • 为满足某种商业目标 , 数据库性能比规范化数据库更重要

  • 在数据规范化的同时 , 要综合考虑数据库的性能

  • 通过在给定的表中添加额外的字段(冗余字段),以大量减少需要从中搜索信息所需的时间(从多表查询变为单表查询)

  • 通过在给定的表中插入计算列,以方便查询

猜你喜欢

转载自blog.csdn.net/qq_42372017/article/details/109922101