Python_MySQL 数据库操作

数据库操作

一、创建数据库

CREATE DATABASE 库名 DEFAULT CHARSET=UTF8;
mysql> create DATABASE python21 default charset=utf8;

二、选择 / 切换 数据库

在你连接到 MySQL 数据库后,可能有多个可以操作的数据库,所以需要选择即将要操作的数据库。

mysql> USE python21;
Database changed
  • 显示出的Database changed表示数据库选择成功,可以使用当前数据库下的所有数据表中的数据。后续的操作中都会在python21 数据库中执行。
  • 必须先使用USE打开数据库(选中指定的数据库),才能读取其中的数据
  • 所有的数据库名,表名,表字段都是区分大小写的。所以你在使用SQL命令时需要输入正确的名称

三、删除数据库

删库有风险,动手需谨慎!执行删除命令后,所有数据将会消失。

DROP DATABASE 数据库名;

# 删除姓名为Python21的数据库
mysql> DROP DATABASE python21;

数据表操作

一、创建数据表

创建MySQL数据表需要以下信息:

  • 表名
  • 表字段名
  • 字段类型
CREATE TABLE 表名(
    字段名 类型 [字段约束],
    字段名 类型 [字段约束],
    字段名 类型 [字段约束]
    ...
)DEFAULT CHARSET=UTF8;

练习:
    -- 创建student表,字段:主键 数值类型 无符号 不为空 自增,姓名 变长字符 不为空,年龄 数值类型,性别 数值类型 默认值为1 不为空,电话 变长类型,地址 变长
    
    create table student(
        id int unsigned not null primary key auto_increment,
        name varchar(4) not null,
        age int,
        sex int default 1 not null,
        tel varchar(20),
        adress varchar(255)
    )default charset=utf8;
    
    -- 创建baixing表,字段:主键 数值类型 不为空 自增,标题 变长字符,更新时间 变长,浏览人数 变长,公司名称 变长
    
    create table baixing(
        id int not null primary key auto_increment,
        title varchar(50),
        update_time varchar(50),
        see_count varchar(10),
        company varchar(50)
    )default charset=utf8;

    -- 创建user表,字段:主键 数值类型 不为空 自增,姓名 变长字符 不为空,邮箱 变长,性别 变长,电话 变长
    
    create table user(
        id int not null primary key auto_increment,
        name varchar(10) not null,
        email varchar(20),
        sex varchar(3),
        tel varchar(20),
        adress text
    )default charset=utf8;

注意:

  • 创建数据表时,如果已经指定了数据库,会在当前数据库下新建表,如果没有指定数据库,需要指定数据库
  • 控制台提示类似:Query OK, 0 rows affected 表示创建成功
  • 如果不想字段为NULL可以设置字段的约束条件为 NOT NULL, 在操作数据库时如果插入该字段的数据为空,会提示错误
  • PRIMARY KEY:用于定义主键
  • AUTO_INCREMENT :定义字段值为自增,一般用于主键,数值会自动加1
  • CHARSET 设置数据表编码为utf8

二、查看建表语句

SHOW CREATE TABLE 表名\G; 
SHOW CREATE TABLE 表名

三、查看表结构

DESC 表名;


四、查看数据表

指定数据库后,可以查看当前数据库下的所有数据表的列表

mysql> SHOW TABLES;


修改表结构

通用格式

ALTER TABLE 表名 ACTION(更改选项);

一、添加字段

alter table 表名 add 新字段名 类型 约束; (默认在最后一列添加)
alter table 表名 add 新字段名 类型 约束 after 指定字段名; 

练习

# 在user表的最后追加一个num字段 设置为int not null
alter table user add num int not null;

# 在user表的email字段后添加一个age字段,设置int not null default 20;
alter table user add age int not null default 20 after email;

# 在user表的最前面添加一个aa字段设置为int类型
alter table user add aa int not null first;

二、修改字段

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新字段类型 新字段约束
ALTER TABLE 表名 MODIFY 字段名 新字段类型 新字段约束

区别

  • change 同时修改字段名、类型及约束时使用,需要指明旧字段及新字段
  • modify 不能修改字段名,只能修改字段类型和约束条件

练习

# 修改user表中age字段为tinyint、无符号、默认值为20
alter table user modify age tinyint unsigned not null default 20;
# 修改user表的age字段改为nianling字段并修改类型为int,默认值99 
alter table user change num mm int not null default 10;

三、删除字段

ALTER TABLE  表名 DROP 字段名

练习

# 删除user表的aa字段
alter table user drop aa;

四、修改表名

ALTER TABLE 旧表名 RENAME AS 新表名


五、更改表类型

MySQL数据库中的表类型一般常用两种:MyISAM和InnoDB

ALTER TABLE 表名 ENGINE="InnoDB"

区别:

  • MyISAM类型中的表数据增删 改速度快,不支持事务,没有InnoDB安全

  • InnoDB类型的表数据 增删改 速度没有MyISAM的快,但支持事务,相对安全

    MyISAM类型的数据文件有三个frm(结构)、MYD(数据)、MYI(索引)
    InnoDB类型的数据文件只有一个 .frm(表结构).ibd(数据 索引)


六、删除数据表

删表需谨慎!!
DROP TABLE 表名 ;

删除了数据表kong
DROP TABLE kong;

数据操作

一、添加数据

INSERT INTO 表名(field1, field2,...fieldN)VALUES (value1, value2,...valueN);


1、标准添加(指定所有字段,给定所有的值)
insert into student(id,name,age,sex,adress,tel) values(1,'张三',20,'男','天上','110');

2、指定部分字段添加

如果字段约束允许传入空值,那么插入数据时此类字段可以不进行添加

insert into student(name,adress) values('王二麻子','火星');
insert into student(name,age,sex,adress) values('王二麻子','32','女','月球');

3、不指定字段按顺序添加值
insert into student values(null,'来来',21,'女','月亮','114');

注意

不指定字段名插入数据时,如果id字段约束为主键,自增,id值可以给null,或者实际编号,但是需要给值保证插入数据的数量和字段数量一致


4、批量插入数据
insert into student (name,age,sex,adress,tel) values
    ('你猜',12,'男','天上','120'),
    ('你猜1',12,'女','天上1','119'),
    ('你猜2',12,'男','天上','120'),
    ('你猜3',12,'男','天上','120'),
    ('你猜4',12,'男','天上','120'),
    ('你猜5',12,'男','天上','120');

insert into users(username,pssword,sex,age) values
    ('张洁','123456','1','25'),
    ('志飞','123456','1','30'),
    ('艺哲','123456','1','38'),
    ('晁博','123456','0','16'),
    ('赤峰','123456','0','40'),
    ('豪哥','123456','0','60');


二、查询数据

  • 使用SELECT语句从数据表中检索一个或多个列
  • 使用SELECT检索表数据,必须至少给出两条信息——想查询什
    么数据,以及从什么表查询
SELECT * FROM 表名 ;
SELECT 字段1,字段2 FROM 表名;

注意:

工作中尽量不使用select * 来查询数据


1、基础查询

  • 查询单个列
SELECT * FROM  表名;

+----+----------+-----+-----+---------+
| id | name     | age | sex | classid |
+----+----------+-----+-----+---------+
|  1 | zhangsan |  20 | m   | lamp138 |
|  2 | lisi     |  20 | m   | lamp138 |
|  3 | wangwu   |  21 | w   | lamp138 |
|  4 | zhaoliu  |  25 | w   | lamp94  |
|  5 | uu01     |  26 | m   | lamp94  |
|  6 | uu02     |  28 | w   | lamp92  |
|  7 | qq02     |  24 | m   | lamp92  |
|  8 | uu03     |  32 | m   | lamp138 |
|  9 | qq03     |  23 | w   | lamp94  |
| 10 | aa       |  19 | m   | lamp138 |
| 11 | sad      |  35 | m   | lamp94  |
| 12 | tt       |  25 | m   | lamp92  |
| 13 | wer      |  25 | w   | lamp94  |
| 14 | xx       |  25 | m   | lamp92  |
| 15 | kk       |   0 | w   | lamp94  |
+----+----------+-----+-----+---------+
15 rows in set (0.00 sec)


  • 查询部分列或单个列
SELECT 字段1, 字段2,...  FROM  表名;
SELECT name, age FROM user;
SELECT name FROM user;

+----+----------+------
| id | name     | age | 
+----+----------+------
|  1 | zhangsan |  20 |
|  2 | lisi     |  20 | 
|  3 | wangwu   |  21 | 
|  4 | zhaoliu  |  25 |
|  5 | uu01     |  26 | 
|  6 | uu02     |  28 | 
|  7 | qq02     |  24 | 
|  8 | uu03     |  32 | 
+----+----------+------
8 rows in set (0.00 sec)

注意:
  • 查询出的数据没有明确排序查询结果,返回数据的顺序没有特殊意义。可能是数据被添加到表中的顺序,也可能不是。只要返回相同数目的行,就是正常的

2、where条件查询

  • 可以在 WHERE 子句中指定任何条件
  • 可以使用 AND 或者 OR 指定一个或多个条件
  • WHERE子句类似于程序语言中的 if 条件

# 查询班级表中python03的学生信息
select * from class where class_name='python03';

# 查询age为12的男生信息
select * from stu where age=12 and sex='男';

# 查询id号值在5以上的学生信息
select * from  stu where id>5;

# 查询年龄在20至25岁的学生信息
select * from stu where age>=20 and age<=25;
select * from stu where age between 20 and 25;

# 查询年龄不在20至25岁的学生信息
select * from stu where age not between 20 and 25;
select * from stu where age<20 or age>25;

# 查询id值为1,3,5,7,9的学生信息
select * from stu where id in (1,3,5,7,9);
select * from stu where id=1 or id=3 or id=5 or id=7 or id=9;

# 查询lamp138和lamp94期的女生信息
select * from stu where classid in('lamp138','lamp94') and sex='w';
select * from stu where (classid='lamp138' or classid='lamp94') and sex='w


select [字段列表] from 表名
[where 搜索条件]
[group by 分组字段]
[order by 排序]
[limit 分页]


3、LIKE 子句

  • LIKE 子句中使用百分号%字符来表示任意0个或多个字符,类似于正则表达式中的星号*

  • 如果没有使用百分号%, LIKE 子句与等号的效果是一样的

  • 一个短横线代表任意一个字符 :-
-- 查询name字段值是以zh开头的所有信息
select * from stu where name like "zh%";	
  
-- 查询name字段值是张开头的所有信息
select * from users where username like '张%';

-- 查询姓名name中含有ang子串的所有信息
select * from stu where name like "%ang%";

--查询姓名name中含有字母i的所有信息
select * from users where username like '%i%';

--查询姓名是任意四位字符构成的信息。
select * from stu where name like "____";

--查询姓名是任意2位字符构成的信息。
select * from users where username like '__';


4、排序

SELECT * FROM 表名 ORDER BY 字段名 排序规则

  • 使用 MySQL 的ORDER BY子句来设定你想按哪个字段哪种方式来进行排序,返回排序后的查询结果
  • 可以设定多个字段来排序
  • 可以使用 ASC(升序) 或 DESC(降序) 关键字来设置排序规则,默认情况下,是按升序排列
-- 按年龄升序排序查询学生信息
mysql> select * from stu order by age;

 --默认asc升序 可省略
mysql> select * from stu order by age asc; 

-- 年龄降序排序
mysql> select * from stu order by age desc;

-- 查询学生信息,按班级做升序排序,相同班级按年龄降序排序
mysql> select * from stu order by classid asc,age desc;


5、统计函数(聚合函数)

  • max()
  • min()
  • count()
COUNT(*) 函数返回在给定的选择中被选的行数

  • sum()
  • avg()
-- 获取学生表中最大、最小以及平均年龄是多少?
mysql> select max(age),min(age),avg(age) from stu;

-- 统计当前表中有多少条数据
select count(id) from users;

-- 获取学生表中男生m的数量
select count(*) from users where sex='1';


6、分组

  • GROUP BY 语句根据一个或多个列对结果集进行分组
  • 在分组的列上我们可以使用 COUNT,SUM,AVG,等函数
-- 统计班级信息,按性别分组,并统计每组人数;
MySQL> select sex,count(*) from stu  group by sex;

-- 统计每个班级的人数
MySQL> select classid,count(*) from stu  group by classid;

-- 统计每个班级的,男生和女生各多少人数。
MySQL> select classid,sex,count(*) from stu  group by classid,sex;


7、 查询部分数据

SELECT * FROM 表名 LIMIT num;   查询数据只显示前m条
SELECT * FROM 表名 LIMIT m,n;   排除前m条,然后再查询出前n条


-- 查询前5条信息
mysql> select * from stu limit 5;

-- 排除前2条后再获取4条信息
mysql> select * from stu limit 2,4;(下标从0开始)

-- 以4条数据分一页,取第一页
mysql> select * from stu limit 0,4;

-- 以4条数据分一页,取第二页。
mysql> select * from stu limit 4,4;

-- 以4条数据分一页,取第三页。
mysql> select * from stu limit 8,4;

-- 以4条数据分一页,取第四页。
mysql> select * from stu limit 12,4;

分页公式:.... (页号-1)*页大小, 页大小;


练习

-- 查询某个数据表的总数据量
mysql> select count(id) from 表名

-- 获取年龄最大的5位学生信息?
mysql> select * from stu order by age desc limit 5;

-- 统计每个班级的人数,按人数从大到小排序,取前3条。
mysql> select classid,count(*) num from stu group by classid order by num desc limit 3;


三、修改数据

-- 更新表中所有行
UPDATE 表名 SET 字段1=值1,字段2=值2,字段n=值n...;

-- 添加过滤条件表示更新表中特定行
UPDATE 表名 SET 字段1=值1,字段2=值2,字段n=值n... WHERE 条件;

练习

-- 将id为11的age改为35,sex改为m值
mysql> update stu set age=35,sex='m' where id=11;

-- 将id值为12和14的数据值sex改为m,classid改为lamp92
mysql> update stu set sex='m',classid='lamp92' where id=12 or id=14 
-- 二者等价
mysql> update stu set sex='m',classid='lamp92' where id in(12,14);

-- 修改id为1,2,3的数据 
mysql> update users set age='20' where id=1 or id=2 or id=3;

-- 将id为11的age改为35,sex改为0值
update users set age="35",sex='0' where id=11;

-- 将id值为6和9的数据值sex改为0,email改为[email protected]
update users set sex='0',email='[email protected]' where id=6 or id=9;

-- 将姓名为张三并且年龄是20的数据,密码改为747474
update users set pssword='74747' where username="张三" and age=20;

-- 更新年龄小于20的用户密码 为abc
update users set pssword='abc' where age<'20';


四、删除数据

1、DELETE 删除

-- 从表中删除所有行
DELETE FROM  表名;

-- 从表中删除特定的行
DELETE FROM  表名 [WHERE 条件]


练习

-- 删除stu表中id值为100的数据
mysql> delete from stu where id=100;

-- 删除stu表中id值为20到30的数据
mysql> delete from stu where id>=20 and id<=30;

-- 删除stu表中id值为20到30的数据
mysql> delete from stu where id between 20 and 30;
 
-- 删除stu表中id值大于200的数据
mysql> delete from stu where id>200;


2、TRUNCATE 删除

TRUNCATE TABLE 表名;


-- 清空class表的数据
truncate table class:


DELETE 和 TRUNCATE 的区别

第一:

1、delete:在删除记录的时候可以有选择的删除某些数据(使用where子句),当然,如果不添加where子句,就是删除所有记录;
2、trancete:是清空表中所有数据,没有其他选择是否删除特定数据

第二:

1、当表中的主键是自动增长(auto_increment)时,用delete删除完数据之后,再往表中插入数据,不指定主键的值,使其自动增长时,并不是从1开始,delete虽然删除了数据,但是并没有将主键自增(auto_increment)重新设为1
2、truncate不仅将数据全部清空,还将主键自增的值初始为1
3、delete只删数据,不清痕迹;trancate既删数据,又清痕迹


第三

1、效率上truncate比delete快,delete的效果有点像将mysql表中所有记录一条一条删除到删完,而truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表。

第四

1、delete 语句是数据库操作语言(dml),这操作进行事务提交之后才生效
2、truncate是数据库定义语言(ddl),执行操作之后立即生效,不需要进行事物的提交,原数据也不能回滚,数据删除后不能恢复


查看数据库的提交模式

show variables like 'autocommit'\G


你可能感兴趣的:(Python)