mysql摘要之常用操作命令注释

这里是MySQL一些常用操作的命令注释和摘要(数据库介绍和安装之类等真正写DB的时候在详细写(牵扯多种安装方式,主从同步,增量和全量备份、多实例等等)

其实现在使用原生的需求不多,基本上使用ORM操作,所以这里就不实战,这里我们把一些常用出走操作命令注释下,

系统平台:Linux

Mysql版本:5.5.32

 

基本了解

Field字段: 列名

type:

    mysql数据库字符串类型是:char      

    Python 字符串类型是:str

mysql\python 数字类型:int

mysql:enum(‘N’,’Y’):值可以输入yes 或者no

Null: 是否允许该表示空

KEY 查看该字段的key是什么类型

      PRI:主键或者复合键

      MUT:普通索引

      UNI:唯一索引

Default :填写一个默认值

Extra:额外的要求

 

SLQ结构化语言包含6个部分

    DQL数据查询语言

        select  #查询最常用

    DML数据操作语言

        insert   #插入

        update  #修改

        delete  #删除

        #这3个命令都是针对表中的数据

    TPL事务处理语言

        begin

        transaction

        commit #提交到数据库里面(oracle默认每次操作修改数据库表都需要加这个命令才更新到数据库)(而mysql模式的开启的自动更新进入数据库,可关闭,关闭后每次执行修改,需要生效就必须加上该命令)

        rollback 

        #接触不多 TPL是通过DML数据操作语言对表中影响的数据能够更新到数据库里面,或者让他失效

    DCL数据控制语言

        grant #授权

        revoke #收回权限

    DDL数据定义语言

        greate #创建库和表

        drop  #删除库了表

        #不同于DML数据操作语言,因为DML只针对表中的数据

    CCL指针控制语言(一般用不到)

        declare cursor

        fetch into

        update where current

小结:SQL语句最常见的分类一般就是3类:

    DDL数据定义语言(CREATE,ALTER,DROP)  运维

    DCL数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 运维

    DML 数据操作语言(SELECT,INSERT,DELETE,UPDATE) 开发

一些常用的命令

[root@python ~]# cat /etc/my.cnf  #mysql配置文件路径

[root@python ~]# mysql -uroot -p123  #登录数据库

mysql> use mysql;  #切换数据库

mysql> show tables;  #查看该数据库的表

mysql> desc user;  #查看表结构

mysql> select * from user\G; #查看该表的所有数据

mysql> select User from user;  #查看该表的用户

mysql> use test;

mysql> grant all on test.* to 'burgess'@'%' identified by 'burgess1314'; #授权:用户:burgess、访问主机:所有、密码:burgess 1314、只可管理test数据库的所有表,%号:本地主机不可以登录,所有其他主机可登录

mysql> select user,host from mysql.user; #查看用户和以及用户允许登录的主机名(主机IP)

mysql> show grants for burgess;  #查看该用户权限

mysql> flush privileges; #从缓存把数据刷入磁盘

 

mysql> show columns from user;   #desc一样的效果查看表结构

mysql> create database burgessdb;  #创建数据库

mysql> show create database burgessdb;  #查看建库语句,默认latinl (不可写中文)

mysql> drop database burgessdb; #删除数据库

mysql> create database burgessdb charset utf8;  #创建数据库指定字符集

mysql> show create database burgessdb;  #查看建库语句, (字符集是utf-8可写中文)

 

mysql>  create table student(                  #创建一张student表

    -> id int auto_increment,

    -> name char(32) not null,

    -> age int not null,

    -> register_date date not null,

    -> primary key (id));

 

mysql> desc student;   #查看表结构

mysql> show create table student\G  #查看建表语句,\G排序好看点

mysql> insert into student(name,age,register_date) values("burgess",3,"2016-06-22");   #插入语句进入表中  前面括号里面是字段每个字段以冒号分隔 ,后面values括号里面一一对应前面的字段进入插入到尾部

mysql> select * from student; #查看该表所有字段数据

mysql> select * from student limit 2     #limit 2显示2条数据(如有id1-id10十条数据,此时显示id1和id2两条数据)

mysql> select * from student limit 2 offset 1;  #limit2:显示2条数据  offset1:从第1条数据后面开始显示(显示id2和id3两条数据)

mysql> select * from student limit 2,1;  # 效果一样上面的简写(显示id2和id3两条数据)

mysql> select * from student where id >3 and age <20;  #where 条件(满足字段的条件的数据显示)

mysql> select * from student where register_date like "2016-06%";    #like  %: 模糊匹配   %:匹配任意

mysql> update student set name="Burgess",age=33 where id=4; #修改匹配的数据

mysql> delete from student where name="Burgess";  #删除匹配数据

mysql> select * from student order by id;  #根据ID字段升序排列

mysql> select name,count(*) from student;  #显示name字段,统计所有数据次数

mysql> select name,count(*) from student group by name;  #显示name字段 ,统计name字段里相同值的次数(分组统计)

mysql> select register_date,count(*) from student group by register_date;  #显示register_date字段 ,统计register_date字段相同的数据的次数(分组统计)

 

mysql> select register_date,count(*) as stu_num  from student group by register_date;#count(*)名字修改成 stu_num名字(分组统计)

mysql> select name,count(*) from student group by name with rollup;     #分组统计+总统计

mysql> select name,sum(age) from student;  #显示name字段,计算age字段里总和

mysql> select name,sum(age) from student group by name;; #显示name字段,计算age字段里相同名字各自的age总和

mysql> select name,sum(age) from student group by name with rollup;    #显示name字段,计算age字段里相同名字各自的总和,统计age所有总和

mysql> alter table student add sex enum("M","F");    #增加sex该字段,且该字段只能输入M 或 F  输入其他变空。

mysql> alter table student drop age;  #删除age该字段

mysql> alter table student modify sex enum("M","F") not null;  #修改sex该字段,字符串不可以为空

mysql> alter table student change sex gender char(32) not null default "X"; #修改sex字段名:gender,字符串类型: char(32), null:不为空 默认参数:X 

 

在创建多一张考勤表关联

mysql> create table study_record(

    -> id int(11) not null auto_increment,

    -> day int not null,

    -> status char(32) not null,

    -> stu_id int(11) not null,       #建立一个stu_id作为引用其他表的ID

    -> primary key (id),

    -> key fk_student_key (stu_id),    #把该stu_id作为索引

   -> constraint fk_student_key foreign key (stu_id) references student (id)

                                       #强制一个索引外键stu_id 引用 student表的id

   -> );

mysql> alter table study_record modify id int auto_increment;  #修改增加该id字段状态自增

mysql> insert into study_record (day,status,stu_id) values(2,'no',5); #由于引入关联表没有该ID就报错  也就是student表没有ID5就会报错

 

Mysql (left join, right join, inner join ,full join)

我们已经学会了如果在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。

本章节我们将向大家介绍如何使用 MySQL JOIN 在两个或多个表中查询数据。

你可以在SELECT, UPDATE DELETE 语句中使用 Mysql JOIN 来联合多表查询。

JOIN 按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。 取交集

LEFT JOIN(左连接)获取左表所有记录,即使右表没有对应匹配的记录。取差集

RIGHT JOIN(右连接)  LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。取差集

Full join  mysql 并不直接支持full join,but 总是难不到我们 取并集

 

创建两个表(Linux上mysql试验

mysql> create table A (    

    -> a int not null);

mysql> create table B (

    -> b int not null);

 

mysql> insert into A (a) values(1);  #在A表的a字段插入数据

mysql> insert into A (a) values(2);  #在A表的a字段插入数据

mysql> insert into A (a) values(3);  #在A表的a字段插入数据

mysql> insert into A (a) values(4);  #在A表的a字段插入数据

mysql> select * from A;

mysql> insert into B (b) values(3);  #在B表的b字段插入数据

mysql> insert into B (b) values(4);  #在B表的b字段插入数据

mysql> insert into B (b) values(5);  #在B表的b字段插入数据

mysql> insert into B (b) values(6);  #在B表的b字段插入数据

mysql> insert into B (b) values(7);  #在B表的b字段插入数据

mysql> select * from B;

mysql> select * from A inner join B on A.a = B.b; #取A表的a字段和B表的b字段的交集(重复的数据))   inner join:内连接

mysql> select A.*,B.* from A,B where A.a=B.b;  #和上面的效果一样的

mysql> select * from A left join B on A.a = B.b;  #eft(显示A表a字段的数据,取B表b字段是否有相同的数据,有显示相同,没有显示null(先入为主)(求差集)

mysql> select * from B right join A on A.a = B.b;  #right(显示A表a字段的数据,取B表b字段是否有相同的数据,有显示相同,没有显示null(后入为主) (求差集)

 

mysql> select * from B left join A on A.a = B.b;  #left(显示B表b字段的数据,取A表a字段是否有相同的数据,有显示相同,没有显示null(先入为主) (求差集)

 

mysql> select * from A right join B on A.a = B.b; #right(显示B表b字段的数据,取A表a字段的数据,是否有相同的数据,有显示相同,没有显示null(后入为主) (求差集)

 

mysql> select * from A left join B on A.a = B.b union select * from A right join B on A.a = B.b;     #通过这种方法实现查并集

 

事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务

事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行

事务用来管理insert,update,delete语句

一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

1事务的原子性:一组事务,要么成功;要么撤回。

2稳定性  有非法数据(外键约束之类),事务撤回。

3隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。

4可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。

Mysql控制台使用事务来操作

Linux上mysql试验事务

数据回滚

mysql> begin;   #事务的开始

mysql> insert into student (name,register_date,gender) values("Burgess","2014-05-21","M"); #插入数据

mysql> insert into student (name,register_date,gender) values("Jack","2014-05-21","M"); #插入数据

mysql> rollback; #手动回滚  事务结束 (也就是上面两条数据是没有写入数据库的)

数据提交

mysql> begin; #事务开始

mysql> insert into student (name,register_date,gender) values("Alex","2014-05-21","M"); #插入数据

mysql> insert into student (name,register_date,gender) values("Jlex","2014-05-21","M"); #插入数据

mysql> insert into student (name,register_date,gender) values("Rain","2014-05-21","M"); #插入数据

mysql> commit; #事务提交(提交以后才数据才算是真正写入数据库)

 

索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件) 

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERTUPDATEDELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

Linux上mysql试验事务

mysql> show index from student\G;  #查看该表的索引   主键就是一种默认索引

mysql> create index index_name on student(name);  #该表name字段建立普通索引名:index_name

 

mysql> show index from student;  #查看该表的索引

mysql> drop index index_name on student; #删除该表index_name索引

唯一索引的要求就是 该字段的数据不能重复..保证唯一  创建唯一索引和普通索引一样 格式:create unique index index_name on student(name);

索引的作用:

假如有id字段,name字段 你想通过name字段找指定的名字burgess

1.如果name 字段不是索引,那么找的顺序是从第一列开始往下查找(id列第一个值开始找,直到id列的所有值都找寻完毕,如果没有找到burgess名字,那么就开始从第二列name开始找,直到找到)

2.如果name设置了索引,那么找burgess的时候,直接从name字段开始找

 

还有很多如连表查询,联合索引等等,等到后期专门写MYSQL的时候在详细介绍(这里主要还是以Python开发需要了解为准)

 

 

 

猜你喜欢

转载自blog.csdn.net/Burgess_zheng/article/details/86472789