Mysql数据库详细教程

数据库 (MySQL)概述


1. 什么是数据库

数据库就是存储数据的仓库

2. 哪些公司在使用数据库

金融机构,游戏网站,购物网站,论坛.........

3. 提供数据库服务的软件

MySQL、SQL_Server、Oracle、DB2、MongoDB、Mariadb

4. 在生产环境中,如何选择使用哪个数据库软件

1、是否开源
2、是否跨平台
	 不跨平台的:SQL_Server
3、公司类型
	 商业软件:政府部门、金融机构...(不差钱,数据安全性要求较高)
	 开源软件:游戏网站、购物网站、论坛 .......

MySQL的特点


1. 关系型数据库

特点:

    1、数据是以行和列形式存储
    2、表中每一行叫一条记录
    3、每一列叫一个字段
    4、表和表之间的逻辑关联叫关系

2. 示例

关系型数据库存储(性能低)

1、学生信息
	        姓名        年龄         班级
	        星矢         25         三班
	        水冰月       26          六班

	表2、班级信息表
	        班级         班主任
	        三班         大空翼
	        六班         松人

非关系型数据库存储(性能高,数据冗余)

{"姓名":"星矢","年龄":25,"班级":"三班"}
{"姓名":"水冰月","年龄":26,"班级":"六班","班主任":"松人"}

3. 跨平台

可以在Unix、Linux、Windows上运行数据库服务

4. 支持多种编程语言

Python、java、php .......

数据库软件、数据库、数据仓库


1. 数据库软件

提供数据库服务的软件,看得见,可操作,用来实现数据库逻辑功能

2. 数据库

数据库是一种逻辑概念,用来存储数据的仓库,侧重于存储

3. 数据仓库

从数据量上来说,数据仓库要比数据库庞大的多,主要用于数据挖掘和数据分析

MySQL安装


Ubuntu安装MySQL

安装服务端
sudo apt -get install mysql-server

安装客户端
sudo apt -get install mysql-client

Ubuntu安装软件

1、sudo apt -get update (更新/etc/apt sourse.list)
2、sudo apt -get -f install (修复依赖关系)

MySQL的启动和连接


服务端启动

sudo /etc/init.d/mysql start
sudo /etc/init.d/mysql status | stop | restart

客户端连接

mysql -h主机地址 -u用户名 -p密码
mysql -hlocalhost -uroot -p123456

# 本地登录可省略-h选项
mysql -uroot -p123456

基本SQL命令


SQL命令使用规则

1、每条命令必须以;结尾
2、SQL命令不区分字母大小写
3、使用\c终止当前命令的执行

库的管理

库的基本操作
	1.1、查看已有的库
	       show databases;
	1.2、创建库(指定字符集)
	       create database 库名 character set utf8;
	1.3、查看创建库的语句
	       show create database 库名;
	1.4、查看当前所在库
	       select database();
	1.5、切换库
	       ues 库名;
	1.6、查看库中已有表
	       show tables;
	1.7、删除库
	       drop database 库名;

库名的命名规则
	1、可以使用数字、字母、下划线,但不能为纯数字
	2、库名区分大小写字母
	3、库名具有唯一性
	4、不能使用特殊字符和mysql关键字

创建支持中文字符集的数据库

create database 数据库名称 default charset utf8 collate utf8_general_ci;

表的管理

表的基本操作
	1、创建表
	      create table 表名(
	      字段名1   数据类型,
	      字段名2   数据类型,
	      字段名3   数据类型
	      ) character set utf8;
	2、查看创建表的语句(字符集,存储引擎)
	      show create table 表名;
	3、查看表结构
	      desc 表名;
	4、删除表
	      drop table 表名;
	5、修改表名
			alter table 旧表名 rename 新表名;


练习:
1、创建库Python1
	create database python1 character set utf8;
	
2、在Python1库中创建表pymysql1并指定字符集为utf8,字段有三个,id  name  ag 数据类型自己定义
	create table pymysql1( 
		id int, 
		name varchar(10), 
		age int(3)
		) character set utf8;
	
3、查看pymysql1的默认字符集和存储引擎
	show create table pymysql1;
	
4、查看表pymysql1表的结构
 	desc pymysql1;
 	
5、删除表pymysql1
	drop table pymysql1;
	
6、删除库Python1
	drop database python1;

提示:

  • 1、所有的数据都是以文件的形式存放在数据库目录下的 /var/lib/mysql

表记录的管理(插入)

在表中插入记录
	插入单条记录
		1、insert into 表名 values(字段1值,字段2......)
		
	插入多条记录---------->values一个括号代表一条记录所有值
		2、insert into 表名(字段名1,字段名2......) values(字段1值,字段2......)(字段1值,字段2......)
		
	指定字段插入时------------>没有插入记录的字段必须可以为空值
		3、insert into 表名(字段名1,字段名2....) values(1,值2)

查询表记录
	1、select * from 表名[where 条件];
	2、select 字段名1,字段名2... from 表名[where 条件];  

表记录的管理(删除、修改)

1、删除表记录
	delete from 表名 where 条件(id=1)#delete语句后如果不加条件,会将所有记录删除
	
2、修改表记录---------->每次只能修改一条记录
	update 表名 set 字段1=1(),字段2=2 where 条件(字段1=1())
	update t1 set salary=1234567 where id=1;
    # update语句后如果不加条件,会将所有记录更新

3、mysql-批量修改表字段中的某一部分内容
	update 表名 SET 字段名 = replac(字段名, '字段值', '要修改成的值') wher ID < 200;

表字段的操作

1、语法
	alter table 表名 执行动作;
2、添加字段(add)
	alter table 表名 add 字段名 数据类型;    (加在最后)                              
	alter table 表名 add 字段名 数据类型 first;      (加在第一列)
	alter table 表名 add 字段名 数据类型 after 字段名;      (加在指定字段后)           
3、删除字段名(drop)
	alter table 表名 drop 字段名; 
4、修改字段数据类型(modify)
	alter table 表名 modify 字段名 新数据类型;                                                       
    # 修改数据类型会受到表中原有数据的限制
5、修改字段名称
	alter table 表名 change 旧字段名 新字段名 新字段数据类型
  • 练习
1、创建库 studb2
2、在库中创建表stuinfo,字段如下:
	 姓名、年龄、手机号
3、查看表结构
4、在表中第一列添加一个字段:学号
5、把手机号的数据类型改为bigint
6、在表中最后一列添加一个字段:注册时间register,数据类型为:timestamp
7、在表中学号、姓名、年龄、手机号四个字段插入2条记录
8、查询5分钟内的记录明细
	select * from studb2 where register > (now() - interval 5 minute);	

如何更改库的默认字符集

通过更改MySql的配置文件实现
	1、获取root权限(sudo -i)
	2、备份mysql的配置文件
		cd /etc/mysql/mysql.conf.d/
		cp -p mysqld.cnf mysqld.cnf.bak(备份文件)
	3、修改配置文件
		vi mysqld.cnf
		在[mysqld]下面添加:
		character_set_server=utf8
    4、重启MySql服务/重新加载配置文件(reload)
		/etc/init.d/mysql restart | force-reload

数据类型

1、数值类型

  • 整形
1int 大整形(4字节)
	不给参数时默认为11
	取值范围:0~2**32-1(42亿多)
	
2、tinyint微小整形(1字节)----------->1字节82**8-1=255
	不给参数时默认为3
		2.1、有符号(signed默认)
	    	取值范围:-128~127
	    2.2、无符号(unsigned):
	        取值范围:0~255
	        
3、smallint小整形(2字节)
	不给参数时默认为6

4、bigint极大整形(8字节)
	不给参数时默认为20
  • 浮点型
1float(4个字节,最多显示7个有效位)
	1.1、用法
		字段名 float(m,n)  m:总数位  n:小数位位数
	    float(5,2)  取值范围:-999.99~999.99
	1.2、注意
	    浮点型插入整数时会自动补全小数位
	    小数位如果多于指定位,会对下一位四舍五入
	    
2、double(8字节,最多显示15个有效位)

3、decimal(最多显示28个有效位)
	3.1、字段名 decimal(m,n)
	3.2、存储空间(将整数部分和小数部分分开存储)
		规则:将9位数字的倍数包装成4个字节
	    即:对于每个部分,需要4个字节来存储9位的每个倍数,剩余数字所需的存储空间如下表:
		
		剩余数字      		 字节
		      0                 0
		     1-2                1
		     3-4                2
		     5-6                3
		     7-9                4
	    示例:decimal(19,9) 
	    	整数部分:10/9=11  4字节+1字节
	        小数部分:9/9=10   4字节+0字节

2、字符类型

1、char(定长)
	1.1、宽度取值范围:1~255
	1.2、默认宽度位1个字节
	
2、varchar(变长)--------------->必须给定参数
	取值范围:1~65535
	   
3、char和varchar的特点
	3.1、char:浪费存储空间,但是性能高
	3.2、varchar:节省存储空间,但是性能低
	
4、text / longtext(4G) / blob / longblob 

5、字符类型和数值类型的宽度区别
	5.1、数值类型的宽度位显示宽度,仅仅用于select查询时显示,和占用的存储空间大小无关,可用zerofill查看效果				
    5.2、字符类型的宽度超过则无法存储

3、枚举类型(字段值只能在列举的范围内选择)

1、单选(最多65535个不同值)
	字段名enum(1,值2...,值n)
2、多选
	字段名set(1,值2...,值n)
3、创建表时
	插入字段值时该字段值应用双引号或单引号引起来,多个值用逗号分隔开
	字段名 values  "basketball,football,sing......"

4、日期时间类型

1、year:年 YYYY
2、date:日期  YYYYMMDD
3、time:时间  HHMMSS
4、datetime
   timestamp:日期时间  YYYYMMDDHHMMSS
	##插入记录时datetime不给值默认返回NULL
	##插入记录时timestamp不给值默认返回系统当前时间
5、示例:
	 -> create table tab2(
     -> id int,
     -> name char(15),
     -> birth_year year,
     -> birthday date,
     -> classes time,
     -> meeting datetime
     -> );
  • 练习
创建一个学校的库 school
在库中创建一个表students存储学生信息,字段如下

学号(显示宽度为3,不够用0填充)
	id int(3) zerofill,
姓名
	name char(20),
年龄(不能位负数)
	age tinyint(3) unsigned,
手机号
	Tel varchar(11),
成绩(浮点型)
	score decimal,
性别(单选)
	sex enum('man','woman','secret'),
爱好(多选) 
	hobby set('basketball','tabletinies','reading','swiming','running'),
入学时间(年月日)
	enter_school_time date

查看students的表结构
在表中随意插入一条记录
在表中的姓名、手机号、成绩三个字段插入3条记录
查看所有学生的姓名、手机号和成绩

日期时间函数

1、now()返回服务器当前时间 YYYY-MM-DD HH:MM:SS
2、curdate()返回当前日期 YYYY-MM-DD
3、curtime()返回当前时间 HH:MM:SS
4、year(时间) 返回指定时间的年份
5、date(时间)返回指定时间的日期
6、time(时间)返回指定时间的时间

日期时间的运算

1、语法格式
	select ... from 表名 where 字段名 运算符 (时间-interval 时间间隔单位)
    interval:间隔类型关键字
    时间间隔单位:
		1 day
	    1 hour | minute | year | month
2、示例:
	1、查询一天以内的记录
		select * from t11 where meeting > (now() - interval 1 day);	 

    2、查询1天以前3天以内的记录
		select * from t11 where meeting < (now() - interval 1 day) and meeting > (now() - interval 3 day); 

运算符的操作(where 条件中的)

1、数值比较&字符比较
	1、数值比较运算符:=!=>>=<<=
    2、字符比较运算符:=!=
2、示例
    1、查找sanguo表中攻击力大于200的英雄
    	select name,gongji from sanguo where gongji>200;
3、逻辑比较
	1and(两个或多个条件同时满足)
    2or(两个或多个条件有一个条件满足就可以)
4、范围内比较
	1、运算符	
		where 字段名 between 值1 and2   #值为int型
		where 字段名 in(1,2,...)
		where 字段名 not in(1,2,...)
5、匹配空、非空
	1、空:is null
	2、非空:is not null 

6、模糊比较
	1、语法格式
		where 字段名 like 表达式
    2、表达式
		1、_:匹配单个字符
		2%:匹配0到多个字符
  • 注意
1、null:空值,必须用is或者is not去匹配
2" ":空字符串,只能用=或者!=去匹配
  • 练习
1、查找攻击值在100~200之间的蜀国英雄信息
	select * from sanguo where gongji between 100 and 200 and country="蜀国";

2、查找编号为1,3,5的蜀国英雄和貂蝉的编号,姓名和国家
	select id,name,country from sanguo  where id in(1,3,5) and country="蜀国" or name="貂蝉"; 

3、查找蜀国和吴国以外的国家的女英雄信息
	select * from sanguo where  country not in('蜀国','吴国') and sex="女";

4、查找姓名为null的蜀国女英雄
	select * from sanguo where name is null and country="蜀国" and sex="女";

5、查找姓名为" "的英雄的 id 姓名和 国家
	select id,name,country from sanguo where name="";

6、名字里面至少有两个字符的记录
	select name from sanguo where name like "_%_"; 
	
7、匹配名字里除null外的所有记录
	select name from sanguo where name like "%";
	
8、名字里面有三个字符的记录
	select name from sanguo where name like "___";
	
9、匹配赵姓的所有记录
	select name from sanguo where name like "赵%";

10、通过字符串搜索库中的表:
	show tables like "%er";

SQL查询


1、总结(执行顺序)

 - select ...聚合函数 from 表名 
 - where ...
 - group by ...
 - having ...
 - order by ...
 - limit ...
  • 聚合函数------>group by 铁二角------->having 铁三角

2、order by(给查询结果排序)

1、order by 字段名 排序方式
2、排序方式
	1、ASC(默认):升序
	2、DESC:降序
3、示例
	1、将英雄按防御值从低到高排序
	select * from sanguo order by fangyu ;
	2、将蜀国英雄按攻击值高到低排序
	select * from sanguo where country="蜀国" order by gongji DESC;
	3、将魏蜀两国男英雄中名字为三个字的英雄按防御值升序排列
	select * from sanguo  where country in("蜀国","魏国") and sex="男" and name like "___" order by fangyu asc;

3、limit(放在sql语句最后面)

1、作用:限制显示查询记录的个数
2、用法
	1、limit n ——>显示n条记录
	2、limit m,n ——>从m+1条记录开始,显示n条记录
	              limit 2,3 ——>显示3,4,5三条记录

3、示例
	1、在蜀国英雄中查找防御值倒数第二名到第四名的记录
		select * from sanguo where country="蜀国" order by fangyu limit 1,3;
	2、在蜀国且名字不为空值的英雄中,查找攻击值前三名的英雄的姓名、攻击值和国家
	    select name,gongji,country from sanguo where country="蜀国" and name is not null order by gongji desc limit 3;

4、聚合函数

4.1、分类
	1、avg(字段名):求该字段的平均值
	2sum(字段名)3max(字段名)4min(字段名)5、count(字段名):统计该字段记录的个数
4.2、示例
	1、攻击力最强值
		select max(gongji) from sanguo;
	2、统计表中id 和 name两个字段分别有多少条记录
		select count(id),count(name) from sanguo;
	3、统计蜀国英雄中攻击值>200的英雄个数
		select count(*) from sanguo where country="蜀国" and gongji>200;

5、group by(分组)

5.1、作用:给查询结果进行分组
5.2、group by 字段名

1、示例:计算每个国家的平均攻击力
	select country,avg(gongji) from sanguo group by country;
2、查找所有国家中英雄数量最多的前两名的国家名称和英雄数量
	select country,count(*) from sanguo group by country order by count(*) desc limit 2;
3、注意:group by后的字段名必须为select之后的字段名,如果查询字段和group by之后的字段不一致,则必须要对该字段进行聚合处理(聚合函数)

6、having语句

6.1、作用:对查询结果进行进一步筛选
6.2、示例
	1、找出平均攻击力>105的国家的前两名,显示国家名和平均攻击力
		select country,avg(gongji) from sanguo group by country having avg(gongji)>105 order by avg(gongji) desc limit 2;
6.3、having语句通常和group by语句联合使用,用来过滤由group by语句返回的结果集
6.4、where只能操作表中实际存在的字段(desc 表名;),having操作的是由聚合函数生成的显示列

7、distinct(不显示字段的重复值)

7.1、用法
	select distinct 字段名1,字段名2... from 表名;
7.2、示例
	1、统计三国列表中一共有多少个国家
		select distinct country from sanguo;
	2、计算蜀国一共有多少个英雄 
		select count(distinct name) from sanguo where country="蜀国";
	3、注意
	    distinct处理的是distinct和from之间的所有字段,所有字段值必须全部相投才能去重

8、查询表记录时做数学运算

8.1、运算符
	+-*/%
8.2、示例:让所有英雄攻击力翻倍
	select id,name,gongji*2 as new_gj,country from sanguo;

9、约束

9.1、作用
	为了限制无效的数据插入到数据表中
9.2、约束分类
	1、默认约束(default)
	      作用:插入字段时,不给该字段赋值,使用默认值
	      格式:字段名 数据类型 default 值
	2、非空约束(not null)
	      作用:不允许该字段的值有null记录
	      格式:字段名 数据类型 not null
	3、default和not null可连用
	      字段名 数据类型 not null default 值

索引


定义

对数据库中表的一列或者多列的值进行排序的一种结构 (mysql中索引用BTREE方式)

优点

可以加快数据的检索速度

缺点

1、当你对表中的数据进行增加,删除,修改的时候,索引需要动态维护,降低了数据维护速度
2、索引需要占用物理空间

索引示例

1、开启运行时间检测
    Show variables like "%pro%";   
	Set profiling=1;
2、执行查询语句
	Select name from t1 where name="lucy1009999";
3、查看执行时间
	Show profiles;
4、在name字段创建索引
	Create index index_name on t1(name);
5、执行查询语句
	Select name from t1 where name="lucy1009999";
6、查看执行时间
	Show profiles;
  • 在数据量很大大情况下才能有明显体现

索引类型

  • 普通索引(index)
1.1、使用规则
	1、一张表中可以有多个index字段
	2、字段值可以重复,且可以为NULL
	3、经常把做查询条件的字段设置为index字段
I	4、index字段的key标志位MUL
1.2、创建index索引
	1、创建表: ... index(字段名),index(字段名));
		mysql> create table t1(
    		-> id int,
    		-> name varchar(20),
    		-> age tinyint,
    		-> index(id),
    		-> index(name)
    		-> );
	2、已有表:dreate index 索引名 on 表名(字段名) 
		create index index_age on t1(age);
1.3、查看索引
	1、desc 表名;
	2、show index from 表名;
1.4、删除index
	语法:drop index 索引名 on 表名
	drop index index_age on t1;
	#:删除普通索引只能一次一个删除
  • 唯一索引(unique)
2.1、使用规则
	1、一个表中可以有多个unique字段
	2、对应字段的值不允许重复,但可以为NULL
	3、key标志:UNI
2.2、创建
	1、创建表:
 		... unique(字段名),unique(字段名));
		Eg:... unique(tel),unique(cardnumber));

		mysql> create table t2(
    		-> tel bigint,
    		-> cardnumber bigint,
    		-> name char(20),
    		-> unique(tel),
    		-> unique(cardnumber));

	2、已有表:
		create unique index 索引名 on 表名(字段名)
	3、查看、删除(同index)
		drop index 索引名 on 表名
  • 主键索引(primary key)
&&
自增长属性(auto_increment)配合主键一起使用
1、使用规则:
	(1)一个表中只能有一个主键字段
	(2)对应字段值不允许重复,且不能为NULL
	(3)Key标志:PRI
	(4)把表中能够唯一标识一条记录的字段设置为主键,通常把记录编号的字段设置为主键
2、创建
	(1)创建表
		1... id int primary key auto_increment , ... ...)[起始自增值];
		2... id int auto_increment, ... primary 	key(id,name));  [复合主键]
		Eg:mysql> create table t3(
    			-> id int primary key auto_increment,
    			-> name varchar(20),
    			-> age tinyint
    			-> )auto_increment=100;
	(2)已有表中创建
		Alter table 表名 add primary key(字段名)(3)删除主键
		1、删除自增长(auto_increment)属性
			Alter table 表名 modify id int;
		2、删除主键
			Alter table 表名 drop primary key;
	(4)在已有表中加入自增长属性并指定起始值
		1、添加自增长属性
			Alter table 表名 modify id int auto_increment;
		2、指定起始值
			Alter table 表名 auto_increment=值;
  • 外键索引(foreign key)
1、定义
	让当前表的字段值在另一个表的范围内选择
2、语法格式
	foreign key (参考字段名)
	references 被参考表名(被参考字段名)
	on delete 级联动作
	on update 级联动作
3、示例
	表一:缴费信息表(财务)
	学号	 姓名	班级		金额
	1	唐伯虎	二班		200
	2   点秋香	二班		300
	3   祝枝山	二班		500

	表二:班级信息表(班主任)
	学号	  姓名	  金额
	1	 唐伯虎	  200
	2    点秋香	  300
	3    祝枝山	  500

	缴费信息表(财务)
	mysql> create table jftab(
	    -> id int primary key,
	    -> name varchar(20),
	    -> class varchar(7),
	    -> money int);

	班级信息表(班主任)
	mysql> create table bjtab(
	    -> stu_id int,
	    -> name varchar(20),
	    -> money int,
	    -> foreign key(stu_id) references jftab(id) on
	    -> delete cascade on update cascade
	    -> );
4、级联动作
	1、cascade:数据级联更新
		当主表删除记录或更改被参考字段值时,从表级联更新
	2、restrict(默认)
		当主表删除记录,或更改被参考字段值时,从表中有相关联记录则不允许主表操作
	3set null
		当主表删除记录或更改被参考字段值时,从表中相关联记录的字段值设置为null
	4、no action,同restrict,都是立即检查外键限制
5、删除外键限制
	alter table 表名 drop foreign key 外键名; 
6、在已有表中添加外键限制
	alter table 表名 add
	foreign key(...) references 表名(字段名)
	on delete 级联动作
	on update 级联动作
7、使用规则
	1、两张表参考字段和被参考字段数据类型要一致
	2、被参考字段必须为key的一种,通常primary key

数据导入


1、作用:

把文件系统的内容导入到数据库中

2、语法格式:

load data infile "文件名"
into table表名
fileds terminated by "分隔符"
lines terminated by "\n"

3、示例

1、把 /etc/passwd 文件中的内容导入到db3下的userinfo表
Tarena    :   x   :  1000  :   1000  : 
用户名        密码     uid       gid
tarena,,, :   /home/tarena   :   /bin/bash
用户描述        主目录         登录权限

4、操作步骤

1、在数据库中创建对应的表
2、把要导入的文件拷贝到数据库搜索路径中
	1、查看数据库搜索路径
		show variables like “secure_file_priv”;
	2、拷贝
		sudo cp /etc/passwd  /var/lib/mysql-files/
3、执行数据导入语句
	load data infile '/var/lib/mysql-files/passwd'
	into table userinfo
	fields terminated by ":"
	lines terminated by "\n";

5、练习

1、将class.csv文件导入到register表中

数据导出


1、作用

将数据库中表记录保存到系统文件里

2、语法格式

select ... from 表名
into outfile "绝对路径文件名"
fields terminated by  "分隔符"
lines terminated by "\n";

3、示例

1、把userinfo表中的用户名、密码、和uid号三个字段的值给	导出来
	mysql> select username,password,uid from userinfo
	    -> into outfile "/var/lib/mysql-files/u.csv"
	    -> fields terminated by ","
	    -> lines terminated by "\n";
2、把mysql库下的user表中user、host的值导出来,user.csv

4、注意

1、导出的内容由sql查询语句决定
2、执行导出命令时路径必须指定对应的数据库目录下

5、表的复制

1、表的重命名:alter table 表名 rename 新表名
	mysql> alter table class2 rename class3;
2、表的复制语法格式
	create table 新表名 select ... from 表名 ...;
3、示例
	(1) 复制class1表的全部记录的字段,class2
		mysql> create table class1 select * from class2;
4、只复制表结构
	create table 新表名 select ... from 表名 where false;
	mysql> create table class1 select * from class2 where false;

6、嵌套查询(子查询)

1、定义:把内层查询结果当做外层查询的条件
2、语法格式:
	sql查询语句 where 条件(sql查询语句)
3、示例
	1、把uid的值小于这个平均值得用户和uid号显示出来
		先求出uid的平均值
			select avg(uid) from userinfo;
			select username,uid from userinfo where uid<avg(uid);
		嵌套方法:
			select username,uid from userinfo where uid<(select avg(uid) from userinfo);
	2、找出每个国家攻击力最高的英雄的名字和攻击值
		select country,name,gongji from sanguo where gongji in 	( select max(gongji) from sanguo group by country);

多表查询


语法格式

mysql> select 字段名列表 from 表名列表 where 条件;

1、显示(省 市)详细信息

河北省 	 石家庄市
河北省	 廊坊市
mysql> select sheng.s_name,city.c_name from sheng,city where 	sheng.s_id=city.cfather_id;

2、显示 (省 市 县) 详细信息

select sheng.s_name,city.c_name,xian.x_name from 	sheng,city,xian where sheng.s_id=city.cfather_id and 	city.c_id=xian.xfather_id;
或
mysql> select S_name,c_name,x_name from sheng,city,xian  	where s_id=cfather_id and c_id=xfather_id;

连接查询


1、内连接

1、语法格式
select 字段名 from1 
inner join 表2 on 条件 
[inner join 表3 on 条件]
[inner join 表4 on 条件];

2、示例
	1、内连接显示省和市的详细信息
		mysql> select s_name,c_name from sheng inner join city 	on sheng.s_id=city.cfather_id;
	2、内连接显示省市县详细信息
		mysql> select s_name,c_name,x_name from sheng inner 	join city on sheng.s_id=city.cfather_id inner join xian on 	c_id=xian.xfather_id;

2、外连接

  • 1、左连接
1、定义:以左表为主显示查询结果
2、语法格式
select 字段名列表 from1
left jion 表2 on 条件
left jion 表3 on 条件
......;
3、示例
	1、显示省和市的详细信息
		select s_name,c_name from sheng left join city on s_id=cfather_id;
	2、显示省、市、县详细信息要求所有的市全部显示
		mysql> select s_name,c_name,x_name from sheng right join city on s_id=cfather_id left join xian on 	c_id=xfather_id;
  • 2、右连接
1、定义:以右表为主显示查询结果
2、语法格式
select 字段名列表 from1
right jion 表2 on 条件
right jion 表3 on 条件
......;

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


完全备份

1、命令格式
	mysqldump  -u用户名 -p 原库名 > 路径/***.sql
2、示例
	1、备份china库
		mysqldump  -uroot  -p china  >  ~/mydata/china.sql
3、原库名的表示方式
	--all-databases   备份所有库
	库名           备份单个库
	-B 库12 ...  备份多个库
	库名 表12 ... 备份指定库的指定表
4、练习
	1、备份所有库all.sql,放到mydata目录中
		tarena@tedu:~/mydata$ mysqldump -uroot -p --all-databases > all.sql 
	2、备份china库中的sheng、city、xian三张表为chinascx.sql
		tarena@tedu:~/mydata$ mysqldump -uroot -p china sheng city xian > chinascx.sql

数据恢复


1、命令格式

mysql  -u用户名  -p  目标库名  <  路径/**.sql 

2、恢复china库

1、创建空库
	create database china character set utf8;
2、恢复
	mysql  -uroot  -p  china  <  china.sql

3、从所有库的备份中恢复china一个库(–one-database)

mysql -uroot -p --one-database china < all.sql

4、注意:

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

事务和事务回滚


1、定义:一件事从开始发生到结束的整个过程
2、属性(ACID)

1、原子性:一个事务被视为一个不可分割的单元
(不可分割,要不全做,要不一步都不做)
2、一致性:数据库总是从一个已知状态转为另一个一致性状态(完整做完这一流程,转为另一状态)
3、隔离性:一个事务所做的修改在最终提交前,对其他事务是不可见的(每一个事物发生不能被其他并发事务干扰)
4、持久性:(数据一旦提交,将不能恢复到原状)

3、事务和事务回滚的应用

  • 事务应用
1、查看事务自动提交状态
	show variables like “autocommit”;
2、开启事务
	Begin;
	一条或多条sql命令
	##此时autocommit被禁用
3、终止事务
	commit;(所有语句执行成功时执行)
	rollback;(其中某一句语句执行失败则执行此语句)
  • 注意
事务回滚只针对表记录的操作:增、删、改有效,对创建	库、表的操作无效

4、案例

1、背景
	你:建行卡
	你朋友:工商卡
	你在建行自动取款机上给你朋友工商卡转5000
2、过程
	表1:CCB
	create table CCB(
		name char(15),
		money int);
		insert into CCB values(“zhuanqian”,10000);2:ICBC
	create table ICBC(
		name char(15),
		money int);
		insert into ICBC values(“shouqian”,4000);

3、mysql > begin;
	mysql >update CCB set money=5000 where name=”zhuanqian”;
	mysql >updata ICBC set money=9000 where name=”shouqian”;
	mysql >commit; 转账成功
	mysql >rollback; 转账失败

存储引擎(处理表的处理器)


基本操作

1、查看所有的存储引擎

show engines;

2、查看已有表的存储引擎

show create table 表名;
##engines=innodb

3、创建表时指定存储引擎

create table 表名(...)engine=myisam;

4、工作中常用存储引擎

InnoDB  		myisam

[mysqld]
Default-storage-engine=myisam

5、常用存储引擎的特点

1、innodb特点
	1、共享表空间
		表名.frm   表结构
		表名.ibd   表记录&索引信息
	2、支持行级锁
2、myisam特点
	1、独享表空间
		表名.frm    表结构
		表名.myd   表记录
		表名.myi    索引文件
	2、支持表级锁
3、锁
	1、加锁的目的
		解决客户端并发访问的冲突问题
	2、锁的分类
		1、锁类型
			读锁(select):加读锁后不能更改表中内容,但可	以进行查询
			写锁(互斥锁、排他锁)
		2、锁粒度
			表级锁 (myisam存储引擎支持)
			行级锁 (innodb存储引擎支持)
4、如何决定表使用哪种存储引擎
	1、执行查询操作多的表使用myisam(使用innodb浪费资源)
	2、执行写操作多的表使用innodb存储引擎

MySQL调优


1、选择合适的存储引擎

查询操作多————>myisam
写操作多——————>innodb

2、sql语句的调优(尽量避免全表扫描)

1、在select、where、order by常涉及到的字段上建立索引
2、where子句中尽量少使用 != ,否则导致全局扫描

3、尽量避免空(null)值判断,否则导致全局扫描

示例:
优化前:
select id from t1 where number is null;

优化后:
可以在number设置默认值0,确保number无null值,查询如下
select id from ti where number=0;

4、尽量避免用or来连接条件,否则进行全表扫描

优化前:
select id from t1 where id=10 or id=20;

优化后:
select id from t1 where id=10
union all
select id from t1 where id=20;

5、用模糊查询尽量避免前置%,否则全表扫描
6、尽量避免in和not in的使用,否则全表扫描

对于连续的值尽量用between和and

7、尽量避免使用select * from t1;

要用具体字段名代替*,不要用到任何字段

与Python交互


1、交互类型

Python3:
Pymysql(安装模块) : sudo pip3 install pymysql

Python2
MySQLdb(安装模块):sudo pip install mysql-python

2、connection对象

创建与数据库连接对象(调用connect()方法)
conn=pymysql.conect(参数列表)

参数列表:
1、host:主机地址,本机:"localhost"
2、user:用户
3、port:mysql端口,默认3306
4、db :数据库名
5、passwd:连接密码
6、charset:编码方式,推荐使用utf8

示例:
conn=pymysql.connect(host="localhost", user="root", port=3306, passwd="123456", db="china", charset="utf8")

3、游标对象(cursor对象)

1、作用:执行sql语句
2、创建游标对象:调用连接对象的cursor()方法
示例:cursor1=conn.cursor()
3、游标对象的方法
	1.execute(operation[,参数]) 执行sql语句
	2.close() 关闭游标对象
	3.fetchone() 获取结果集的第一条记录,返回一个元组失败返回None
	4.fetchmany(n) 获取结果集的n条记录,返回一个大元组
	5.fetchall() 获取结果集的所有记录,返回一个大元组

4、连接对象(如:conn)的方法

1、conn.close()  关闭连接
2、conn.commit()  提交到数据库执行
3、conn.rollback()  事务回滚操作
4、conn.cursor()  创建游标对象,用于执行sql语句获得结果

MySQL使用流程


1、建立数据库连接

conn=pymysql.connect(host="localhost", user="root", port=3306, passwd="123456", db="china", charset="utf8")

2、创建游标对象

cursor1=conn.cursor()

3、利用游标对象的方法操作数据库

cursor1.execute(“sql语句”)

4、提交

conn.commit()

5、关闭游标

cursor1.close()

6、关闭数据库连接

conn.close()

ER模型


Entry - Relation(实体关系模型)

1、关系
	分类
		一对一关系(11: 班长和班级
		一对多关系(1 :n): 公司和职工
		多对多关系(m :n): 学生和课程
2、ER图的绘制
	1、矩形框代表实体,菱形框代表关系,椭圆形代表属性

你可能感兴趣的:(数据库)