Navicat可视化MySQL数据库
Navicat可视化MySQL数据库
Navicat内部封装了所有的操作数据库的命令,用户只需要点击操作即可,无需书写sql语句。
navicat能够充当多个数据库的客户端。
具体操作参考百度。
pymysql模块
连接数据库以及sql语句的使用
import pymysql
# 连接数据库
conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123456',
    database = 'test1',  # 操作的库名
    charset = 'utf8'    # 编码不要加 -
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 产生一个游标对象(就是用来执行sql语句)
'''
cursor=pymysql.cursors.DictCursor将查询结果以字典的形式返回
'''
sql = 'select * from emp1;'     # sql语句
res = cursor.execute(sql)
# print(res)      # execute返回的结果就是sql语句影响的行数,该返回值一般不使用
# *********************************************************
# 获取执行命令的查询结果
# print(cursor.fetchone())    # 只拿执行这条语句的一条结果
# print(cursor.fetchall())    # 拿执行这条语句的所有结果
# print(cursor.fetchmany(2))  # 指定拿多少条结果
# *********************************************************
# 读取数据类似于光标的移动
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchall())
'''
结果:
{'id': 1, 'name': 'hp', 'sex': 'male', 'age': 18, 'dep_id': 200}
{'id': 2, 'name': 'sj', 'sex': 'female', 'age': 20, 'dep_id': 201}
[{'id': 3, 'name': 'mzx', 'sex': 'female', 'age': 22, 'dep_id': 202}, {'id': 4, 'name': 'tank', 'sex': 'male', 'age': 21, 'dep_id': 203}, {'id': 5, 'name': 'who', 'sex': 'male', 'age': 24, 'dep_id': 204}]
'''
# *********************************************************
# 控制光标的移动
print(cursor.fetchone())
print(cursor.fetchone())
# cursor.scroll(1,'relative')     # 相对光标当前位置再往后移动一位 ,relative当前位置,所有id=3的数据没有了
cursor.scroll(1,'absolute')     # 相对光标开头位置往后移动一位,absolute开头位置
print(cursor.fetchall())
'''
结果:
cursor.scroll(1,'relative') 的执行结果
{'id': 1, 'name': 'hp', 'sex': 'male', 'age': 18, 'dep_id': 200}
{'id': 2, 'name': 'sj', 'sex': 'female', 'age': 20, 'dep_id': 201}
[{'id': 4, 'name': 'tank', 'sex': 'male', 'age': 21, 'dep_id': 203}, {'id': 5, 'name': 'who', 'sex': 'male', 'age': 24, 'dep_id': 204}]
cursor.scroll(1,'absolute') 的执行结果
{'id': 1, 'name': 'hp', 'sex': 'male', 'age': 18, 'dep_id': 200}
{'id': 2, 'name': 'sj', 'sex': 'female', 'age': 20, 'dep_id': 201}
[{'id': 2, 'name': 'sj', 'sex': 'female', 'age': 20, 'dep_id': 201}, {'id': 3, 'name': 'mzx', 'sex': 'female', 'age': 22, 'dep_id': 202}, {'id': 4, 'name': 'tank', 'sex': 'male', 'age': 21, 'dep_id': 203}, {'id': 5, 'name': 'who', 'sex': 'male', 'age': 24, 'dep_id': 204}]
'''
增删改查
import pymysql
conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123456',
    database = 'test1',
    charset = 'utf8',
    autocommit = True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 增
sql = 'insert into user(username,password) values(%s,%s);'
# rows = cursor.execute(sql,('曦曦','123456'))    # 增加一条数据
rows = cursor.executemany(sql,[('曦曦','123456'),('木子曦','123456')])  #增加多条数据
print(rows)
conn.commit()   # 二次确认
# 修改
# sql = 'update user set username="hp_1" where id=1;'
# rows = cursor.execute(sql)
# print(rows)
# conn.commit()   # 二次确认
# 删除
# sql = 'delete from user where id=1;'
# rows = cursor.execute(sql)
# print(rows)
# conn.commit()   # 二次确认
# 查
# sql = 'select * from user;'
# cursor.execute(sql)
# print(cursor.fetchall())
'''
由上面代码结果可以看出(除查有结果,其余都没有结果)
    增删改-涉及到操作数据的修改
    1. 需要二次确认  conn.commit()
    2. 如果不想二次确认,在连接数据库加入    autocommit = True
'''
sql注入问题
'''
利用语法的特性,通过书写特定的语句实现固定的语法
MySQL利用MySQL的注释语法
select * from user where username='hp' -- 516515' and password='';
或者
select * from user where username='xxx' or 1=1 -- 215535' and password='';
'''
在日常生活中很多软件在注册的时候都不能包含特殊的符号,因为怕你构造出特定的语句入侵数据库
# 解决办法:
'''
铭感的数据不要自己做拼接,交个execute帮你拼接即可
'''
import pymysql
# 连接数据库
conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123456',
    database = 'test1',  # 操作的库名
    charset = 'utf8'    # 编码不要加 -
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('>>>:').strip()
password = input('>>>:').strip()
sql = "select * from user where username=%s and password=%s;"
# 不要手动拼接数据,先用%s占位之后将需要拼接的数据直接交个execute方法即可
rows = cursor.execute(sql,(username,password))  # 自动识别sql里面的%s用作后面元组里面的数据替换
#print(sql)
if rows:
    print('登陆成功')
    print(cursor.fetchone())
else:
    print('账号或密码错误!')
视图(基本不使用)
什么是视图
视图就是通过sql语句查询得到的一张虚拟表保存下来,下次可以直接使用。
其实视图也是表。
为什么要用视图
如果频发的操作一张虚拟表(拼表组成的),可以制成视图,以便后续操作。
如何制作视图
# 固定语法
create view 表名 as 虚拟表的查询sql语句
# 具体操作
create view employee as
select * from emp1 inner join dep on emp1.dep_id=dep.id;
注意
'''
1 创建视图在硬盘上只会有表结构,没有表数据(数据还是来源于原来的表)
2 视图一般只用来查询里面的数据,不要修改。修改可能会影响原来表的数据。
'''
触发器(了解)
在满足对表数据进行增、删、改的情况下,自动触发的功能
使用触发器可以帮助我们实现监控、日志等。
触发器可以在六种情况下自动触发,增前、增后、删前、删后、改前、改后。
基本语法
create trigger 触发器名字 before/after insert/update/delete on 表名 for each row
begin
	sql语句
end
# 具体使用 针对触发器的名字 通常需要做到见名知意
# 针对增(其他类似)
create trigger tri_before_insert_t1 before insert on t1 for each row
begin
	sql语句
end
create trigger tri_after_insert_t1 after insert on t1 for each row
begin
	sql语句
end
修改MySQL默认的语句结束符
delimiter $$	将默认的结束符由;改为$$	只作用于当前窗口
实现触发器
# 模拟错误日志功能
# 创建表
create table cmd (
	id int primary key auto_increment,
    user char(32),
    priv char(10),
    cmd char(64),
    sub_time datatime,#提交时间
    success enum('yes','no')#0代表执行失败
);
create table errlog (
	id int primary key auto_increment,
    err_cmd char(64),
    err_time datatime
);
'''
cmd表中记录succes字段是no就触发触发器的执行errlog表中的插入数据
NWE指代的是一条条数据对象,NEW.success指的是cmd表中的success字段
'''
# 创建触发器
# 修改结束符防止if语句错误
delimiter $$
create trigger tri_after_insert_cmd after insert on cmd
for each row
begin
	if NEW.success = 'no' then
    insert into errlog(err_cmd,err_time)
    values(NEW.cmd,NEW.sub_time);
    end if;
end $$
delimiter ;
# 往cmd 表插入数据
# NOW()获取当前时间
insert into cmd(user,priv,cmd,sub_time,success)
values
	('hp','0010','ls -l /etc',NOW(),'yes'),
    ('hp','0010','cat /etc/passwd',NOW(),'no'),
    ('hp','0010','useradd xxx',NOW(),'no'),
    ('hp','0010','ps aux',NOW(),'yes');
# 删除触发器
drop trigger tri_after_insert_cmd;
事务
事务的概念
什么是事务:
开启一个事务可以包含多条sql语句,这些sql语句要么同时成功,要么同时失败。
事务的作用:
保证对数据的安全性。
事务的四大特性:
'''
简称ACID
A:原子性
	一个事务是一个不可分割的单位,事务中包含的诸多操作
	要么同时成功要么同时失败
C:一致性
	事务必须是使数据库从一个一致性的状态变到另外一个状态
	一致性跟原子性密切相关的
I:隔离性
	一个事务的执行不能被其他事务干扰。
	一个事务内部的操作及使用到的数据对并发的其他事务是隔离的,并发执行的事务也是互不干扰。
D:持久性(永久性)
	一个事务一旦提交成功执行成功,那么它对数据中数据的修改是永久的,接下来的其他操作或故障不应该对其有任何影响。
'''
使用事务
# 事务相关的关键字
# 1. 开启事务
start transaction;
# 2. 回滚(回到事务执行之前的状态)
rollback;
# 3. 二次确认(确认之后无法回滚)
commit;
'''模拟转账功能'''
create table user(
	id int primary key auto_increment,
    name char(16),
    balance int
);
insert into user(name,balance) values
('hp',1000),
('sj',1000),
('mzx',1000);
# 1 开启事务
start transaction;
# 2 书写多条sql语句
update user set balance=900 where name='hp';
update user set balance=1090 where name='sj';
update user set balance=1010 where name='mzx';
# 3 取消或确认(二选一)
rollback;
or
commit;
存储过程
存储过程类似于python中的自定义函数
它内部包含了一系列的可以执行的sql语句,存储过程存放于MySQL服务端中,可以直接通过调用存储过程触发内部SQL语句的执行。
基本使用
create procedure 存储过程的名字()
begin
	sql代码
end
#调用
call 存储过程的名字();
三种开发模式
第一种
'''
应用程序:程序员写代码开发
MySQL:提前编写好存储过程,供应用程序调用
好处:开发效率提升,执行效率提升
缺点:考虑到人为因素、跨部门沟通的问题,后续的存储过程的扩展性差。
'''
第二种
'''
应用程序:程序员写代码开发,设计到数据库操作也是自己动手
好处:扩展性高
缺点:开发效率低,编写sql语句太过繁琐,后续还要对SQL语句优化。
'''
第三种
'''
应用程序:只写程序代码,不写sql,基于别人写好的操作MySQL的python框架直接调用操作		ORM框架
好处:开发效率比上面两种情况都要高
缺点:语句的扩展性差,可能会出现效率低的问题
'''
总结:第一种基本不用,一般都是使用第三种,出现效率问题再动手写sql语句。
演示
delimiter $$
create procedure p1(
	in m int,	# in只进不出	m不能返回出去
    in n int,
    out res int	# out该形参可以返回出去
)
begin
	select name from user where id>m and id < n;
    set res = 666; # 将res变量修改 用来标识当前的存储过程代码确实执行
end $$
delimiter ;
# 针对形参res 不能直接传数据,应传一个变量名
# 定义变量
set @ret = 10;
# 查看变量对应的值
select @ret;
# 调用
call p1(1,3,@ret)
在pymysql中调用存储过程
import pymysql
# 连接数据库
conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123456',
    database = 'test1',  # 操作的库名
    charset = 'utf8'    # 编码不要加 -
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 调用存储过程
cursor.callproc('p1',(1,3,10))
'''
传递值的过程
@_p1_0=1
@_p1_1=3
@_p1_2=10
'''
# print(cursor.fetchall())
cursor.execute('select @_p1_2;')
print(cursor.fetchall())
函数
与存储过程是有区别的,存储过程是自定义函数,这个函数类似于内置函数。
例如:
('hp','0010','ls -l /etc',NOW(),'yes')
NOW()就是内置函数
流程控制
# if 判断
delimiter $$
create procedure proc_if()
begin
	declare i int default 0;
    if i = 1 then
    	select 1;
    elseif i = 2 then
    	select 2;
    else
    	select 7;
    end if;
end $$
delimiter ;
# while循环
delimiter $$
create procedure proc_while()
begin
	declare num int;
    set num = 0;
    where num < 10 do
    	select
        	num ;
        set num = num + 1;
    end while;
索引
索引:就是一种数据结构,类似于书的目录。意味着查询数据的时候先找目录再找数据,从而提升查询速度降低IO操作。
索引在MySQL中也叫" 键 ",是存储引擎用于快速查找记录的一种数据结构。
- primary key
 - unique key
 - index key
 
注意:foreign key 不是用来加速查询用的。
上面的三种key ,前面两种除了加快查询速度还具有约束条件,而最后一种index key没有任何约束条件,只是用来加快查询速度。
本质
通过不断的缩小查询数据的范围筛选出最终的结果,同时将随机事件(整体查询)变成顺序事件(先找目录,再找数据)。
有了索引机制,总是用一种固定的方式查找数据。
一张表中可以有多个索引(多个目录)
缺点
'''
1 当表中有大量数据存在的前提下 创建索引速度会很慢
2 在索引创建完毕之后 对表的查询性能会大幅度的提升,但是写的性能也会大幅度的降低
'''
索引不要随意的创建
b+树
'''
只有叶子节点存放的是真实的数据,其他节点存放的是虚拟数据(仅仅是用来指路的)
树的层级越高查询数据所需的步骤越多(树有几层查询的步骤就有几步)
一个磁盘块的存储是有限制的
	建议使用id作为索引,是因为占的空间少,一个磁盘存储的数据多从而降低树的高度,减少查询次数
'''
聚集索引(primary key)
聚集索引指的就是主键
Innodb 只有两个文件,直接减主键存放在idb表中
MyIsam 三个文件,单独将索引存在一个文件中
辅助索引(unique,index)
查询数据的时候不可能一直使用主键,也可能用到其他字段,那么无法使用聚集索引,这个时候,可以根据情况使用辅助索引。
'''
叶子节点存放的数据对应的主键值
	先按照辅助索引拿到数据的主键值,
	再去主键的聚集索引查找数据。
'''
覆盖索引
在辅助索引的叶子节点已经达到所需的数据,这种现象叫做覆盖索引。
# 覆盖索引,给name 设置辅助索引
select name from user where name='hp';
# 非覆盖索引
select balance from user where name = 'hp';
												
											Navicat可视化MySQL数据库的更多相关文章
- (转)如何将 Excel 文件导入到 Navicat for MySQL 数据库
		
场景:工作中需要统计一段时间的加班时长,人工统计太过麻烦,就想到使用程序实现来统计 1 如何将 Excel 文件导入到 Navicat for MySQL 数据库 Navicat for MySQL ...
 - Navicat for MYSQL 数据库手动同步方法
		
Navicat for MYSQL 数据库手动同步方法 数据库同步有两种类型,一是结构同步,一般是数据库表增删,或是表中字段的增删:二是数据同步,即是表里面的记录的增删. 现假设我要让本地数据 ...
 - navicat连接MySQL数据库出现Authentication plugin 'caching_sha2_password的问题
		
1.以管理员身份运行cmd终端,cd 到mysql安装目录的bin文件夹下面 输入mysql -u root -p,回车键后输入密码登录mysql 依次输入一下三条命令: ALTER USER 'ro ...
 - Navicat连接MySQL数据库的一些问题与解决方案
		
前言 安装MySQL数据库与Navicat并不算难事,关键是怎么让他们工作花费了我整整一天的时间,最终才把弄好.遇到各种各样的问题,上网看了大量博客,发现很多博客都是直接copy或者并不能非常好的解答 ...
 - dinner 后台 nodemon 部署 Koa (关闭everything 安装或排除node_modules) # mysql 没开192.168.x.x 需要设置一下 #Navicat Premium,mysql 数据库版本有要求:mysql-5.7.17.msi 对??的支持
		
tip1:新建数据库 记得选 字符集和排序规则 utf8 -- UTF-8 Unicode utf8_general_ci 后台链接部分 1. 全局管理员安装 nodemon,后台热部署(右键 管理员 ...
 - navicat导入mysql数据库sql时报错
		
今天运维的一个项目需要进入数据库修改下数据,MYSQL的数据库,我先导出了一份数据结构和数据,然后进行修改,改完后发现项目报错了...粗心大意哪改错了,赶紧恢复数据库,结果导入SQL时报错了,当时心凉 ...
 - 用Navicat连接MySQL数据库出现1251错误:密码方式错误
		
原因:因为MySQL8.0是最新版密码保存方式,而图形化数据库管理工具还是原先的密码保存方式. 解决方式: 用CMD命令号方式进入MySQL use mysql: ALTER USER 'root'@ ...
 - navicat premium 的使用——navicat 连接MySQL数据库
		
最近,在学习navicat premium这款第三方软件,他是一个三方数据库管理软件,在前一段时间实习的时候,我使用这款软件调用过服务器上的数据库,不过,当时并没有仔细研究,再次遇到这个软件,我决定仔 ...
 - Navicat连接mysql数据库2003-Can't connect to Mysql server on 'xxx' (10060 "Unknown error")
		
使用root账号连接MySQL 1,登录 mysql -u用户名 -p 回车后输入密码 2, use mysql 3,输入下面命令,显示root为localhost本地登 ...
 
随机推荐
- Android 动态控制OptionMenu的显示与隐藏
			
在有些场景下,可能需要动态的显示和隐藏optionmenu,可以这样实现:如果在activity中默认实现了方法: onCreateOptionsMenu(Menu menu) 那么该OptionMe ...
 - MySQL8.0官方文档学习
			
InnoDB架构 下面的架构里只挑选了部分内容进行学习 内存架构(In-Memory Structures) Buffer Pool Buffer Pool是内存中的一块区域,InnoDB访问表和索引 ...
 - Mybatis + js 实现下拉列表二级联动
			
Mybatis + js 实现下拉列表二级联动 学习内容: 一.业务需求 二.实现效果 三.代码实现 1. province_city.jsp 2. TwoController 2. Province ...
 - css实现超出部分显示省略号
			
/* 显示一行,省略号 */ white-space: nowrap; text-overflow: ellipsis; overflow: hidden; wo ...
 - python——如何import包目录
			
文件位置 文件所在位置包括 , 源根目录的位置 该文件位置(也可以叫相对位置). 导入包的时候会从文件位置进行查找,并导入. 导入包 1. 什么是包? pycharm中包的图片 其中文件夹上有个圆点的 ...
 - Java 使用-安装
			
Java 使用-安装 官方网站 JDK 下载地址 JDK 历史版本 参考资料 CentOS7系统卸载自带的OpenJDK并安装SUNJDK CentOS7卸载 OpenJDK 安装Sun的JDK8 安 ...
 - ajax - xhr level2新特性 json等众多内容
			
1. 今天的内容其实挺多的,我们慢慢来说.首先第一个是xhr的基本使用,什么是xhr? XMLHTTPRequest是浏览器提供的js对象,可以请求服务器上的数据资源,包括我们前面一直用的jq里面的三 ...
 - C# 静态常量(const)动态常量(static、readonly)用法区别
			
C# 常量的命名方法 一个低级错误 readonly.const 代码 使用方式 支持类型 维护性 性能比较 优先使用 C# Static 与 Java Static C# Const 与 Java ...
 - NodeJs学习日报day7——简单中间件
			
const express = require('express') const app = express() const mw = function(req, resp, next) { cons ...
 - uniapp-uni.setNavigationBarColor 动态修改顶部背景颜色
			
uni.setNavigationBarColor({ frontColor: '#ffffff', backgroundColor: "#3583ff" })