关系型数据库设置数据完整性有三种方式
1.实体完整性–没有冗余的记录,每条记录都是独一无二的,(不重复)
实现方式——主键/唯一索引 /唯一约束
2.参照完整性—列的数据要参照其他表中列的数据(主键)
实现方式——外键
3.域完整性----表里的数据都是有效的数据
实现方式——数据类型 /非空约束 /默认值约束/检查约束
1.创建用户
类型 | 说明 |
---|---|
基本语法 | Create user ‘用户名’@‘用户地址’ identified by ‘密码’; |
示例 | Create user ‘test’@‘192.168.10.1’ identified by ‘12345’; |
示例说明 | 创建用户,并且设置密码 |
mysql -h ip地址 -u用户名 -p
create user 'test'@'ip' identified by '密码' 创建名为test的用户
注意:创建用户不设置ip, 用%代替ip代表所有ip均可访问
2.删除用户
类型 | 说明 |
---|---|
基本语法 | drop user ‘用户名’@‘用户地址’; |
示例 | drop user ‘test’@‘192.168.10.1’; |
示例说明 | 删除用户 |
3.授予权限grant
类型 | 说明 |
---|---|
基本语法 | grant 权限 on . to ‘用户名’@‘用户地址’; |
示例 | grant 权限 on . to ‘test’@‘192.168.10.1’; |
示例说明 | 给用户权限 |
-- 给hellokitty用户授权
grant all privileges on hrs.tbemp to 'hellokitty'@'%';
-- 给hellokitty用户授权,子用户可以再次把权限授权给其他用户
grant all privileges on hrs.tbemp to 'hellokitty'@'%' with option;
4.剥夺权限(召回权限)
类型 | 说明 |
---|---|
基本语法 | revoke 权限 on . from ‘用户名’@‘用户地址’; |
示例 | revoke 权限 on . from ‘test’@‘192.168.10.1’; |
示例说明 | 收回用户权限 |
-- 创建一个名为hellokitty的新用户,并设置密码为123123
create user 'hellokitty'@'%' identified by '123123';
-- 给hellokitty用户授权
grant all privileges on hrs.tbemp to 'hellokitty'@'%';
-- 从hellokitty召回权限
revoke insert, delete, update on hrs.tbemp from 'hellokitty'@'%';
召回用户hellokitty的增删改的权限
删除用户jack
drop user jack;
create user 'jackfrued'@'%' identified by '1qaz2wsx';
grant all privileges on *.* to 'jackfrued'@'%' with grant option;
-- 索引相当于是书的目录 它可以用来加速查询(先查目录定位搜索范围)
-- 这是典型的用空间换时间的策略 所以索引要创建在用作查询筛选条件的列上
drop index idx_emp_name on tbemp;
create index idx_emp_name on tbemp (ename);
create unique index uni_emp_name on tbemp (ename);
drop index uni_emp_name on tbemp;
delete from tbdept where deptno=10;
-- start transaction;
-- 开启事务环境
begin;
-- 执行你要做的多个操作(原子性操作)
-- delete from tbemp;
-- 提交让事务生效(结束事务)
commit;
-- 回滚撤销事务(结束事务)
rollback;
视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。查询结果的快照。作为一个select语句保存在数据字典中的。通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。
create view as 创建视图
后面跟上查询语句
视图就是查询结果的快照
1.索引是什么
数据库在查询的时候,是一条一条挨着查呢。查询效率太低了。如何提高查询效率?答案就是用索引!索引相当于是书的目录,可以加速查询(先查目录定位搜索范围)数据库,如果在查询的时候,经常通过某个字段查询,那就要考虑给这个字段添加索引这是典型的用空间换时间的策略,所以索引一定要建在用作查询筛选的列上(查询经常用到的列)。
索引一定要用在经常用来做查询的列上!
缺点:
增删改查的效率会变低
2.创建索引
create index 索引名 on 表名(列名);
3.索引分类
索引类型 | 功能说明 |
---|---|
普通索引 | 最基本的索引,它没有任何限制 |
唯一索引 | 某一行启用了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都要求是唯一的 |
主键索引 | 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码 |
全文索引 | 对于需要全局搜索的数据,进行全文索引 |
4.查看索引
索引类型 | 功能说明 |
---|---|
基本语法 | show index from tablename; |
示例 | show index from user; |
示例解释 | 查看user表的索引结构 |
5.普通索引
索引类型 | 功能说明 |
---|---|
基本语法 | alter table 表 add index(字段) |
示例 | alter table money add index(username); |
示例解释 | 为money表的username字段增加索引 |
6.唯一索引
索引类型 | 功能说明 |
---|---|
基本语法 | alter table 表 add unique(字段) |
示例 | alter table money add unique(email); |
示例解释 | 为money表的email字段增加唯一索引 |
7.主键索引
索引类型 | 功能说明 |
---|---|
基本语法 | alter table 表 add primary key(字段) |
示例 | alter table money add primary key(id); |
示例解释 | 为money表的id字段增加主键索引 |
8.全文索引
索引类型 | 功能说明 |
---|---|
基本语法 | alter table 表 add fulltext(字段) |
示例 | alter table money add fulltext(content); |
示例解释 | 为money表的content字段增加唯一索引 |
9。删除索引
索引类型 | 功能说明 |
---|---|
基本语法 | ALTER TABLE table_name DROP INDEX index_name ALTER TABLE table_name DROP PRIMARY KEY |
示例 | alter table money drop index age; |
示例解释 | 为money表删除age索引 |
【注意】不要用触发器,触发器会锁表
外键约束也尽量少用,用其他手段来确保完整性
创建表时可在创建表语句后加上对应的类型即可声明索引:
primary key(字段)
index (字段)
fulltext (字段)
unique (字段)
例如:
create table user (
id int auto_increment,
name varchar(20),
primary key(id),
unique (name)
)engine=innodb default charset=utf8;
数据库里面的表可以导出来,导出来一般都是sql脚本的东西, data.sql
【注】版本问题,通过指令导出和通过不同的可视化工具导出,格式也不一样。
1、MySQL指令导出导入
这是Mysql自带的指令
(1)导出数据库==mysqldump -uroot -p 数据库名>c:\data.sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dudu |
| homework |
| hrs |
| mysql |
| performance_schema |
| school |
| srs |
| sys |
| user |
+--------------------+
10 rows in set (0.03 sec)
mysql> exit
Bye
C:\Users\Administrator>mysqldump -uroot -p school>d:\school.sql
Enter password: ******
(2)导入到MySQL==mysql -uroot -p 数据库名
mysql> create database diudiu;
Query OK, 1 row affected (0.00 sec)
mysql> quit
Bye
C:\Users\Administrator>mysql -uroot -p diudiu
2、用Nivicat导出和导入
(1)导出:
右击数据库—>转储SQL文件–>结构和数据
(2)导入
运行SQL文件
需要用到pymysql
1、检查是否安装了pymysql
(1)cmd中打开python,导入,不保存就代表已经安装
C:\Users\Administrator>python
Python 3.6.4 (v3.6.4:d48eceb,
Type "help", "copyright", "cre
>>> import pymysql
报错就安装pip install
(2).pycharm安装 pip install pymysql==0.9.1
2.用python连接Mysql
用python连接数据库实际上就相当于将python看做是客户端,去连接数据库。(可以想象用nivicat去连接数据库是一样的道理,只是一个可视化客户端一个是代码样式的客户端)
这里有几个方式需要了解
(1)连接参数:
连接数据库需要用到的参数
主机:host
端口:port
用户名:user
密码:password
指定数据库:db
指定字符集:charset
(2)
连接 connect方法,括号里要添加参数
游标执行 cursor.execute
做事务部署:
连接成功要提交 commit
不成功要回滚 rollback
最后不要忘记关闭数据库
【简单测试】
(1)启动mysql,创建一个数据库spider,表名为beautiful,设置id为自增auto_increment,添加两个字段url,content
(2)安装pymysql==pip install pymysql
(3)python语句操作
import pymysql
def main():
# 1.设置连接
db = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='123456',
db='spider',
charset='utf8')
#2. 游标
cursor = db.cursor()
# 3.写sql语句
sql = "INSERT INTO beautiful(url,content)VALUES('123','测试')"
#4. 解析sql语句
cursor.execute(sql)
# 5.提交
db.commit()
if __name__ == '__main__':
main()
这样就看到数据库的表中添加了一条数据,url为123,content为测试
【例1】
# 第一步,连接数据库,类似于指令里面的 mysql -uroot -p
# mysql -h地址 -uroot -p
'''
连接数据库需要用到的参数
主机:host
端口:port
用户名:user
密码:password
指定数据库:db
指定字符集:charset
'''
db = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='dudu', charset='utf8')
# 连接成功之后,得到一个对象
# print(db)
# 首先根据db得到游标,游标就是执行sql语句用到的东西
# cursor = db.cursor()
# 给cursor添加一个参数,让其得到数据是一个字典
cursor = db.cursor(cursor=pymysql.cursors.DictCursor)
# 准备sql语句,执行sql语句
sql = 'select * from star'
# 通过游标执行sql语句,返回结果rows是受影响的行数
rows = cursor.execute(sql)
# print(rows)
# 通过cursor的方法得到数据
# 返回一个元组,元组里面每个元素的值对应的就是数据表中每个字段对应的值
# 获取内容的时候,里面有个迭代器在记录你的位置
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchmany(5))
# print(cursor.fetchmany(5))
# 元组里面套元组
# print(cursor.fetchall())
# 打印得到所有的用户名
ret = cursor.fetchall()
for obj in ret:
print('我叫%s,我来自%s,我有%s¥' % (obj['name'], obj['province'], obj['money']))
# print(ret)
# 遍历每一个元组
# for tp in ret:
# print(tp[1])
# 最后呀,要记得关闭
cursor.close()
db.close()
实例2
import pymysql
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='dudu', charset='utf8')
# print(db)
cursor = db.cursor()
sql = 'select * from start'
# 查询语句,通过try-except,让代码更加健壮
try:
ret = cursor.execute(sql)
print(cursor.fetchall())
except Exception as e:
print(e)
finally:
cursor.close()
db.close()
实例3
import pymysql
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='dudu', charset='utf8')
cursor = db.cursor()
'''
# 准备sql语句
obj = {'name': '李云龙', 'money': '20', 'province': '河南', 'age': 36, 'sex': '男'}
# 注意,这里的引号需要加
sql = 'insert into star(name, money, province, age, sex) values("%s", "%s", "%s", "%s", "%s")' % (obj['name'], obj['money'], obj['province'], obj['age'], obj['sex'])
'''
# id = 8
# sql = 'delete from star where id=%s' % id
sql = 'update star set name="马德华" where id=12'
# 注意,没有添加进去,是因为没有提交,需要提交才能成功
try:
cursor.execute(sql)
# 提交,写入磁盘
db.commit()
except Exception as e:
print(e)
# 回滚到最初始的状态
db.rollback()
finally:
cursor.close()
db.close()
实例4
import pymysql
class MyMysql(object):
def __init__(self, host, port, user, password, db, charset):
self.host = host
self.port = port
self.user = user
self.password = password
self.db = db
self.charset = charset
# 链接数据库
self.connect()
def connect(self):
# 链接数据库和获取游标
self.db = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.password, db=self.db, charset=self.charset)
self.cursor = self.db.cursor()
def run(self, sql):
ret = None
try:
ret = self.cursor.execute(sql)
self.db.commit()
except Exception as e:
self.db.rollback()
finally:
self.close()
return ret
def close(self):
self.cursor.close()
self.db.close()
def insert(self, sql):
return self.run(sql)
def update(self, sql):
return self.run(sql)
def delete(self, sql):
return self.run(sql)
def read_one(self, sql):
ret = None
try:
self.cursor.execute(sql)
# 获取得到数据
ret = self.cursor.fetchone()
except Exception as e:
print('查询失败')
finally:
self.close()
return ret
def read_many(self, sql):
ret = None
try:
self.cursor.execute(sql)
# 获取得到数据
ret = self.cursor.fetchall()
except Exception as e:
print('查询失败')
finally:
self.close()
return ret