Mysql数据库部分简单整理

Posted 聂光宗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql数据库部分简单整理相关的知识,希望对你有一定的参考价值。

数据库概述
什么是数据(Data)
描述事物的符号记录称为数据

什么是数据库
数据库即存放数据的仓库,只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的
数据库是长期存放在计算机内、有组织、可共享的数据集合。
数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种 用户共享

什么是数据库管理系统
累了累了,自己去搜搜吧,没啥意思

数据库服务器、数据管理系统、数据库、表与记录的关系
记录:1 xxx 324245234 22(多个字段的信息组成一条记录,即文件中的一行内容)

表:student, scholl, class_list(即文件)
数据库:oldboy_stu(即文件夹)
数据库管理系统:如mysql(是一个软件)
数据库服务器:一台计算机(对内存要求比较高)

总结:
数据库服务器 -:运行数据库管理软件
数据库管理软件:管理 - 数据库
数据库:即文件夹,用来组织文件 / 表
表:即文件,用来存放多行内容 / 多条记录


MySql安装和基本管理
mysql是什么?
mysql就是一个基于socket编写的C/S架构的软件

数据库管理软件分类
分两大类:
  关系型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql语句通用
  非关系型:mongodb,redis,memcache
可以简单的理解为:
关系型数据库需要有表结构
非关系型数据库是key-value存储的,没有表结构

mysql的下载安装
自己去官网下去 用到CMD操作的建议 强烈建议用管理员运行cmd,尤其对小白来说!
下完了添加环境变量
将MySQL的bin目录路径追加到变值值中

初始化命令
mysqld --initialize-insecure
启动mysql服务
mysqld #启动MySQL服务

启动mysql客户端并连接mysql服务端(新开一个cmd窗口)
mysql -u root -p # 连接MySQL服务器

注意:--install前,必须用mysql启动命令的绝对路径
# 制作MySQL的Windows服务,在终端执行此命令:
"c:\\mysql-5.6.40-winx64\\bin\\mysqld" --install
# 移除MySQL的Windows服务,在终端执行此命令:
"c:\\mysql-5.7.16-winx64\\bin\\mysqld" --remove

注册成服务之后,以后再启动和关闭MySQL服务时,仅需执行如下命令:
# 启动MySQL服务
net start mysql
# 关闭MySQL服务
net stop mysql

windows下登录设置密码
打开终端,输入mysql

 


输入mysql提供的函数:select user(); # 查看当前登录的账号

 


当前登录的默认账号为ODBC@localhost

如果想切到root账号登录
命令
mysql -uroot -p

再查看当前用户:
select user();

 


管理员为root(拥有最高权限,管理员账号),密码为空,以无密码的方式登录了管理员账号,是非常危险的一件事情,所以要为管理员账号设置密码

设置管理员root账号密码为123
C:\\Users\\mjj>mysqladmin -uroot -p password "123" #设置初始密码 由于原密码为空,因此-p可以不用

 


ps:不用管它。翻译为:在命令行界面使用密码不安全,暴露在终端当中。

然后再登录账号,不输入密码则会出现如下结果:

 


再次执行如下操作:

 


再查看一下当前登录的账号:

 


如果想将原始密码123,设置新密码为456
C:\\Users\\mjj>mysqladmin -uroot -p"123" password "456" #修改mysql密码,因为已经有密码了,所以必须输入原密码才能设置新密码
依次执行如下操作:
mysql -uroot -p456
select user();

密码忘记——破解密码
跳过授权方式,直接登录!!
0.以管理员身份打开cmd

 


2.停掉mysql服务端
C:\\WINDOWS\\system32>net stop mysql
MySQL 服务正在停止.
MySQL 服务已成功停止。

3.执行如下命令跳过授权表
跳过授权表
C:\\WINDOWS\\system32>mysqld --skip-grant-tables
2018-06-09 17:12:38 0 [Warning] Insecure configuration for --secure-file-priv: Current value does not restrict location of generated files. Consider setting it to a valid, non-empty path.
2018-06-09 17:12:38 0 [Note] mysqld (mysqld 5.6.40) starting as process 6052 ...4.

4.再次查看

 


5. 现在可以任意的更改密码,执行如下命令
update mysql.user set authentication_string = password(\'\') where User = \'root\';

6.刷新权限,执行命令
flush privileges;

 


7.退出mysql。执行命令:exit,

8.让用户去加载权限,以管理员身份进入cmd,查看当前mysql进程
tasklist |findstr mysql #查看当前mysql的进程

 


9.杀死当前的进程,执行如下命令
taskkill /F /PID 6052 # 杀死当前的进程pid

 


10.再次执行如下操作,还原

 


统一字符编码
进入mysql客户端,执行\\s

 


为了统一字符编码,请执行如下操作:
(1)my.ini文件是mysql的配置文件,
在C:\\mysql-5.6.40-winx64文件下创建my.ini文件
(2)将如下代码拷贝保存。
#mysql5.5以上:修改方式为
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

(3)以管理员身份重启服务,执行如下命令
C:\\Windows\\system32>net stop MySQL
MySQL 服务正在停止..
MySQL 服务已成功停止。

C:\\Windows\\system32>net start MySQL
MySQL 服务正在启动 .
MySQL 服务已经启动成功。

(4)在cmd中输入mysql进入mysql环境,执行\\s,显示如下信息,表示成功

 


基本mysql语句
操作文件夹(库)

create database db1 charset utf8;


查看当前创建的数据库
show create database db1;
查看所有的数据库
show databases;


alter database db1 charset gbk;


drop database db1;


操作文件(表)
use db1; #切换文件夹
select database(); #查看当前所在文件夹


create table t1(id int,name char);


查看当前的这张t1表
show create table t1;
查看所有的表
show tables;
查看表的详细信息
desc t1;


modify修改的意思
alter table t1 modify name char(6);
改变name为大写的NAME
alter table t1 change name NAMA char(7);


删除表
drop table t1;


操作文件内容(记录)

插入一条数据,规定id,name数据leilei
insert t1(id,name) values(1,"mjj01"),(2,"mjj02"),(3,"mjj03");


select id from db1.t1;
select id,name from db1.t1;
select * from db1.t1;


update db1.t1 set name=\'zhangsan\';
update db1.t1 set name=\'alex\' where id=2;


delete from t1;
delete from t1 where id=2;



数据库命名规则:
可以由字母、数字、下划线、@、#、$
区分大小写
唯一性
不能使用关键字如 create select
不能单独使用数字
最长128位



库的操作
库的增删改查
查看系统库
show databases;

创建数据库
create database 数据库名 charset utf8;

数据库相关操作
查看数据库
show databases;
查看当前库
show create database db1;
查看所在的库
select database();
选择数据库
use 数据库名
删除数据库
DROP DATABASE 数据库名;
修改数据库
alter database db1 charset utf8;

SQL语言分为3种类型:
DDL、DML、DCL语句 想了解的自行百度



表的操作
存储引擎 全是概念自行百度
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。

mysql支持的存储引擎
mysql> show engines\\G;# 查看所有支持的引擎
mysql> show variables like \'storage_engine%\'; # 查看正在使用的存储引擎

重要引擎(具体描述自行百度)
InnoDB 存储引擎
MyISAM 存储引擎
Memory 存储引擎
BLACKHOLE

了解引擎(具体描述自行百度)
NDB 存储引擎
Infobright 存储引擎
NTSE 存储引擎

指定表类型/存储引擎
create table t1(id int)engine=innodb;# 默认不写就是innodb

创建表
语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);

#注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的

1.创建数据库
create database db2 charset utf8;
2.使用数据库
use db2;
3.创建a1表
create table a1(
  id int,
  name varchar(50),
  age int(3)
);
4.插入表的记录
insert into a1 values
(1,\'xxx\',18),
(2,\'ooo\',28);
5.查询表的数据和结构
查询a1表中的存储数据
select * from a1;
查看a1表的结构
desc a1;
查看表的详细结构
show create table a1\\G;

复制表
新创建一个数据库db3
create database db3 charset utf8;
使用db3
use db3;
复制db2.a1的表结构和记录
create table b1 select * from db2.a1;

查看db3.b1中的数据和表结构
select * from db3.b1;
只要表结构,不要记录
create table b2 select * from db2.a1 where 1>5;

查看表结构:
desc b2;
查看表结构中的数据
select * from b2;

还有一种做法,使用like(只拷贝表结构,不拷贝记录)
create table b3 like db2.a1;
desc b3;
select * from db3.b3;

删除表
drop table 表名;



数据类型
mysql常用数据类型概括:数字、字符串、时间、枚举、集合
1. 数字:
整型:tinyinit int bigint
小数:
float :在位数比较短的情况下不精准
double :在位数比较长的情况下不精准
0.000001230123123123
存成:0.000001230000

decimal:(如果用小数,则用推荐使用decimal)
精准
内部原理是以字符串形式去存

2. 字符串:
char(10):简单粗暴,浪费空间,存取速度快
    root存成root000000
varchar:精准,节省空间,存取速度慢

sql优化:创建表时,定长的类型往前放,变长的往后放
比如性别 比如地址或描述信息

>255个字符,超了就把文件路径存放到数据库中。
比如图片,视频等找一个文件服务器,数据库中只存路径或url。

3. 时间类型:
最常用:datetime

4. 枚举类型与集合类型



数值类型
整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT
作用:存储年龄,等级,id,各种号码等

给你个表自己看去吧

 



定点数类型: DEC等同于DECIMAL


浮点型
浮点类型:FLOAT DOUBLE
作用:存储薪资、身高、体重、体质参数等
语法:
-------------------------FLOAT-------------------
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
参数解释:单精度浮点数(非准确小数值),M是全长,D是小数点后个数。M最大值为255,D最大值为30

有符号:
-3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38

无符号:
1.175494351E-38 to 3.402823466E+38
精确度:
**** 随着小数的增多,精度变得不准确 ****


-------------------------DOUBLE-----------------------
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

参数解释: 双精度浮点数(非准确小数值),M是全长,D是小数点后个数。M最大值为255,D最大值为30

有符号:
-1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308

无符号:
2.2250738585072014E-308 to 1.7976931348623157E+308

精确度:
****随着小数的增多,精度比float要高,但也会变得不准确 ****

======================================
--------------------DECIMAL------------------------
decimal[(m[,d])] [unsigned] [zerofill]

参数解释:准确的小数值,M是整数部分总个数(负号不算),D是小数点后个数。 M最大值为65,D最大值为30。


精确度:
**** 随着小数的增多,精度始终准确 ****
对于精确数值计算时需要用此类型
decaimal能够存储精确值的原因在于其内部按照字符串存储。


日期类型
DATE TIME DATETIME TIMESTAMP YEAR
作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
语法:
YEAR
YYYY(1901/2155)

DATE
YYYY-MM-DD(1000-01-01/9999-12-31)

TIME
HH:MM:SS(\'-838:59:59\'/\'838:59:59\')

DATETIME

YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)

TIMESTAMP

YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)


字符类型
官网:https://dev.mysql.com/doc/refman/5.7/en/char.html
注意:char和varchar括号内的参数指的都是字符的长度

char类型:定长,简单粗暴,浪费空间,存取速度快
字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
存储:
存储char类型的值时,会往右填充空格来满足长度
例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储

检索:
在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(设置SQL模式:SET sql_mode = \'PAD_CHAR_TO_FULL_LENGTH\';
      查询sql的默认模式:select @@sql_mode;)

varchar类型:变长,精准,节省空间,存取速度慢
字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
存储:
varchar类型存储数据的真实内容,不会用空格填充,如果\'ab \',尾部的空格也会被存起来
强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)

检索:
尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容

官网解释如下:

 



枚举类型和集合类型
字段的值只能在给定范围中选择,如单选框,多选框
enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)


完整性约束
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
主要分为:
PRIMARY KEY (PK) #标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) #标识该字段为该表的外键
NOT NULL #标识该字段不能为空
UNIQUE KEY (UK) #标识该字段的值是唯一的
AUTO_INCREMENT #标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT #为该字段设置默认值

UNSIGNED #无符号
ZEROFILL #使用0填充

说明:
1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum(\'male\',\'female\') not null default \'male\'

必须为正值(无符号) 不允许为空 默认是20
age int unsigned NOT NULL default 20
3. 是否是key
主键 primary key
外键 foreign key
索引 (index,unique...)




not null 与default
是否可空,null表示空,非字符串
not null - 不可空
null - 可空

默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值


unique
单列唯一
联合唯一

primary key
一个表中可以:
单列做主键
多列做主键(复合主键)
约束:等价于 not null unique,字段的值不为空且唯一
存储引擎默认是(innodb):对于innodb存储引擎来说,一张表必须有一个主键。


auto_increment
约束:约束的字段为自动增长,约束的字段必须同时被key约束

foreign key


表的三种关系
多对一、多对多、一对一


数据的增删改
插入数据 INSERT
更新数据 UPDATE
删除数据 DELETE

一、在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括

1.使用INSERT实现数据的插入
2.UPDATE实现数据的更新
3.使用DELETE实现数据的删除
4.使用SELECT查询数据以及。


二、插入数据 INSERT
1. 插入完整数据(顺序插入)
语法一:
INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);

语法二:
INSERT INTO 表名 VALUES (值1,值2,值3…值n);

2. 指定字段插入数据
语法:
INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);

3. 插入多条记录
语法:
INSERT INTO 表名 VALUES
(值1,值2,值3…值n),
(值1,值2,值3…值n),
(值1,值2,值3…值n);

4. 插入查询结果
语法:
INSERT INTO 表名(字段1,字段2,字段3…字段n)
SELECT (字段1,字段2,字段3…字段n) FROM 表2
WHERE …;

三、更新数据UPDATE
语法:
UPDATE 表名 SET
字段1=值1,
字段2=值2,
WHERE CONDITION;

示例:
UPDATE mysql.user SET password=password(‘123’)
where user=’root’ and host=’localhost’;
四、删除数据DELETE
语法:
DELETE FROM 表名
WHERE CONITION;

示例:
DELETE FROM mysql.user
WHERE password=’’;



单表查询
一、单表查询的语法
SELECT 字段1,字段2... FROM 表名
WHERE 条件
GROUP BY field
HAVING 筛选
ORDER BY field
LIMIT 限制条数
二、关键字的执行优先级(重点)
from
where
group by
having
select
distinct
order by
limit

1.找到表:from
2.拿着where指定的约束条件,去文件/表中取出一条条记录
3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
4.将分组的结果进行having过滤
5.执行select
6.去重
7.将结果按条件排序:order by
8.限制结果的显示条数


where 约束 
where子句中可以使用
1.比较运算符:>、<、>=、<=、<>、!=
2.between 80 and 100 :值在80到100之间
3.in(80,90,100)值是10或20或30
4.like \'xiaomagepattern\': pattern可以是%或者_。%小时任意多字符,_表示一个字符
5.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

group by 分组查询
1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的
2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等
3、为何要分组呢?
取每个部门的最高工资
取每个部门的员工数
取男人数和女人数
小窍门:‘每’这个字后面的字段,就是我们分组的依据
4、大前提:
可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数

聚合函数
max()求最大值
min()求最小值
avg()求平均值
sum() 求和
count() 求总个数

HAVING过滤
HAVING与WHERE不一样的地方在于
执行优先级从高到低:where > group by > having
1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数

order by 查询排序
按单列排序
SELECT * FROM employee ORDER BY age;
SELECT * FROM employee ORDER BY age ASC;
SELECT * FROM employee ORDER BY age DESC;
按多列排序:先按照age升序排序,如果年纪相同,则按照id降序
SELECT * from employee
ORDER BY age ASC,
id DESC;


limit 限制查询的记录数:
示例:
SELECT * FROM employee ORDER BY salary DESC
LIMIT 3; #默认初始位置为0
SELECT * FROM employee ORDER BY salary DESC
LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条
SELECT * FROM employee ORDER BY salary DESC
LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条


多表查询
多表连接查询
语法:
SELECT 字段列表
FROM 表1 INNER|LEFT|RIGHT JOIN 表2
ON 表1.字段 = 表2.字段;

符合条件连接查询

子查询


先整理到这吧!数据库还有很多很多!
后面会用到pymysql









以上是关于Mysql数据库部分简单整理的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发-OC学习-常用功能代码片段整理

Mysql Innodb 表碎片整理

mysql网络部分代码

文顶顶iOS开发博客链接整理及部分项目源代码下载

VS2015 代码片段整理

前端片段整理