ChuannBlog

MySQL

数据库基础

数据库服务器,数据管理系统,数据库,表和记录
装文件的电脑,MySQL软件,文件夹,文件和文件的每一行内容

为什么不用文件?

什么是数据

描述事物的符号记录(特征)称为数据,描述事物的符号既可以是数字,也可以是文字、图片,图像、声音、语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机

什么是数据库(DataBase,简称DB)

数据库即存放数据的仓库,只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的
过去人们将数据存放在文件柜里,现在数据量庞大,已经不再适用
数据库是长期存放在计算机内、有组织、可共享的数据即可。
数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种 用户共享

数据库分类

分两大类:

什么是数据库管理系统(DataBase Management System 简称DBMS)

在了解了Data与DB的概念后,如何科学地组织和存储数据,如何高效获取和维护数据成了关键
这就用到了一个系统软件—数据库管理系统
如MySQL、Oracle、SQLite、Access、MS SQL Server

回到顶部

MySQL准备使用

Liunx环境

Windows环境

下载

在官网下载相应版本。
官网链接:https://dev.mysql.com/downloads/mysql

解压

如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\mysql-5.7.16-winx64

初始化

启动MySQL服务

启动MySQL客户端连接到MySQL服务

优化MySQL启动

添加环境变量

【右键计算机】–>【属性】–>【高级系统设置】–>【高级】–>【环境变量】–>
【在第二个内容框中找到 变量名为Path 的一行,双击】 –>
【将MySQL的bin目录路径追加到变值值中,用;分割】

将MySQL服务制作成windows服务
# 制作MySQL的Windows服务,在终端执行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --install
 
# 移除MySQL的Windows服务,在终端执行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --remove

扩展windows命令

回到顶部

MySQL软件基本管理

第一次登录后设置密码

忘记密码

linux
windows

基本方法,跳过授权表登录

windows下为mysql服务指定配置文件

#在mysql的解压目录下,新建my.ini,然后配置
#1. 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效
[mysqld]
;skip-grant-tables
port=3306
character_set_server=utf8
#解压的目录
basedir=E:\mysql-5.7.19-winx64
#data目录
datadir=E:\my_data #在mysqld --initialize时,就会将初始数据存入此处指定的目录,在初始化之后,启动mysql时,就会去这个目录里找数据

#2. 针对客户端命令的全局配置,当mysql客户端命令执行时,下列配置生效
[client]
port=3306
default-character-set=utf8
user=root
password=123

#3. 只针对mysql这个客户端的配置,2中的是全局配置,而此处的则是只针对mysql这个命令的局部配置
[mysql]
;port=3306
;default-character-set=utf8
user=egon
password=4573

#!!!如果没有[mysql],则用户在执行mysql命令时的配置以[client]为准

mac上MySQL出现error

mac mysql error You must reset your password using ALTER USER statement before executing this statement.

回到顶部

MySQL数据库导入导出

导出

导入

在mysql内use数据库时:

在mysql外部:

导入多个数据库

数据库迁移

mysqldump -h 源IP -uroot -p –databases db1 | mysql -h -目标IP -u用户名 -p密码

导出其他格式文件

为其他人创建mysql用户

回到顶部

SQL语句(Structured Query Language)

回到顶部

库(文件夹)操作

回到顶部

表(文件)操作

切换到文件夹下:

use db1;

简易例子

create table t1(id int, name char(10)) engine=innodb;
create table t2(id int, name char(10)) engine=innodb;
create table t4 select * from t1 where 1=2;

完整命令

alter table t1 add age int;
alter table t1 modify name char(12);

完整命令

回到顶部

记录(文件内容)操作

insert into db1.t1 values(1,'chuck',19),(2,'chuck2',20),(3,'chuck3',21);
insert into t1 value(4,'chuck4',20);
insert into t1(name) value('chuck5');

update t1 set name='NOBODY' where id=4;
update t1 set name='None' where name=chuck;
update t1 set id=12 where name='None';

Single-table syntax

Multiple-table syntax

delete from t1 where id=4;
delete from t1; # 清空表

truncate # :截断,比delete删除快         
truncate t1; # 清空表      

自增id

create table t1(id int not null, name char(10));

拷贝表

回到顶部

授权

# 创建用户
create user 'temp'@'localhost' identified by '123';

# insert delete update select
# 级别1:所有库,所有表,所有字段
grant select on *.* to 'temp'@'localhost' identified by '123';

# 级别2:对db1下的所有表,所有字段
grant select on db1.* to 'temp2'@'localhost' identified by '123';

# 级别3:对db下的t1表的所有字段
grant select on db1.t1 to 'temp3'@'localhost' identified by '123';

# 级别4:对db下的t1表的id字段
grant select (id) on db1.t1 to 'temp4'@'localhost' identified by '123';

# 修改完毕后
flush privileges;

完整命令

回到顶部

数据类型

数值类型

整数

整数的length表示显示的长度(在zerofill启用时有效)

浮点数
位类型

字符串类型

日期

枚举与集合

回到顶部

完整性约束

其他约束条件

唯一、主键

自增长

外键

回到顶部

查询语句

单表查询

关键字的执行优先级及详细用法

多表查询

连接查询

子查询(嵌套查询)

查询练习:

回到顶部

索引

详细参阅http://www.cnblogs.com/linhaifeng/articles/7274563.html#_label2

回到顶部

Pymysql

用法示例

查询

import pymysql

# 链接mysql,使用数据库
conn = pymysql.connect(host='localhost', user='root', password='', database='day47', charset='utf8')
# 拿到mysql的游标(可接收输入命令的)
cursor = conn.cursor()
# 编写sql语句
sql = 'select * from user;'
# 拿到受影响的行数
res = cursor.execute(sql)
print('%s rows in set (0.00sec)'%res)

cursor.close()
conn.close()
实现用户登录
import pymysql

user = input('username: ').strip()
pwd = input('password: ').strip()

# 链接mysql,使用数据库
conn = pymysql.connect(host='localhost', user='root', password='', database='day47', charset='utf8')
# 拿到mysql的游标(可接收输入命令的)
cursor = conn.cursor()

sql = 'select * from user where name="%s" and pwd="%s";' % (user, pwd)
print(sql)
# 拿到受影响的行数
res = cursor.execute(sql)
# 当查询有结果说明用户名和密码是正确的则登录成功
if res:
    print('Login success')
else:
    print('Login failure')

cursor.close()
conn.close()
sql注入

在上面的例子中,按照给定的标准输入用户名和密码可以正常登陆,但是如果非正常输入呢? 对于上面的例子,登录时输入:

username: xxx" or 1=1 #
password: 
select * from user where name="xxx" or 1=1 #" and pwd="";
Login success

增加、删除、修改

import pymysql

# 链接mysql,使用数据库
# conn = pymysql.connect(host='localhost', user='root', password='', database='day47')
# conn.set_charset('utf8')
conn = pymysql.connect(host='localhost', user='root', password='', database='day47', charset='utf8')


# 拿到mysql的游标(可接收输入命令的)
cursor = conn.cursor()

sql = 'insert into user(name, pwd) values(%s, %s);'

# 拿到受影响的行数
# 插入单条记录
# res = cursor.execute(sql, ('哈大', '123'))
# 插入多条记录
res = cursor.executemany(sql, [('哈大', '123'), ('sada', '123')])

print('%s rows in set (0.00sec)' % res)

# 提交到mysql才算修改了
conn.commit()

cursor.close()
conn.close()

读取查询记录


import pymysql


# 链接mysql,使用数据库
conn = pymysql.connect(host='localhost', user='root', password='', database='day47')
conn.set_charset('utf8')
# 拿到mysql的游标(可接收输入命令的)
cursor = conn.cursor()

sql = 'select * from user;'

# 执行sql语句
cursor.execute(sql)

回到顶部

other

在MySQL内查看所有配置信息

LAMP

Apache MySQL PHP Linux

LNMP Nginx MySQL PHP/Python Linux

MySQL –> MariaDB

sql_mode