Mysq基础入门和Python交互

一、Mysql相关介绍:

  1. 数据库分为关系型数据库和非关系型数据库;
  2. mysql属于关系型数据库
  3. 使用sq语句操作数据库
    1. dql:数据查询命令
    2. dml:数据操作命令, 增删改
    3. ddl: 数据定义命令: 创建表、数据库, 删除表,数据库

4、mysql配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf

(1) 常用配置:

bind-address 表示服务器绑定的ip,默认为127.0.0.1

Port 表示端口,默认为3306

Datadir 表示数据库目录,默认为/var/lib/mysql

general_log_file 表示普通日志,默认为/var/log/mysql/mysql.log

log_error 表示错误日志,默认为/var/log/mysql/error.log

5、数据类型与约束:

    1.    - int 整数,bit 位 (0,1)
    2.    - dicemal : 浮点数
    3.    - varchar,char : 字符型
    4.    - datetime : 日期时间型
    5.    - enum: 枚举类型
  1. 数据约束:
    1. -- int unsigned 无符号整形
    2.     -- auto_increment 表示自动增长
    3.     -- not null 表示不能为空
    4.     -- primary key 表示主键
    5.     -- default 默认值
    6.     -- create table 数据表名字 (字段 类型 约束[, 字段 类型 约束]);

二、sql基本使用:

登录:mysql -uroot -ppassword

登出:exit/quit

版本:select version();

时间:select now();

当前库:select databas();

All库:show databases;

建库:create database db_name charset=utf8;

切换库:use db_name;

删库:drop database db_name;

All表:show tables;

建表:create table table_name(数据类型约束+数据约束条件)

表构:desc table_name;

建表/库句:show create table/database table_name/db_name;

修改表结构:alter table set add/change/drop/modify ...

删表:drop table table_name;

Insert:insert into table_name(字段) values(对应值);/insert into table_name values(所有字段值);

Delete:delete from table_name where name=”张三”;

Update:update table_name set ...(update t_students set gender='男' where id=1;)

Select:select * from table_name;

数据库备份还原:

备份:mysqldump –uroot –p 数据库名 > python.sql;
恢复:mysql -uroot –p 新数据库名 < python.sql

 

三、sql高级用法

 

使用as给表或者查询字段起别名:(as xxx)

表: Select a.a,b.a from A as a,B as b where a.c=b.c;

字段: Select name as “名字”,type as “类型” from message;

去重:(distinct )

select distinct type from message;

条件查询:( > 、< 、>=、<=、=、!=、and、or、not )

Select * from student where age < 18;

模糊查询:(%:表示任意字符 _:表示一个字符)

Select * from student where name like %杰%;

范围查找:in(); / between ... and ...

Select * from student where id in(1,3,5);

空判断:null / is not null

Select * from student where name is null;

select * from students where height is not null;

select * from students where not (height is null);

排序:order by desc/asc

Select * from student order by age,height desc;

聚合函数:sum():求和 max():最大值 min():最小值 count():统计 avg():平均

Select count(*) from student;

select max(height)  from students  where gender='女';

select sum(age)  from students;

select min(height)  from students;

分组:group by:难点

按照性别分组,查询所有的性别:

   select distinct gender from students;

   select gender from students group by gender;

查询同一类型等这种字眼很明显是要分组查询

 

group by + 聚合函数:

查询每组性别的平均年龄

select gender, avg(age) from students group by gender;

查询每种性别中的平均年龄avg(age), 最大年龄,平均身高,最高身高

select gender, avg(age),max(age),avg(height),max(height) from students group by gender;

 

Having:条件表达式,对分组后的数据进一步筛选:

 

除了男生以外的分组的人数

select gender, count(*) from students group by gender having gender!='男';

按性别分组,分别统计出平均年龄超过30岁的组的性别以及姓名 having avg(age) > 30

select gender,group_concat(name) from students group by gender having avg(age)>30 ;

 

分页:limit

select * from 表名 limit [start,] count(start为查询的起始位置,count为限制查询的数量)

-- 查询前5个数据

   select * from students limit 5;

   select * from students limit 0,5;

内链接:inner join ... on   

select * from students inner join classes on students.cls_id=classes.id;  

左连接:left join ...  on

select s.name as '姓名',c.name as '班名' from students as s left join classes as c on s.cls_id=c.id;

右连接:right join ...  on

select * from classes as c right join students as s on s.cls_id=c.id;

 

子查询:子查询结果可以为:标量、一列、一表

select * from students where height>(select avg(height) from students);

select * from students where cls_id in (select id from classes);

select name from (select * from students where id<6) as s  where gender='男';

四、外键

修改表增加外键:

alter table goods add foreign key(brand_id) references goods_brands(id);

Add foreign key (外键名称) references 外键所在表(外键所在表ID【此时这个外键是这个表的主键】)

创建表的同时设置外键: (注意 goods_cates【原表】 和 goods_brands【外键表】 两个表必须事先存在):

Create table table_name(id int unsigned  primary key auto_increment not null,

Name varchar(20) not null,

Foreign key(type_id) referrnces table_type(id)

Foreign key(外键名称【外键表的id,本表的外键】) referrnces 外键表(外键表ID)

);

取消外键约束:

  1. 可以先查看创建表的语句

show create table goods;

  1. 删除外键约束

alter table goods drop foreign key goods_ibfk_1;

  1. 面试

在目前主流的数据库设计中,越来越少使用到外键约束

原因: 会极大的降低表更新的效率

如何替代:  '通过外键约束实现数据有效性验证'

解决思想:  可在数据录入时验证(表示层,ui层),或者在业务层面(python代码)去验证,而不要在数据库层面去验证。

五、python和mysql交互:

  • Python操作MySQL步骤(重点)
  1. 导包import pymysql;

import pymysql

  1. 创建Connection连接对象
Connection=pymysql.connection(host='IP',user='root',password='password',port=3306,database='db_jingdong', charset='utf8')
  1. 通过Connection连接对象创建游标
Cursor = connection.cursor();
  1. 通过游标执行sql语句
Cursor .execute(sql,args)

这里返回的是增删改查被操作的数据;

如insert即为增加的那条记录

Update即为更新的这条记录

返回的数据类型由执行的语句决定

Rowcount:影响的行数

  1. 通过游标取得执行结果

。。。

  1. 依据业务处理取得的结果

。。。

  1. 关闭游标
Cursor.close();
  1. 关闭连接
Connection.close();

最终目标:

编写python代码实现对数据库的增删改查

 

 

 

 

 

  • Mys提高

视图:

定义:通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);

作用:

重用sql语句,简化用户操作

更清晰表达数据

当数据库重构时,降低对用户(程序)的影响

视图能够对机密数据提供安全保护

 

使用:

创建:create view 视图名称 as select语句;

查看:show tables;

使用:select * from v_goods;

删除:drop view 视图名称;

 

事务:

定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

特征:

原子性(atomicity)

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性

一致性(consistency)

数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,在没有执行事务前A账户与B账户中,余额总数的一致性是5000元,在执行完事务后,两者的余额也应该保持一致性原则,即余额为5000元,否则要么事务中的语句没有执行完,要么执行过程中出现异常)

隔离性(isolation)

通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到帐户的余额并没有被减去500元。)

持久性(durability)

一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)

使用:

开启:begin;或者 start transaction;

提交:commit;

回滚:rollback;

索引:

定义:索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度

作用:索引的目的在于提高数据查询效率

使用:

查看:

show index from 表名;

创建:

create index 索引名称 on 表名(字段名称(长度))

删除:

drop index 索引名称 on 表名;

注意:

索引最主要解决的问题:当数据量较大时,且这些数据不需要经常修改,使用索引来加快查询速度

对于比较小的表,查询开销不会很大,也没有必要建立另外的索引

建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件

对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了

建立索引会占用磁盘空间

你可能感兴趣的:(Python学习笔记,数据库)