MySQ基本操作

MySQL概述

1、什么是数据库
	数据库是一个存储数据的仓库
2、哪些公司在用数据库
	金融机构、购物网站、游戏网站、论坛网站... ...
3、提供数据库服务的软件
	1、软件分类
		MySQL、SQL_Server、Oracle、DB2、Mariadb、MongoDB ..
	2、在生产环境中,如何选择使用哪个数据库软件
		1、是否开源
			1、开源软件
				MySQL、Mariadb、MongoDB
			2、商业软件
				Oracle、DB2、SQL_Server
		2、是否跨平台
			1、不跨平台 :SQL_Server
			2、跨平台
				MySQL、Oracle、DB2、Mariadb、MongoDB
		3、公司类型
			1、商业软件:政府部门、金融机构
			2、开源软件:游戏网站、购物网站、论坛网站... 
4、MySQL特点
	1、关系型数据库
		1、关系型数据库特点
			1、数据是以行和列的形式存储的
			2、这一系列的行和列成为表
			3、表中的每一行叫一条记录
			4、表中的每一列叫一个字段
			5、表和表之间的逻辑关联叫关系
			6、关系型数据库的核心内容是 关系 即 二维表

			2、非关系型数据库存储
				{姓名:"张三丰",年龄:25,班级:"1712",班主任:"侯"}
				{姓名:"张三丰",年龄:25,班级:"1712",班主任:"侯"}
	2、跨平台
		可以在Unix、Linux、Windows上运行MySQL服务
	3、支持多种编程语言
		Python、java、php、... ...

启动和连接Mysql服务

1、服务端启动
	1、查看Mysql服务的状态
		sudo /etc/init.d/mysql status
	2、启动Mysql服务
		sudo /etc/init.d/mysql start
	3、停止Mysql服务
		sudo /etc/init.d/mysql stop
	4、重启Mysql服务
		sudo /etc/init.d/mysql restart
2、客户端连接
	1、命令格式
		mysql -h主机名 -u用户名 -p密码
		mysql -hlocalhost -uroot -p123456
	2、本地连接可以省略 -h 选项
		mysql -uroot -p123456
	3、断开与服务器的连接
		exit   |   quit  |   \q

基本SQL命令

1、SQL命令的使用规则
	1、每条命令必须以 ; 结尾
	2、SQL命令不区分字母大小写
	3、使用 \c 终止命令的执行
2、库的管理
	1、库的基本操作
		1、查看已有的库
			show databases;
		2、创建库(指定字符集)
			create database 库名 default charset=utf8;
		3、查看创建库的语句
			show create database 库名;
		4、查看当前所在库
			select database();
		5、切换库
			use 库名;
		6、查看库中已有表
			show tables;
		7、删除库
			drop database 库名;
	2、库的命名规则
		1、可以使用数字、字母、_,但是不能是纯数字
		2、库名区分字母大小写
		3、库名具有唯一性
		4、不能使用特殊字符和mysql关键字

3、表的管理
	1、表的基本操作
		1、创建表
			create table 表名(
			字段名 数据类型,
			字段名 数据类型,
			...
			);
		2、查看创建表的语句(字符集)
			show create table 表名;
		3、查看表结构
			desc 表名;
		4、删除表
			drop table 表名;
	2、注意
		1、所有的数据都是以文件的形式存储在数据库目录下
		2、数据库目录:/var/lib/mysql

	1、在表中插入记录
		1、insert into 表名 values(值1),(值2),....;
	2、查看表记录
		1、select * from 表名;
		2、select 字段名1,字段名2,... from 表名;

如何更改默认字符集

1、方法
	通过更改Mysql的配置文件实现
2、步骤
	1、获取root权限
		sudo -i
	2、修改mysql配置文件
		vi /etc/mysql/mysql.conf.d/mysqld.cnf
		[mysqld]
		character_set_server = utf8
	3、重启mysql服务
		sudo /etc/init.d/mysql restart		

客户端把数据存储到数据库服务器上的过程

1、连接到数据库服务器 : mysql -uroot -p
2、选择库 : use 库名;
3、创建/修改表
4、断开与数据库的连接 :exit | quit | \q

数据类型

1、数值类型(有符号signed 和 无符号unsigned)
	1、整型
		1、int 大整型(4个字节)
			取值范围:0~2**32 -1
		2、tinyint 微小整型(1个字节)
			1、有符号(signed默认) -128~127
			2、无符号(unsigned) 0~255
		3、smallint 小整型(2个字节)
			取值范围:0~65535
		4、bigint 极大整型(8个字节)
			取值范围:0~2**64 -1
	2、浮点型
		1、float(4个字节,最多显示7个有效位)
			1、用法
				字段名 float(m,n) m->总位数 n->小数位位数
				float(5,2) 取值范围:-999.99~999.99
			2、注意
				1、浮点型插入整数时会自动补全小数位数
				2、小数位如果多于指定的位数,会对下一位四舍五入
		2、double(8个字节,最多显示15个有效位)
			1、用法
				字段名 double(m,n)
		3、decimal(M+2个字节,最多显示28个有效位)
			1、用法
				decimal(M,D)
2、字符类型
	1、char(定长)
		1、宽度取值范围:1~255
		2、不给定宽度默认宽度为1
	2、varchar(变长)
		1、取值范围:1~65535
		2、注意
			1、varchar没有默认宽度,必须给定一个宽度
			2、char和varchar使用时都给定宽度,但不能超过各自的范围
		3、char 和 varchar的特点
			1、char
				浪费存储空间,性能高
			2、varchar
				节省存储空间,性能低
		4、字符类型的宽度和数值类型的宽度的区别
			1、数值类型的宽度为显示宽度,只用于select查询时使用,和占用存储空间大小无关,可用zerofill查看效果
			2、字符类型的宽度超过则无法存储

3、枚举类型
	1、定义 :字段值只能在列举的范围内选择
	2、enum 单选(最多有65535个不同的值)
		字段名 enum(值1,值2,...)
	3、set 多选(最多有64个不同的值)
		字段名 set(值1,值2,...)
		likes set("Study","Girl","Python","MySQL")
		"Study,Gril"
4、日期时间类型
	1、year :年 YYYY
	2、date :日期 YYYYMMDD
	3、time :时间 HHMMSS
	4、datetime :日期时间 YYYYMMDDHHMMSS
	5、timestamp :日期时间 YYYYMMDDHHMMSS
	6、注意
		1、datetime不给值默认返回NULL
		2、timestamp不给值默认返回系统当前时间

表字段的操作

1、语法 :alter table 表名 执行动作;
	1、添加字段(add)
		1、添加到末尾
			alter table 表名 add 字段名 数据类型;
		2、添加到开始
			alter table 表名 add 字段名 数据类型 first;
		3、添加到指定位置
			alter table 表名 add 字段名 数据类型 after 字段名
	2、删除字段(drop)
		alter table 表名 drop 字段名;
	3、修改数据类型(modify)
		alter table 表名 modify 字段名 新的数据类型;
	4、修改字段名(change)
		alter table 表名 change 旧名 新名 数据类型;
	5、修改表名(rename)
		alter table 表名 rename 新表名;

名词介绍

1、DB(Database)
	DB就是数据库,存储数据的仓库
2、DBMS(Database Management System)
	数据库管理系统
	管理数据库的软件,MySQL、Oracle、...
3、DBS(Database System)
	数据库系统
	DBS=DB(存储)+DBMS(数据库软件)+数据库应用(财务管理系统,人事管理系统)+用户

where条件字句(配合查、改、删操作)

1、语法格式
	select * from 表名 where 条件;

表记录管理(续)

1、更新表记录
	1、update 表名 set 字段名=值,字段名=值,...where 条件;
	2、注意
		update语句后如果不加where子句,表中所有记录该字段的值都会更改
2、删除表记录
	1、delete from 表名 where 条件;
	2、注意
		delete语句后如果不加where条件子句,将会把表中所有的记录全部删除

运算符操作(配合查询、修改、删除操作)

1、数值比较&字符比较
	1、数值比较运算符:=、!=、>、>=、<、<=
	2、字符比较运算符:=、!=
	3、语法格式
		查询:
			select * from 表名 where 字段名 运算符 数字/字符;
		修改:
			update 表名 set 字段名=值,... where 字段名 运算符 数字/字符;
		删除:
			delete from 表名 where 字段名 运算符 数字/字符;

2、逻辑比较
	1、运算符: 
		and(多个条件同时满足)  
		or(多个条件有一个条件满足就可以)

3、范围内比较
	1、运算符 :between and 、in 、not in
	2、语法格式
		字段名 between 值1 and 值2
		字段名 in(值1,值2,...)
		字段名 not in(值1,值2,...)

4、匹配空、非空
	1、空 :is null
	2、非空 :is not null

5、模糊比较
	1、语法格式
		字段名 like 表达式
	2、表达式
		1、_ : 匹配单个字符
		2、% : 匹配0到多个字符

SQL查询

1、总结(执行顺序)
	3、 select ... 聚合函数 from ...
	1、 where ...
	2、 group by ...
	4、 having ...
	5、 order by ...
	6、 limit ...;
2、order by
	1、作用:对查询的结果进行排序
	2、语法格式:order by 字段名 排序方式;
	3、排序方式
		1、ASC(默认) : 升序
		2、DESC   :降序

3、limit(永远放在SQL语句的最后写)
	1、作用:限制显示查询记录的条数
	2、用法
		1、limit n -->显示几条记录
		2、limit m,n
			m --> 从第几条记录开始显示,n表示显示几条
			## m的值是从0开始计数的,3从第四条记录开始
			limit 1,3 --> 显示 2、3、4 三条记录

4、聚合函数
	1、分类
		1、avg(字段名) : 求字段的平均值
		2、sum(字段名) : 求字段的和
		3、max(字段名) : 求字段的最大值
		4、min(字段名) : 求字段的最小值
		5、count(字段名):统计该字段记录的个数

5、group by
	作用 :给查询的结果进行分组


6、having
	1、作用:对查询的结果进行进一步筛选

	2、注意
		1、having语句通常与group by语句联合使用,用来过滤由group by语句返回的记录集
		2、having语句的存在弥补了where关键字不能与聚合函数联合使用的不足,having操作的是聚合函数生成的显示列
7、distinct
	1、作用:不显示字段的重复值

	2、注意
		1、distinct处理的是distinct和from之间的所有字段,所有字段值必须全部相同才能去重
		2、distinct不能对任何字段做聚合处理
8、查询表记录时做数学运算
	1、运算符 :+ - * / %

约束

1、作用
	为了保证数据的完整性、一致性、有效性
2、约束分类
	1、默认约束(default)
		1、作用
			在插入记录时,如果不给该字段赋值,则使用默认值
		2、格式
			字段名 数据类型 default 值,
	2、非空约束(not null)
		1、作用 :不允许将该字段设置为NULL
		2、格式 :字段名 数据类型 not null

索引

1、定义
	对数据库中表的一列或者多列的值进行排序的一种结构(MySQL中用Btree方式)
2、优点
	加快数据的检索速度
3、缺点
	1、当对表中的数据进行增加、删除或修改的时候,索引也到动态维护,降低了数据的维护速度
	2、索引需要占用物理空间
4、索引分类
	1、普通索引(index)
		1、使用规则
			1、一个表中可以有多个index字段
			2、字段的值可以有重复,且可以为NULL值
			3、经常把做查询条件的字段设置为index字段
			4、index字段的key标志是MUL
		2、创建index
			1、创建表时创建
				index(字段名1),index(字段名2)
			2、在已有表中创建index
				1、语法
					create index 索引名 on 表名(字段名);
				2、注意
					索引名一般和字段名一样
		3、查看普通索引
			1、desc 表名; -->查看key标志
			2、show index from 表名;
		4、删除索引
			drop index 索引名 on 表名;
	2、唯一索引(unique key)
		1、使用规则
			1、一个表中可以有多个unique字段
			2、unique字段的值不允许重复,但可以为NULL
			3、unique的key标志是UNI
		2、创建唯一索引unique
			1、创建表时创建
				1、unique(字段名1),unique(字段名2)
				2、字段名 数据类型 unique,
			2、在已有表中创建
				create unique index 索引名 on 表名;
	3、删除唯一索引
		drop index 索引名 on 表名;
		注意:index、unique在删除时只能一个一个删


3、主键索引(PRI)
	1、使用规则
		1、一个表中只能有一个主键(primary)字段
		2、对应字段的值不允许重复,且不能为空
		3、主键字段的key标志PRI
		4、把表中能够唯一标识一条记录的字段设置为主键,通常把表中记录编号的字段设置为主键
	2、创建主键(primary key)
		1、创建表时创建
			1、字段名 数据类型 primary key,
			2、primary key(字段名)
		2、在已有表中创建
			alter table 表名 add primary key(字段名);
	3、删除
		alter table 表名 drop primary key;
	4、自增长属性(auto_increment)
		1、作用:通常和主键字段一起配合使用
		2、创建
			1、创建表时创建
			字段名 数据类型 primary key auto_increment
			2、在已有表中添加自增长属性(modify)
				alter table 表名 modify 字段名 数据类型 primary key auto_increment
	5、删除主键及自增长属性
		1、alter table 表名 modify 字段名 数据类型;
		2、alter table 表名 drop primay key;
4、外键索引(foreign key)
	1、定义
		让当前表的字段值在另一个表的范围内选择
	2、语法格式
		foreign key(参考字段名)
		references 被参考表名(被参考字段名)
		on delete 级联动作
		on update 级联动作
	3、案例
		表1:缴费信息表(财务)
			学号  姓名     班级     缴费金额
				1   唐伯虎  AID1712     28000
				2   点秋香  AID1712     20000
		表2:学生信息表(班主任)
			学号  姓名    缴费金额
				1   唐伯虎    28000
	4、删除外键
		1、语法格式
			alter table 表名 drop foreign key 外键名;
		2、注意
			1、外键名的查看方式
				show create table 表名;
	5、在已有表中添加外键
		1、语法格式
			alter table 表名 add 
			foreign key(参考字段名) references
			被参考表名(被参考字段名)
			on delete 级联动作
			on update 级联动作
		2、注意
			在已有表中添加外键时,会受到表中原有数据的限制
	6、级联动作
		1、cascade :数据级联更新
			1、当主表删除记录时,如果从表有相关联记录则级联删除
			2、当主表更新被参考字段的值时,从表级联更新参考字段的值
		2、restrict(默认)
			1、当主表删除记录时,如果从表中有相关联记录则不允许主表删除
			2、update同 1 
		3、set null
			1、当主表删除记录时,从表中相关联记录外键字段值变为null
			2、update 同 1
		4、no action
			同 restrict,都是立即检查外键限制
	7、使用规则
		1、两张表被参考字段和参考字段的数据类型要一致
		2、被参考字段必须是KEY的一种,通常是primary key

数据导入

1、作用:将文件系统的内容导入到数据库中
2、语法格式
	load data infile "文件名"
	into table 表名
	fields terminated by "分隔符"
	lines terminated by "分隔符"

	tarena:x:1000:1000:tarena,,,:/home/tarena:/bin/bash
	用户名:密码:UID:GID:描述:家目录:登录权限
3、把/etc/passwd 导入到mysql数据库中
4、操作步骤
	1、在数据库中创建对应的表
	2、查看数据库的默认搜索路径
		show variables like "secure_file_priv";
	3、将系统文件拷贝到数据库的默认搜索路径中
		sudo cp /etc/passwd /var/lib/mysql-files
		sudo -i
		cd /var/lib/mysql-files
		ls
		exit

数据导出

1、作用
	将数据库中表的记录保存到系统文件里
2、语法格式
	select ... from 表名
	into outfile "文件名"
	fields terminated by "分隔符"
	lines terminated by "分隔符"

3、注意
	1、导出的内容由SQL查询语句决定
	2、执行导出命令时路径必须指定在对应的数据库目录下
	3、show variables like "secure_file_priv";
		 show variables like "%secure%";

表的复制

1、表的复制
	语法格式
		create table 表名 select 查询命令;

2、只复制表结构
	1、语法格式
		create table 表名 select ... where false;
3、注意
	1、复制表的时候不会把原有表的 键 属性复制过来

嵌套查询

1、定义
	把内层的查询结果作为外层查询的条件
2、语法格式
	select查询语句 where 条件(select查询语句);

多表查询

两种方式
	1、select 字段名列表 from 表名列表; #笛卡尔积
		select * from tt1,tt2;
	2、select 字段名列表 from 表名列表 where 条件;

连接查询

1、内连接
	1、定义
		从表中删除与其他被连接表中没有匹配到的行
	2、语法格式
		select 字段名列表 from 表1 
		inner join 表2 on 条件;

2、外连接
	1、左连接
		1、定义
			以左表为主显示查询结果
		2、语法
			slect 字段名列表 from 表1 left join 表2 on 条件;

	2、右连接
		1、定义
			以左表为主显示查询结果
		2、语法
			slect 字段名列表 from 表1 right join 表2 on 条件;

数据备份(在Linux终端操作)

1、命令格式
	mysqldump -u用户名 -p 源库名 > 路径/XXX.sql
2、源库名的表示方式
	--all-databases    备份所有库
	库名               备份单个库
	-B 库1 库2 ...     备份多个库
	库名 表1 表2 ...   备份指定库的指定表

数据恢复(在Linux终端操作)

1、命令格式
	mysql -uroot -p 目标库名 < 路径/XXX.sql
2、从所有库的备份文件中恢复某一个库(--one-database)
	mysql -uroot -p --one-database 目标库名 < 路径/all_mysql.sql

3、注意
	1、恢复库时如果恢复到原有库会将表中数据覆盖,新增的表不会删除
	2、在恢复时如果要恢复的库不存在,则先要创建空库

ER模型&ER图

1、定义
	ER模型即实体-关系模型,ER图即实体-关系图
2、三个概念
	1、实体
		1、定义:现实世界中任何可以被认知、区分的事物
		2、示例
			1、学校 :学生、教师、课程、班主任 ...
			2、企业 :职工、产品
	2、属性
		1、定义 :实体所具有的特性
		2、示例
			1、学生属性:学号、姓名、年龄、性别、专业 ...
			2、产品属性:产品编号、产品名称、规格 ...
	3、关系
		1、定义 :实体之间的关系
		2、分类
			一对一关系(1:1) 班级和班长
			一对多关系(1:n) 公司和职工、班级和学生
			多对多关系(m:n) 学生和课程、商店和顾客
	4、ER图的绘制
		1、矩形框代表实体,菱形框代表关系,椭圆形代表属性
		2、示例
			学生选课系统

workbench(图形化界面操作数据库)

事务&事务回滚

1、事务定义
	一件事从开始发生到结束的整个过程
2、属性
	1、原子性:一个事务是不可分割的工作单位,事务中的各个操作要么都做,要么就都不做
	2、一致性:事务必须从一个一致性状态到另一个一致性状态
	3、隔离性:一个事务的执行不能被其他并发事务干扰
	4、持久性:一个事务一旦提交,它对数据库的改变是永久性的
3、事务及事务回滚的应用
	1、mysql中默认sql语句会自动commit到数据库
		show variables like "autocommit";
	2、事务应用
		1、开启事务
			mysql> start transaction;
			## 此时autocommit被禁用,SQL命令不会对数据库中数据做修改
		2、终止事务
			mysql> commit; | rollback;
	3、注意
		事务&事务回滚只针对对表记录的操作:增加、删除、修改,对创建库、创建表是无效的
	4、案例
		1、背景
			你 :   建行卡
			你朋友:工商卡
			你在建行的自动提款机给你朋友(工商银行卡)转账
		2、过程
			表1、建行:CCB
			表2、工行:ICBC

			###开始转账
			mysql>start transaction;
			mysql>update CCB set money=95000 where name="你";
			mysql>update ICBC set ... 断电了...;
			mysql>rollback

			###验证
			mysql>select * from CCB;

Python数据库编程

1、python数据库接口(Python DB-API)
	1、定义:为开发人员提供的数据库应用编程接口
	2、支持的数据库服务软件
		MySQL、Oracle、SQL_Server、Sybase、Mogodb ...
	3、Python提供的操作MySQL的模块
		模块名:pymysql
	4、pymysql的使用流程
		1、建立数据库连接
		2、创建游标对象
		3、使用游标对象的方法和SQL语句操控MySQL数据库
		4、提交commit
		5、关闭游标
		6、关闭数据库连接
	5、建立数据库连接
		1、语法格式
			对象名(db) = pymysql.connect("主机地址","用户名","密码","库名",charset="utf8")
		2、connect对象(db)的方法
			1、cursor() 创建一个游标对象db.cursor()
			2、commit() 提交到数据库 db.commit()
			3、rollback() 回滚 db.rollback()
			4、close() 关闭与数据库的连接 db.close()
		3、cursor游标对象(cur)的方法
			1、execute() 执行sql命令
			2、fetchone() 取得结果集的第一条记录
			3、fetchmany(数字) 取得结果集的 几条 记录
			4、fetchall() 取得结果集的所有行
			5、close() 关闭游标对象
			属性:rowcount : 返回命令执行所影响的条数
	
	pymysql.connect --->>db ---> db.cursor() ----> 执行
posted @ 2018-11-09 14:44  IndustriousHe  阅读(402)  评论(0编辑  收藏  举报