关系型数据库(MySQL)
在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一
python连接mysql
conn = pymysql.connect(host=‘root‘)
port=3306,user=‘root‘
passwd=‘1234‘,db=‘user‘,charset=‘utf8mb4‘ # 声明mysql连接对象
cursor=conn.cursor(cursor=pymsql.cursors.DictCursor) # 查询结果以字典的形式
cursor.execute(sql语句字符串) # 执行sql语句
conn.close() # 关闭链接
mysql基础
1.安装
linux中:
1.sudo apt-get install
mysql-server
2.修改配置文件
3.启动:sudo service mysql start(重启->restart)
4.查看进程中是否有:ps ajx | grep mysql
5.停止:sudo service mysql stop
6.mysql命令行的安装:mysql命令行的安装:sudo apt-get install mysql-client
Windows中:
1.下载mysql 5.7.msi
2.更改系统环境变量
3.更改配置文件
4.首先打开mysql服务器
5.开启mysql服务:net start mysql
2.配置环境
本机mysql
Windows中修改初始密码
命令为:mysql -u root -p;
use mysql
updata user set
authentication_string=password("123456")
where
user="root";
flush privileges;
updata user set
password_expired="N"where
user="root" 再次启动:mysql -u root -p
建立用户
本地登录:create user “u1"@"localhost"indentified
by"123“;
任意都可以登录:create user ”u2“@”%“identified by "123"
具体主机登录:create user ”u4“@”172.16.12.24“identfied by "123";
Navicat
使用步骤
1.连接本机的mysql
2.先创建数据库
3.再创建表
3.表的增删改查
0.数据库操作
创建数据库:create database testdb2 charset
utf8;
展示数据库:show databases
1.增加
为当前表增加一个字段:alter table stu add gender
char(4);
增加数据:insert into 表名values(0,"测试");
2.删除
1.drop
删除整张表:drop table 表明;
删除表中的列:alter table 表名 drop column 列名;
2.delete
删除表里的所有数据:delete from 表名;
删除表里的一条数据:delete from 表名 where id=1
3.truncate
删除所有数据:truncate table 表名
4.删除总结
彻底删除一张表:drop
删除一张表的记录,保留该表:truncate
删除一张表的所有数据:delete
(truncate是释放数据页,包括记录,而delete每删除一行需要在日志中记录一行)
3.修改
增加一个字段:alter table 表名 add 字段名
字段类型(alter table user
add image varchar (100) comment "图片路径”after birthday)
修改表名:alter table 表名 rename to 新的表名
修改列名:alter table 表名 change 字段
新字段名 类型
update:update表set列where列条件;是对表内的数据进行操作
update和alter的区别:alter是指修改表的结构,update修改表的数据
4.查询
单表查询
查询该表的所有值:select * from 表名
使用as给字段起别名:select column as 别名 from 表名
按某种条件进行查询:select * from 表名 where 条件
范围查询,in里面是范围:select * from students where id in(数字)
查询某字段信息,按升序or降序排列:select 列名 from 表名 order by 字段名 asc|desc;
聚合函数:
查询学生总数:select count(*)from students;
查询此列的和:select sum(字段名)from 表名 where 条件
查询某条件下某字段的平均值:select avg (字段名) from 表名 where 条件
分组+聚合:
查询当前性别的种类并进行分组:select gender from students
group by gender;
查询结果并将每个集合进行分组:select
gender,group_concat(name)from student
分别统计性别为男/女的人平均年龄数:select gender,avg(age) from students group by gender;
查询性别总数>2的数量并进行分组:select gender,count(*) from student group by gender having
count(*)>2;
查询前3行男生信息:select * from students where gender=1 limit 0,3;
多表查询
交叉连接:
获得的是两个表的笛卡尔积:select * from A,B
内连接:
显式内连接:select * from A inner join B on 条件;
隐式内连接:select * from A,B where 条件;
实例:使用内连接查询班级表与学生表,取AB得交集- select * from students inner join
classes on students.cls_id = classes.id;
左连接:
通式:select * from A left join B on A.id =
B.user_id
实例:select * from students as s left join
classes as c on s.cls_id = c.id
右连接:
通式:select * from A right join B on A.id =
B.user_id
实例:select * from students as s right join
classes as c on s.cls_id = c.id;
5.数据库优化方案
1.避免使用select*
2.固定长度在前面
3.内存代替表,如:性别等
4.读写分离
5.分库
6.分表-水平分表-垂直分表
7.命中索引
8.组合索引代替索引合并
9.尽量使用短索引
10.如果取一条数据时,使用limit 1:select id , name from tb where name = "limit 1"
11.禁止使用子查询,遇到使用子查询的情况,尽量使用join代替
12.避免使用大事务,使用短小的事务
13.减少锁等待和竞争
$$数据库高级
视图
简单来说,视图就是呈现给用户数据的一个虚拟表,只能查看,不会对原表产生任何影响
触发器
触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助,应用在数据库端确保数据的完整性。
触发器中的两个限制:
触发程序不能调用将数据返回客户端的存储程序,但是允许存储程序通过参数将数据返回触发程序;
不能在触发器中使用以显式和隐式方式开始或结束事务的语句;
显示:用COMMIT命令直接完成的提交为显式提交
隐式:用SQL命令完成的提交为隐式提交
执行过程:
触发器是行触发的,每次增加,修改都会触发进行处理,所以尽量少编写复杂的触发器,能提升性能优化
事务
事务的概念:事务是一组不可分被分割的SQL语句集合,如果有必要,可以撤销
事务的四大特性:
原子性(atomicity):事务是由一个或一组相互关联的SQL语句组成,这些语句被认为是一个不可分割的单元;
一致性(consistency):对于数据库的修改是一致的,即多个用户查的数据是一样的;
隔离性(isolation):事务之间不会相互影响;
持久性(durability):提交了这个事务之后对数据的修改更新就是永久的,即事务执行成功后必须全部写入磁盘;
索引
定义:每个表至少支持16个索引,总索引长度至少为256字节。大多数存储引擎有更高的限制。
一个表的索引,就好比一本书的目录,有了目录,查询速度自然会大大加快。
搜索的索引列,不一定是所要选择的列:意思是说,如果索引在where子句后,会比select关键字的选择列表中要好很多;
使用唯一索引:索引的列的基数越大,索引的效果越好,例如:存放出生日期的列具有不同值,很容易区分各行;
使用短索引:如果对字符串列进行索引,应该制定一个前缀长度,这样搜索起来更快捷;
使用最左前缀:在创建一个n列的索引时,实际是创建了MySQL可利用的n个索引。
多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。
不要过度索引
存储过程:定义;是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,经由用户调用;
Mysql的语法规范
² 不区分大小写
² 每条命令分号结尾;
² 命令根据需要进行缩进或换行;
² 注释:#注释文字(单行);--注释;多行注释:/注释文件/;
² mysql配置文件,my.ini(如果改了配置文件需要重启服务)
创建数据库并插入数据
创建一个名为 mysql_shiyan
的数据库,其中有两张表 employee
和 department
准备:在Linux系统上配置好Mysql,打开MySQL并使用root登录
# 打开 MySQL 服务
sudo service mysql
start
#使用 root 用户登录,密码为空
mysql -u root
新建数据库:
# 创建数据库
CREATE DATABASE
mysql_shiyan;
# 查看数据库
show database;
连接使用数据库:
# 使用数据库
use mysql_shiyan;
# 查看数据库中有几张表
show table
新建数据表:
# 新建一张表 employee,包含ID,姓名 和电话信息
CREATE TABLE employee (id
int(10),name
char(20),phone int(12));
插入数据:
# 通过 INSERT 语句向表中插入数据,语句格式为:
INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1,值2,值3);
# 向 employee 中加入
Tom、Jack 和 Rose
INSERT INTO employee(id,name,phone) VALUES(01,‘Tom‘,110110110);
INSERT INTO employee VALUES(02,‘Jack‘,119119119);
INSERT INTO employee(id,name) VALUES(03,‘Rose‘);
有的数据需要用单引号括起来,比如 Tom、Jack、Rose 的名字,这是由于它们的数据类型是 CHAR 型。此外 VARCHAR,TEXT,DATE,TIME,ENUM 等类型的数据也需要单引号修饰,而 INT,FLOAT,DOUBLE等则不需要。
第一条语句比第二条语句多了一部分:(id,name,phone) 这个括号里列出的,是将要添加的数据 (01, ‘Tom‘, 110110110) 其中每个值在表中对应的列。而第三条语句只添加了 (id,name) 两列的数据,所以在表中Rose的phone为NULL。
CHAR 和 VARCHAR 的区别: \
CHAR的长度是固定的,而VARCHAR的长度是可以变化的,比如,存储字符串
“abc",对于 CHAR(10),表示存储的字符将占 10 个字节(包括 7 个空字符),而同样的 VARCHAR(12) 则只占用4个字节的长度,增加一个额外字节来存储字符串本身的长度,12 只是最大值,当你存储的字符小于 12 时,按实际长度存储。
ENUM和SET的区别: ENUM类型的数据的值,必须是定义时枚举的值的其中之一,即单选,而SET类型的值则可以多选。
RDBMS
即关系数据库管理系统(RelationalDatabaseManagementSystem)的特点:
1、数据以表格的形式出现
2、每行为各种记录名称
3、每列为记录名称所对应的数据域
4、行和列组成一张表单
5、若干的表单组成database
[client]#设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
port=3306#设置3306端口
basedir=C:\\web\\mysql-8。0。11#设置mysql的安装目录
#设置mysql数据库的数据的存放目录,MySQL8+不需要以下配置,系统自己生成即可,否则有可能报错
#datadir=C:\\web\\sqldata
max_connections=20#允许最大连接数
character-set-server=utf8#服务端使用的字符集默认为8比特编码的latin1字符集
default-storage-engine=INNODB#创建新表时将使用的默认存储引擎
日期和时间
类型 |
大小(字节) |
范围 |
格式 |
用途 |
DATE |
3 |
1000-01-01/9999-12-31 |
YYYY-MM-DD |
日期值 |
TIME |
3 |
‘-838:59:59‘/‘838:59:59‘ |
HH:MM:SS |
时间值或持续时间 |
YEAR |
1 |
1901/2155 |
YYYY |
年份值 |
DATETIME |
8 |
1000-01-0100:00:00/9999-12-3123:59:59 |
YYYY-MM-DDHH:MM:SS |
混合日期和时间值 |
TIMESTAMP |
4 |
1970-01-0100:00:00/2038 |
YYYYMMDDHHMMSS |
混合日期和时间值,时间戳 |
MYSQL存储引擎
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
MySQL查询优化
mysql查询优化,1万条数据30秒;
1、 表的主键、外键必须有索引;
2、 数据量超过300的表应该有索引;
3、 经常与其它表进行连接的表,在连接字段上应该建立索引;
4、 经常出现where子句中的字段,特别是大表的字段,应该建立索引;
5、 索引应该建在选择性高的字段上;
6、 索引应该建在小字段上,对于大的字段甚至超长字段,不要建索引;
7、 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替;
8、 频繁进行数据操作的表,不要建立太多的索引;
9、 删除无用的索引,避免对执行计划造成负面影响;
MySQL慢查询
MySQL的慢查询,全名是慢查询日志 ,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阈值的语句;
具体环境中,运行时间超过long_query_time的值的SQL语句,则会被记录到慢查询日志中。
long_query_time的默认值为10,意思是记录运行10秒以上的语句。默认不开启,调优时候开启,会对性能有一定影响,支持将日志文件写入文件和数据表。
原文地址:https://www.cnblogs.com/qingaoaoo/p/12326072.html