python学习第十一天(MySQL)
一、MySQL介绍 |
#MySQL(关系型数据库管理系统) MySQL是一个有关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(Relational Datbase Management System,关系数据库管理系统)应用软件。 MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。由于体积小,速度快,总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。
#存储引擎 #在此先介绍几个 MylSAM:MySQL5.0之前默认的数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务。 InnoDB:事务型数据库的首选引擎,支持ACID事务,支持行级锁定,MySQL5.5起成为默认数据库引擎。 BDB: 源自Berkely DB,事务型数据库的另一种选择,支持Commit和Rollback等其他事物特性。 Memory:所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在MySQL重新启动时丢失。 Cluster/NDB:高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用。 CSV:逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.csv文件。是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。
#主键(primary key)
表中每一行都应该有一列(或几列)可以唯一标识自己。顾客表可以使用顾客编号,而订单表可以使用订单ID。雇员表可以使用雇员ID。
唯一标识表中每行的这个列(或这几个列)称为主键。主键用来表示一个特定的行。没有主键,更新或删除表中特定行就极为困难,因为你不能保证操作只涉及相关的行。
<<<提示:应该总是定义主键,虽然并不总是需要主键,但多数数据库设计者都会保证他们创建的每一个表具有一个主键,以便于以后的数据操作和管理>>>
#满足主键的条件:
1、任意两行都不具有相同的主键值
2、每一行都必须具有一个主键值(主键列不允许NULL值)
3、主键列中的值不允许修改或更新
4、主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)
主键通常定义在表的一列上,但并不是必须这么做,也可以一起使用多个列作为主键。
二、SQL语句: |
#了解一下SQL语句: 我们需要操作MySQL则需要用到的有: 创建数据库: create database 数据库名; create database dbname default charset=utf8;#为数据库添加默认字符编码 查看数据库: show databases; #查看有几个数据库 删除数据库: drop database 数据库名; 创建数据库中的表: create table 表名 engine=innodb default charset=utf8; #engine表示使用的引擎 create table 表名 (sid int not null auto_increment primary key,student_id int,course_id int,number int,)engine=innodb default charset=utf8; #创建表的同时创建表中的列。 删除表: drop table 表名; 插入表中的数据: insert into 表名 (列名,列名1,....) values (列值,列值1,...); 更新表中的数据: update 表名 set 列名=修改后的值; #会更新该列所有的数据 update 表名 set 列名=修改后的值 where 条件语句;#更新符合条件的语句。 删除表中的数据: delete from 表名 [where Clause] #不指定where语句,删除表中的所有记录。 #指定wher子句则删除where条件范围内的。
查询表中的数据: select * from 表名;#查询表内所有列的内容 select * from 表名 where 条件语句; #显示表内符合条件语句的内容。 select 列名,列名1,... from 表名; #显示表中某几列的内容。
select distinct 列名 from 表名; #显示非重复的查询结果。(若使用DISTINCT关键字,它必须直接放在列名的前面)
select 列名 from 表名 limit 5; #显示前5行的结果
select * from 表名 order by 列名; #根据某列进行排序,默认的排序为升序(asc) 降序排序为desc.
#in关键字的用法
select * from 表名 where 列名 in(列值1,列值2,...) obder by 列名; #查询in关键字给定的范围后,以order by 后的列做升序排序。相当于or语句(select * from 表名 where 列名=列值1 or 列名=列值2,...) obder by 列名;)
#使用in操作符的优点:
1、在有很多合法选项时,IN操作符的语法更清楚,更直观。
2、在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。
3、IN操作符一般比一组OR操作符执行得更快。
4、IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。
#like操作符的用法:
通配符%:
select * from 表名 where 列名 like "查找关键字%“; #通配符%的使用,示例:select * from products where prod_name like "Fish%"; %代表搜索模式中给定位置的0个,1个,或多个字符。
<<< 请注意NULL: 通配符%看起来像是可以匹配任何东西,但有个例外,就是NULL。子句WHERE prod_name LIKE "%" 不会匹配产品名称为NULL的行。>>>
通配符_:
select * from 表名 where 列名 like "查找关键字_“; #通配符%的使用,示例:select * from products where prod_name like "Fish_"; _代表搜索模式中给定位置的1个,匹配单个字符,若是两个_则匹配两个字符。
通配符[]:
select * from 表名 where 列名 like "[关键字1关键字2]%"; #通配符[]的使用,示例:select * from customers where cust_contanct like '[JM]%' order by cust_contact; WHERE子句中的模式为'[JM]%'.
[JM]匹配任何以方括号中字母开头的联系人名,它也只能匹配单个字符。因此任何多于一个字符的名字都不匹配。而[JM]之后的%匹配第一个字符之后的任意数目的字符,返回所需要结果。
此通配符可以用前缀字符^(脱字号)来否定。例如:'[^JM]%'表示非J或M开头的联系人名。
<<< 通配符使用的技巧>>>
1、不要过度使用通配符。若其他操作符能达到目的,则用其他操作符。
2、在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
3、仔细注意通配符的位置。若放错地方,可能不会返回想要的数据。
1 #分组数据:GROUP BY子句和HAVING子句。 2 #分组是使用SELECT语句的GROUP BY子句建立的。 3 select vend_id,count(*) as num_prods from procucts group by vend_id; #SELECT 语句指定了两个列:vend_id包含产品供应商的ID,num_prods为计算字段(用COUNT(*)函数建立)。GROUP BY 子句指示DBMS按vend_id排序并分组数据。
这就会对每个vend_id而不是整个表计算num_prods一次。 4 <<<在使用GROUP BY子句前,需要知道一些重要的规定>>> 5 1、GROUP BY 子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致的进行数据分组。 6 2、如果在GROUP BY子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据) 7 3、GROUP BY子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。 8 4、大多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如文本或备注型字段)。 9 5、除聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出。 10 6、如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。 11 7、GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
#过虑分组 HAVING
HAVING子句用在GROUP BY子句后过,用于过滤条件(相当于select后的where)
select cust_id,COUNT(*) as orders from Orders GROUP BY cust_id HAVING COUNT(*)>=2 #显示Orders表中,相同cust_id的个数大于等于2的
#关联表JOIN
# select * from student left join class on student.class_id = class.cid;
#left join 关联的表 on 关联的条件
#left join 跟左面的表里面相关的数据都列出来
#right join 跟右面的表里面相关的数据都列出来
#inner join 两个表进行关联,如果出现有null的值,则不显示出来(删除相应的数据)
#UNION用于合并两个或多个SELECT语句的结果集,并消去表中任何重复行。 #UNION内部的SELECT语句必须拥有相同的数量的列,列也必须拥有相似的数据类型。 同时,每条SELECT语句中的列的顺序必须相同。 #语法示例: SELECT column_name FROM table1 UNION SELECT column_name FROM table2 <<<默认的,UNION操作符选取不同的值。如果允许重复的值,则使用UNION ALL。当ALL和UNION一起使用时(即UNION ALL),不消除重复行。
#外键: #在已经有的表中添加外键: alter table userinfo add foreign key(department_id) references department(did) on delete cascade; #userinfo为需要添加外键的表,department_id为表中的列名(需要添加外键的列),department为被关联的表,did为department中的列名(被关联的id). #在已有的表中删除外键: alter table userinfo drop foreign key department; #userinfo为需要删除外键的表,department为要删除的外键名 #查询表中是否有外键: show create table userinfo\G; #userinfo为表名
三、Python下的MySQL模块 |
#导入MySQL模块 import pymysql #在python2中导入的是MySQLdb模块,python3中导入的是pymysql #连接MySQL conn=pymysql.Connect(host="host_ip",port="host_port",name="username",password="pwd",database="dbname",charset="utf8") cur=conn.cursor()#生成元组形式的结果, conn.cursor(pymysql.cursors.DictCursor) #生成字典形式的结果 v=cur.execute(SQL查询语句) v.feathall()#查找所有的记录, v.featchone()#查找一条记录, v.featchmany([n,m])#查找指定的记录条数
v=cur.execute(SQL语句<增,删,改>)
conn.commit()#执行增,删,改操作后需要提交动作
cur.lastrowid #可获取新增的自增ID号 cur.close()
conn.close()