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、数据类型与约束:
登录: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
使用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)
);
取消外键约束:
show create table goods;
alter table goods drop foreign key goods_ibfk_1;
在目前主流的数据库设计中,越来越少使用到外键约束
原因: 会极大的降低表更新的效率
如何替代: '通过外键约束实现数据有效性验证'
解决思想: 可在数据录入时验证(表示层,ui层),或者在业务层面(python代码)去验证,而不要在数据库层面去验证。
import pymysql
Connection=pymysql.connection(host='IP',user='root',password='password',port=3306,database='db_jingdong', charset='utf8')
Cursor = connection.cursor();
Cursor .execute(sql,args)
这里返回的是增删改查被操作的数据;
如insert即为增加的那条记录
Update即为更新的这条记录
返回的数据类型由执行的语句决定
Rowcount:影响的行数
。。。
。。。
Cursor.close();
Connection.close();
最终目标:
编写python代码实现对数据库的增删改查
定义:通俗的讲,视图就是一条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字句单独建立索引了
建立索引会占用磁盘空间