首页 > 代码库 > 【Python之路】第十八篇--MySQL(一)
【Python之路】第十八篇--MySQL(一)
【Python之路】第十八篇--MySQL(一)
一、概述
1、什么是数据库 ?
答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库
2、什么是 MySQL、Oracle、SQLite、Access、MS SQL Server等 ?
答:他们均是一个软件,都有两个主要的功能:
- a. 将数据保存到文件或内存
- b. 接收特定的命令,然后对文件进行相应的操作
PS:如果有了以上软件,无须自己再去创建文件和文件夹,而是直接传递 命令 给上述软件,让其来进行文件操作,他们统称为数据库管理系统(DBMS,Database Management System)
3、什么是SQL ?
答:MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。有以下特点:
- MySQL是一种数据库管理系统。
- MySQL是一种关联数据库管理系统。
- MySQL软件是一种开放源码软件。
- MySQL数据库服务器具有快速、可靠和易于使用的特点。
- MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中。
- 有大量可用的共享MySQL软件。
二、下载安装
想要使用MySQL来存储并操作数据,则需要做几件事情:
a. 安装MySQL服务端
b. 安装MySQL客户端
b. 【客户端】连接【服务端】
c. 【客户端】发送命令给【服务端MySQL】服务的接受命令并执行相应操作(增删改查等)
1 2 3 4 5 | 下载 http://dev.mysql.com/downloads/mysql/ 安装 Linux: yum install mysql-server |
Window版本 (安装版)
1、下载
1 2 3 | MySQL Community Server 5.7.16
http://dev.mysql.com/downloads/mysql/ |
2、解压
如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\mysql-5.7.16-winx64
3、初始化
MySQL解压后的 bin 目录下有一大堆的可执行文件,执行如下命令初始化数据:
1 2 3 | cd c:\mysql-5.7.16-winx64\bin
mysqld --initialize-insecure |
4、启动MySQL服务
执行命令从而启动MySQL服务
1 2 3 4 5 | # 进入可执行文件目录 cd c:\mysql-5.7.16-winx64\bin
# 启动MySQL服务 mysqld |
5、启动MySQL客户端并连接MySQL服务
由于初始化时使用的【mysqld --initialize-insecure】命令,其默认未给root账户设置密码
1 2 3 4 5 6 7 | # 进入可执行文件目录 cd c:\mysql-5.7.16-winx64\bin
# 连接MySQL服务器 mysql -u root -p
# 提示请输入密码,直接回车 |
输入回车,见下图表示安装成功:
到此为止,MySQL服务端已经安装成功并且客户端已经可以连接上,以后再操作MySQL时,只需要重复上述4、5步骤即可。
但是,在4、5步骤中重复的进入可执行文件目录比较繁琐,如想日后操作简便,可以做如下操作。
a. 添加环境变量
将MySQL可执行文件添加到环境变量中,从而执行执行命令即可
+ View Code
如此一来,以后再启动服务并连接时,仅需:
+ View Code
b. 将MySQL服务制作成windows服务
上一步解决了一些问题,但不够彻底,因为在执行【mysqd】启动MySQL服务器时,当前终端会被hang住,那么做一下设置即可解决此问题:
+ View Code
注册成服务之后,以后再启动和关闭MySQL服务时,仅需执行如下命令:
1 2 3 4 5 | # 启动MySQL服务 net start mysql
# 关闭MySQL服务 net stop mysql |
window版 (免安装版)
1.下载免安装版本: (帐号:root 默认没有密码 )
1 | http://download.csdn.net/detail/whzhaochao/9183163 |
2.解压到任意目录:
3.修改配置文件 my.ini 注意路径填写\
[mysqld]
# 端口号
port=3307
# 设置mysql的安装目录
basedir="F:\\...\\MySQL Server 5.5 - 3307"
# 设置mysql数据库的数据的存放目录,必须是data,或者是\\xxx-data
datadir="F:\\...\\MySQL Server 5.5 - 3307\\data"
# 设置mysql服务器的字符集,默认编码
default-character-set=utf8
[client]
# 设置mysql客户端的字符集
default-character-set=utf8
[WinMySQLAdmin]
# 指定mysql服务启动启动的文件
Server=F:\\...\\MySQL Server 5.5 - 3307\\bin\\mysqld.exe
user=root
注:如果出现错误 error: Found option without preceding group in config file:....
上述文件保存为AscII格式,否则不需要修改!!
--------------------------------------------------------
Linux版本
安装:
1 | yum install mysql-server |
服务端启动
1 | mysql.server start |
客户端连接
1 2 3 4 5 6 7 | 连接: mysql -h host -u user -p
常见错误: ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘ (2), it means that the MySQL server daemon (Unix) or service (Windows) is not running. 退出: QUIT 或者 Control+D |
三、数据库操作
1、显示数据库
1 | show databases; |
默认数据库:
mysql - 用户权限相关数据
test - 用于用户测试数据
information_schema - MySQL本身架构相关数据
2、创建数据库
1 2 3 4 5 | # utf-8 CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
# gbk CREATE DATABASE 数据库名称 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; |
3、使用数据库
1 | use db_name; |
显示当前使用的数据库中所有表:
1 | show tables; |
4、用户管理
1 2 3 4 5 6 7 8 9 10 | 创建用户 create user ‘用户名‘@‘IP地址‘ identified by ‘密码‘; 删除用户 drop user ‘用户名‘@‘IP地址‘; 修改用户 rename user ‘用户名‘@‘IP地址‘; to ‘新用户名‘@‘IP地址‘;; 修改密码 set password for ‘用户名‘@‘IP地址‘ = Password(‘新密码‘)
PS:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议) |
5、授权管理
1 2 3 | how grants for ‘用户‘@‘IP地址‘ -- 查看权限 grant 权限 on 数据库.表 to ‘用户‘@‘IP地址‘ -- 授权 revoke 权限 on 数据库.表 from ‘用户‘@‘IP地址‘ -- 取消权限 |
对于权限:
View Code
对于数据库:
对于目标数据库以及内部其他:
数据库名.* 数据库中的所有
数据库名.表 指定数据库中的某张表
数据库名.存储过程 指定数据库中的存储过程
*.* 所有数据库
对于用户和ip地址
用户名@IP地址 用户只能在改IP下才能访问
用户名@192.168.1.% 用户只能在改IP段下才能访问(通配符%表示任意)
用户名@% 用户可以再任意IP下访问(默认IP地址为%)
实例:
grant all privileges on db1.tb1 TO ‘用户名‘@‘IP‘
grant select on db1.* TO ‘用户名‘@‘IP‘
grant select,insert on *.* TO ‘用户名‘@‘IP‘
revoke select on db1.tb1 from ‘用户名‘@‘IP‘
特殊的:
1 | flush privileges,将数据读取到内存中,从而实现不重启即可生效。 |
四、数据表基本
1、创建表
1 2 3 4 | create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8 |
是否可以为空:
是否可空,null表示空,非字符串
not null - 不可空
null - 可空
默认值:
默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
create table tb1(
nid int not null defalut 2,
num int not null
)
自增:
自增,如果为某列设置自增列,插入数据时无需设置此列,默认将自增(表中只能有一个自增列)
create table tb1(
nid int not null auto_increment primary key,
num int null
)
或
reate table tb1(
nid int not null auto_increment,
num int null,
index(nid)
)
注意:1、对于自增列,必须是索引(含主键)。
2、对于自增可以设置步长和起始值
show session variables like ‘auto_inc%‘;
set session auto_increment_increment=2;
set session auto_increment_offset=10;
shwo global variables like ‘auto_inc%‘;
set global auto_increment_increment=2;
set global auto_increment_offset=10;
主键:
主键,一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一。
create table tb1(
nid int not null auto_increment primary key,
num int null
)
或
create table tb1(
nid int not null,
num int not null,
primary key(nid,num)
)
外键:
外键,一个特殊的索引,只能是指定内容
creat table color(
nid int not null primary key,
name char(16) not null
)
create table fruit(
nid int not null primary key,
smt char(32) null ,
color_id int not null,
constraint fk_cc foreign key (color_id) references color(nid)
)
2、删除表
1 | drop table 表名 |
3、清空表
1 2 | delete from 表名 truncate table 表名 索引值重置, |
4、修改表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 添加列:alter table 表名 add 列名 类型 删除列:alter table 表名 drop column 列名 修改列: alter table 表名 modify column 列名 类型; -- 类型 alter table 表名 change 原列名 新列名 类型; -- 列名,类型
添加主键: alter table 表名 add primary key(列名); 删除主键: alter table 表名 drop primary key; alter table 表名 modify 列名 int, drop primary key;
添加外键:alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段); 删除外键:alter table 表名 drop foreign key 外键名称
修改默认值:ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; 删除默认值:ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; |
5、基本数据类型
MySQL的数据类型大致分为:数值、时间和字符串
View Code
二进制数据:TinyBlob、Blob、MediumBlob、LongBlob
更多参考:
- http://www.runoob.com/mysql/mysql-data-types.html
- http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html
五、表内容操作
1、增
1 2 3 | insert into 表 (列名,列名...) values (值,值,值...) insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...) insert into 表 (列名,列名...) select (列名,列名...) from 表 |
2、删
1 2 | delete from 表 delete from 表 where id=1 and name=‘alex‘ |
3、改
1 | update 表 set name = ‘alex‘ where id>1 |
4、查
1 2 3 | select * from 表 (少用* 效率低!) select * from 表 where id > 1 select nid,name,gender as xxoo from 表 where id > 1 ( as 设置别名为xxoo ) |
5、其他
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | a、条件 select * from 表 where id > 1 and name != ‘alex‘ and num = 12;
select * from 表 where id between 5 and 16;
select * from 表 where id in (11,22,33) select * from 表 where id not in (11,22,33) select * from 表 where id in (select nid from 表)
b、通配符 select * from 表 where name like ‘ale%‘ - ale开头的所有(多个字符串) select * from 表 where name like ‘%alex%‘ - 中间含有alex的 select * from 表 where name like ‘ale_‘ - ale开头的所有(一个字符)
c、限制 select * from 表 limit 5; - 前5行 select * from 表 limit 4,3; - 从第4行开始,后面取3行数据 select * from 表 limit 3 offset 4 - 同上
d、排序 select * from 表 order by 列 asc - 根据 "列" 从小到大排列 select * from 表 order by 列 desc - 根据 "列" 从大到小排列 select * from 表 order by 列1 desc,列2 asc - 根据 "列1" 从大到小排列,如果相同则按列2从小到大排序
e、分组 select department,count(department) from user group by department select num,nid from 表 group by num,nid select num,nid from 表 where nid > 10 group by num,nid order nid desc select max(nid),min(nid),sum(nid),avg(nid),department,count(department) from user group by department 聚合条件下做判断 想利用group by计算出的结果进行筛选!!! select max(nid),sum(nid),department,count(department) from user group by department having sum(nid) > 10
特别的:group by 必须在where之后,order by之前
f、连表 无对应关系则不显示 select A.num, A.name, B.name from A,B Where A.nid = B.nid
无对应关系则不显示 select A.num, A.name, B.name from A inner join B on A.nid = B.nid
A表所有显示,如果B中无对应关系,则值为null select A.num, A.name, B.name from A left join B on A.nid = B.nid
B表所有显示,如果B中无对应关系,则值为null select A.num, A.name, B.name from A right join B on A.nid = B.nid
g、组合 组合,自动处理重合 默认去除重复数据!!! select nickname from A union select name from B
组合,不处理重合 select nickname from A union all select name from B |
【Python之路】第十八篇--MySQL(一)