MySQL数据库命令下的常用操作方法演示与介绍,pymsql使用方法。

数据库mysql

安装mysql请移步百度教程,此文章不再详述。

启动数据库
cmd下 mysql -u root -p自己设置的密码
命令
show databases;看mysql数据库管理系统的数据库列表
use 数据库名;选择要操作的mysql数据库,使用该命令所有mysql命令都只针对该数据库
show columns from 数据表; 显示数据表的属性,属性类型,主键信息,是否为Null(空),默认值等其他信息
create database testdb charset "utf8"; 创建一个叫testdb的数据库,且让其支持中文。
drop database testdb;删除数据库testdb
show index from 数据表; 显示数据表的详细索 引信息,包括PRIMARY(主键)

创建一个数据表
create table table_name(column_name【列名】 column_type【列类型】); #数据库中分号很重要

例如:
mysql> create table student(
-> id int auto_increment,#【auto_increment表示每插入一条数据自增1】
-> name char(32) not null,
-> age int not null,
-> register_date date not null,
-> primary key(id));
如此便创建了一个student的数据表

MySQL数据表中插入新数据
insert into table_name(field1,field2,...fieldN)values(value1,value2,...valueN)
使用上面创建的表例子
mysql> insert into student(name,age,register_date)values("zhangyang",3,"2018-1-1")
mysql> insert into student(name,age,register_date)values('zhangyang',3,'2018-5-5')# 单引号和双引号也无区别
如此便于数据表中插入了数据
mysql查询数据
select命令可以读取一条或者多条数据
*号代替其他字段
select * from student;代表看数据表所有字段的详情

运行结果如下
+----+-----------+-----+---------------+
| id | name | age | register_date |
+----+-----------+-----+---------------+
| 1 | zhangyang | 3 | 2018-01-01 |
| 2 | zhangyang | 3 | 2018-05-05 |
+----+-----------+-----+---------------+
一般语法:
select column_name,column_name from table_name;

可以使用offset n来设置偏移量,说白了就是从第n+1条数据读取,必须配合limit使用,默认为0
limit n代表只读取n条数据的意思。如select * from student limit 2 offset 3;#offset 必须在limit后面
where子句:
可以使用where语句来包含任何条件:
如:select * from student where id>3;输出是第三条以后的数据

select * from student where id=4;输出第四条数据
也可以多条件查询:
select * from student where id>3 and age>5;查询并输出第三条后年龄大于5的数据。
还能模糊查询:
select * from student where register_date like '2018-05%'; 记得要用like和%


mysql修改数据

使用update语句
语法:update table_name set field1 = new-value1,field2 = new-value2 where clause;
例如:
update student set name='韩梅梅' where name='zhangyang';#只改一个列名中的东西,还可以改多个

mysql删除数据
delete语句
delete from table_name where clause; 设置删除条件后,精准删除数据
例如:
delete from student where name = '韩梅梅'; 名字为韩梅梅的数据全部删除。

数据排序:
select from table_name order by fieldn;
select from table_name order by fieldn desc;
按第n列来排序,默认为升序,加一个desc就是降序。

group by 用来分组统计
直接上例子
select name,count(*) from student group by name;
此时会用name来计数
mysql> select * from student;#之前使用过delete 删了前面两条,id数字增加到哪里还是哪里
+----+------+-----+---------------+
| id | name | age | register_date |
+----+------+-----+---------------+
| 3 | 陆毅 | 31 | 2018-11-05 |
| 4 | x毅 | 31 | 2048-01-05 |
| 5 | x毅 | 31 | 2017-05-05 |
+----+------+-----+---------------+
3 rows in set (0.00 sec)

mysql> select name,count(*) from student group by name;
+------+----------+
| name | count(*) | #count(*)也能赋值出去换一个新的名称,也是使用as **。
+------+----------+
| x毅 | 2 |
| 陆毅 | 1 |
+------+----------+
2 rows in set (0.07 sec)

-----------------------我是分割符------------------------------------------
mysql> select name,count(*) as count_name from student group by name;
+------+------------+
| name | count_name |
+------+------------+
| x毅 | 2 |
| 陆毅 | 1 |
+------+------------+
2 rows in set (0.27 sec)
注意 前面的name 是显示name列,后面的name 是显示[by]name计数的结果!

group by的合计功能:
mysql> select name,sum(age) from student group by name;
+--------+----------+
| name | sum(age) |
+--------+----------+
| x毅 | 62 |
| 张嘉译 | 45 |
| 草清华 | 15 |
| 陆毅 | 31 |
+--------+----------+
4 rows in set (0.04 sec)

最后统计所有人年龄相加(这里可以是别的东西计数相加,我只是举例子),只需要在分号前加入with rollup既可
mysql> select name,sum(age)as age_count from student group by name with rollup;
+--------+-----------+
| name | age_count |
+--------+-----------+
| x毅 | 62 |
| 张嘉译 | 45 |
| 草清华 | 15 |
| 陆毅 | 31 |
| NULL | 153 |
+--------+-----------+
5 rows in set (0.00 sec)
不想要NULL的话,也能使用coalesce语法来给NULL换成想要的名字
mysql> select coalesce(name,'合计'),sum(age)as age_count from student group by name with rollup;
+-----------------------+-----------+
| coalesce(name,'合计') | age_count |
+-----------------------+-----------+
| x毅 | 62 |
| 张嘉译 | 45 |
| 草清华 | 15 |
| 陆毅 | 31 |
| 合计 | 153 |
+-----------------------+-----------+
5 rows in set (0.00 sec)

修改数据表本身而不是数据,比如修改name age这个表头
mysql alter语句
alter table student add sex enum('M','W') not null;增加sex这个字段,字段类型设置为enum('M','W')

alter table student drop age;从student中删除age整个字段(age对应的整列)
修改字段类型及名称 需要用change子句
mysql> alter table student change sex gender char(32) default 'X'; #change后接旧字段名,马上跟新字段名,然后新字段类型既可,默认值看情况是否需要设置。
Query OK, 5 rows affected (0.84 sec)
Records: 5 Duplicates: 0 Warnings: 0

查询两个表之间的交集并集差集
innerjoin 交集 left join 差集(左对右) right join也是差集(右对左)

full join 并集:mysql并不直接支持full join,可以联合left和right一起输出就成。
语法如下:
create table A (a int not null);
create table B (b int not null);
insert into A (a)values(i);#这里简写,i为1-5
insert into B (b)values(i);#这里简写,i为3-7
select * from A inner join B on A.a=B.b;此时输出A与B的交集
+---+---+
| a | b |
+---+---+
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+---+---+
select * from A left join B on A.a=B.b;此时输出 B 于 A中的差集,先显示交集,后面出现的是差集
+---+------+
| a | b |
+---+------+
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 1 | NULL |
| 2 | NULL |
+---+------+
根据字面意思不难看出 right join其实就是把结果翻过来显示。

并集由于mysql不直接支持,可以使用union语句把left join 和right join放一起输出折合显示:
select * from A left join B on A.a=B.b union select * from A right join B on A.a=B.b;
mysql事务:
其实就是一开始输入begin;#开始事务,
然后各种骚操作,如果程序这个时候蹦了,那么无论是插入数据还是修改或者干啥,不会记录下来,但是如果那个id序号是自增的,这个序号其实还是会变的,就如操作后再输入rollback;的效果是一样的
如果输入了commit; 那么操作过的数据都会保留下来

mysql索引
如果说加了索引的mysql是飞机的话,那么没加索引的mysql就是一辆共享单车~,速度的差异很大,当然数据量很小的话体现不出来,但是数据量大了,就有非常大的区别,但索引也有缺点,表的查询速度提升了,但是如果对表进行update,insert,和delete等操作,mysql不仅要保存数据还要保存索引,建立索引会占用磁盘空间的索引文件。
创建索引
create index index_name on table_name(x(length));#index_name索引名(看自己喜欢写什么),table_name要索引的表,x要成为索引的字段,length该字段的长度,不超过字段本身的长度,一般字段多少,他就填多少

、、、
注意:主键自动就是索引。
、、、

删除索引:
drop index index_name on table_name;#删除table_name表中的index_name索引。

 

python 使用mysql接口
MySQL-python在python3上没有实现,各种安装失败,无论怎么装c++没用,建议大家使用pymysql。
安装 pip install pymysql
用法基本一样

!!!与redis一样,utf8中间不能加‘-’,必须连着写,否则会出错。

上代码:

import pymysql
#创建与本机数据库的连接,端口默认3306,db就是自己命令行设置的数据库名(不是数据表)
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456',db='slkdb',charset='utf8')#不写charset这句话,汉字输出全是问号
#创建 光标,相当于mysql> | 这个东西
cursors = conn.cursor()

#执行mysql语句,模拟有光标的那个命令,所以要cursor对象
result_row = cursors.execute('select * from student')#返回的是数据行数并不是数据
print(result_row)
print(cursors.fetchall())#把数据都打印出来,fetchone()只打印一条,读取数据原理与读取文件的read一样,前面如果读取过的数据,后面就不会再显示


'''插入多条数据,executemany()'''
data = [('N1',15,'2014-6-13','M'),
('N2', 13, '2014-6-3', 'M'),
('N3', 17, '2014-4-1', 'F')]
cursors.executemany("insert into student (name,age,register_date,gender)values(%s ,%s ,%s,%s)",data)
conn.commit()#不写这个提交命令,数据不会插入数据表中,就类似于mysql的事务。
cursors.close()#先关闭光标,一样 顺序关闭有始有终
conn.close()#关闭连接

 

 

posted on 2018-03-06 10:36  薄荷总是那么清新  阅读(515)  评论(0编辑  收藏  举报

导航