3.4、数据存储—MySQL数据库

目录

简介

1、MySQL

2、E-R模型

3、三范式

3、数据的完整性

(1)数据类型

(2)数据约束

一、数据库、表、数据

1、数据库的操作:

(1)创建数据库  create database dbname charset=utf8;

(2)查看所有数据库 show databases;

(3)删除数据库 drop database dbname;

(4)切换数据库 use dbname;

(5)查看当前数据库 select database();

 2、表的操作

(1)查看所有的表 show tables;

(2)创建表 create table tablename(...);

(3)修改表  alter table tablename 命令;

(4)删除表 drop table tablename;

(5)查看表结构 desc tablename

(6)表更新名字 rename table  oldname to newname

(7)查看表的创建语句 show create table tablename

3、数据的操作

(1)单条全列插入 insert into table_name values(id,name,birthday);

(2)缺省插入 insert into table_name(字段3,字段4)  values('values3','values4');

(3)批量插入 insert into table_name values(按照顺序写),(),();

(4)修改 update table_name set  字段2="新值" where 查询的条件

(5)查询所有数据 select * from table_name

(6)物理删除 delete from table_name where 删除条件

(7)逻辑删除

二、查询

1、基本查询  select * from table_name where 查询条件

(1)条件运算:  = 、  >、  >=、  <、 <=、 !=  <>

(2)逻辑运算 : and、 or 、not、 和其他运算组合写的 in 

2、模糊查询  select * from table_name where 字段  like "模糊值"

3、范围查询 select * from table_name where id in(1,3,5,7);

4、聚合查询 select count(*) from table_name  where 查询条件

(1)统计个数:select count(*) from table_name  where 查询条件

(2)列的最大值:select max(*) from table_name where 查询条件

(3)列的最小值:select min(*) from table_name where 查询条件

(4)列求和:select sumx(*) from table_name  where 查询条件

(5)列求平均值:select avg(*) from table_name  where 查询条件

 5、分组查询   select gender as "性别",count(*) from stu  group by gender;

6、索引查询

(1)创建索引: creat index IndexName on TableName(key(length))

(2)查看索引:show index from TableName

(3)删除索引:drop index IndexName on TableName

7、判断空 select * from tablename where key is null;

8、排序  order by 字段 desc;

9、分页     limit   start,count

10、去重  select distinct key from table_name;

三、关联

 1、E-R模型 (实例:学生表、学科表、成绩表的关系)

(0)E-R模型 简介

(1)方法一:建表时,增加两个外键

(2)方法二:先建表,在约束

2、多表链接查询 (实例:对学生表、学科表、成绩表 三表的关联查询 )

(1)多表查询 inner join

(2)A左链接B表  left join

(3)A 右链接B表   right join

3、自关联查询(实例:将省、城市、区县 放在一个表里面实现查询)

(1)查询省份名   pid is null 

(2)查询某一省份的城市  城市 pid = id

(3)查询某一城市的区县  区县 pid =id

四、视图 

1、创建视图  create view 视图的名字 as  sql的查询语句

2、查看视图 结果   select * from 视图名字

3、删除视图  drop view  视图名字

五、事务

1、事务四大特性 ACID

2、mysql支持事务 要求的类型:innodb,ddb

3、事务流程

(1)开启事务 begin

(2)提交事务 commit

(3)事务回滚 rollback

六、与Python交互

1、connection对象

(1)建立和数据库的链接

(2)提交事务  conn.commit()

(3) 关闭游标  cur.close()

(4)关闭链接   conn.close()

2.Cursor对象

(1)execute():执行MySQL的语句

(2)fetchone():一行数据一个元祖

(3)fetchall():一个大元组包含多个 小元祖

六、mysql的备份和恢复

1、备份   mysqldump  -u root -p db_name table_name > 备份文件绝对路径

2、恢复   mysql -u root -p db_name < 备份文件的绝对路径



简介

1、MySQL

MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:

MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:

  • 表头(header): 每一列的名称;
  • 列(col): 具有相同数据类型的数据的集合;
  • 行(row): 每一行用来描述某条记录的具体信息;
  • 值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
  • 键(key): 键的值在当前列中具有唯一性。
 连接:mysql -u root -p;    退出:exit
C:\WINDOWS\system32>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 8.0.17 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit;
Bye

 

2、E-R模型

实体-联系模型(简称E-R模型)Entity-relationship model

表表关系   1对1 1 对多  多对多

3、三范式

① 列不可拆分

② 唯一标志

③ 引用主键

3、数据的完整性

key   数据类型  数据约束


mysql> create table dog(
    -> id int auto_increment primary key,
    -> name varchar(10) not null
    -> );
Query OK, 0 rows affected (0.04 sec)

(1)数据类型

① 数字:int  decimal

② 字符串: char varchar(可变长度)  text

③ 日期 : datetime

④ 布尔 : bit

(2)数据约束

① 主键 primary key

② 非空 not null

③ 唯一 unique

④ 默认 default

⑤ 外键 foreign 

 

一、数据库、表、数据

1、数据库的操作:

(1)创建数据库  create database dbname charset=utf8;

(2)查看所有数据库 show databases;

(3)删除数据库 drop database dbname;

(4)切换数据库 use dbname;

(5)查看当前数据库 select database();

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.17    |
+-----------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)


mysql> create database animal charset=utf8;
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> create database onel charset=utf8;
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| animal             |
| information_schema |
| mysql              |
| onel               |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

mysql> use animal
Database changed

mysql> select database();
+------------+
| database() |
+------------+
| animal     |
+------------+
1 row in set (0.00 sec)

mysql> drop database onel;
Query OK, 0 rows affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| animal             |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

 2、表的操作

(1)查看所有的表 show tables;

(2)创建表 create table tablename(...);

create table tablename(

字段 类型 是否为空  是否是主键 默认值,
字段2,
字段3
);

(3)修改表  alter table tablename 命令;

增加字段:alter table tablename add 字段4 类型 是否为空 是否有默认值

删除字段:alter table tablename drop 字段1

修改字段:alter table tablename change 字段1

(4)删除表 drop table tablename;

(5)查看表结构 desc tablename

(6)表更新名字 rename table  oldname to newname

(7)查看表的创建语句 show create table tablename

mysql> select database();
+------------+
| database() |
+------------+
| animal     |
+------------+
1 row in set (0.00 sec)

mysql> use animal
Database changed

mysql> show tables;
Empty set (0.01 sec)

mysql> create table dog(
    -> id int auto_increment primary key,
    -> name varchar(10) not null
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> show tables;
+------------------+
| Tables_in_animal |
+------------------+
| dog              |
+------------------+
1 row in set (0.00 sec)



mysql> alter table dog add birthday datetime;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0


mysql> alter table dog add age int;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc dog;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(10) | NO   |     | NULL    |                |
| birthday | datetime    | YES  |     | NULL    |                |
| age      | int(11)     | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> alter table dog drop age
    -> ;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc dog;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(10) | NO   |     | NULL    |                |
| birthday | datetime    | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> rename table dog to cat;
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+------------------+
| Tables_in_animal |
+------------------+
| cat              |
+------------------+
1 row in set (0.00 sec)


mysql> show tables;
+------------------+
| Tables_in_animal |
+------------------+
| cat              |
+------------------+
1 row in set (0.00 sec)

mysql> show create table cat;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                              |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| cat   | CREATE TABLE `cat` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  `birthday` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> drop table cat;
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
Empty set (0.00 sec)


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| animal             |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

 

3、数据的操作

(1)单条全列插入 insert into table_name values(id,name,birthday);

按照表的顺序写,不可以乱   ;  主键primary 自增的操作;    全列插入的时候 写个0 站位

(2)缺省插入 insert into table_name(字段3,字段4)  values('values3','values4');

(3)批量插入 insert into table_name values(按照顺序写),(),();

insert into table_name('字段3','字段4') values(按照顺序写),(),();

(4)修改 update table_name set  字段2="新值" where 查询的条件

(5)查询所有数据 select * from table_name

(6)物理删除 delete from table_name where 删除条件

(7)逻辑删除

假的删除  1.在表中增加一个 标志是否删除的字段 isdelete  bit 0,1

                 2.如果是删除 , update修改 isdelete=1

mysql> show tables;
Empty set (0.00 sec)

mysql> create table dog(
    -> id int auto_increment primary key,
    -> name varchar(20) not null,
    -> gender bit default 0
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> show tables;
+------------------+
| Tables_in_animal |
+------------------+
| dog              |
+------------------+
1 row in set (0.00 sec)


1)单条全列插入
mysql>   insert into dog values(1,"拉布拉多",0);
Query OK, 1 row affected (0.00 sec)

mysql>   insert into dog values(2,"黄金毛",1);
Query OK, 1 row affected (0.00 sec)


2)查询所有数据 select * from table_name
mysql> select * from dog;
+----+----------+--------+
| id | name     | gender |
+----+----------+--------+
|  1 | 拉布拉多 |        |
|  2 | 黄金毛   |       |
+----+----------+--------+
2 rows in set (0.00 sec)


3)缺省插入
mysql>   insert into dog(name) values('小猎犬');
Query OK, 1 row affected (0.00 sec)

mysql>   insert into dog(name,gender) values('德国牧羊犬',1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from dog;
+----+------------+--------+
| id | name       | gender |
+----+------------+--------+
|  1 | 拉布拉多   |        |
|  2 | 黄金毛     |       |
|  3 | 小猎犬     |        |
|  4 | 德国牧羊犬 |       |
+----+------------+--------+
4 rows in set (0.00 sec)


4)批量插入
mysql> insert into dog values(5,'腊肠',0),(6,'约克夏',1);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into dog(name) values('泰式犬'),('贵宾犬'),('狮子狗');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from dog;
+----+------------+--------+
| id | name       | gender |
+----+------------+--------+
|  1 | 拉布拉多   |        |
|  2 | 黄金毛     |       |
|  3 | 小猎犬     |        |
|  4 | 德国牧羊犬 |       |
|  5 | 腊肠       |        |
|  6 | 约克夏     |       |
|  7 | 泰式犬     |        |
|  8 | 贵宾犬     |        |
|  9 | 狮子狗     |        |
+----+------------+--------+
9 rows in set (0.00 sec)

 
5)修改
mysql> update dog set name='泰迪' where id=8;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update dog set name='秋田犬' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from dog;
+----+------------+--------+
| id | name       | gender |
+----+------------+--------+
|  1 | 秋田犬     |        |
|  2 | 黄金毛     |       |
|  3 | 小猎犬     |        |
|  4 | 德国牧羊犬 |       |
|  5 | 腊肠       |        |
|  6 | 约克夏     |       |
|  7 | 泰式犬     |        |
|  8 | 泰迪       |        |
|  9 | 狮子狗     |        |
+----+------------+--------+
9 rows in set (0.00 sec)


6)删除

mysql> delete from dog where id=4;
Query OK, 1 row affected (0.00 sec)

mysql> delete from dog where id=8;
Query OK, 1 row affected (0.00 sec)

mysql> select * from dog;
+----+--------+--------+
| id | name   | gender |
+----+--------+--------+
|  1 | 秋田犬 |        |
|  2 | 黄金毛 |       |
|  3 | 小猎犬 |        |
|  5 | 腊肠   |        |
|  6 | 约克夏 |       |
|  7 | 泰式犬 |        |
|  9 | 狮子狗 |        |
+----+--------+--------+
7 rows in set (0.00 sec)


7)逻辑删除
mysql> alter table dog add isdelete bit default 0;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from dog;
+----+--------+--------+----------+
| id | name   | gender | isdelete |
+----+--------+--------+----------+
|  1 | 秋田犬 |        |          |
|  2 | 黄金毛 |       |          |
|  3 | 小猎犬 |        |          |
|  5 | 腊肠   |        |          |
|  6 | 约克夏 |       |          |
|  7 | 泰式犬 |        |          |
|  9 | 狮子狗 |        |          |
+----+--------+--------+----------+
7 rows in set (0.00 sec)

mysql> update dog set isdelete=1 where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from dog;
+----+--------+--------+----------+
| id | name   | gender | isdelete |
+----+--------+--------+----------+
|  1 | 秋田犬 |        |          |
|  2 | 黄金毛 |       |         |
|  3 | 小猎犬 |        |          |
|  5 | 腊肠   |        |          |
|  6 | 约克夏 |       |          |
|  7 | 泰式犬 |        |          |
|  9 | 狮子狗 |        |          |
+----+--------+--------+----------+
7 rows in set (0.00 sec)

二、查询

1、基本查询  select * from table_name where 查询条件

(1)条件运算:  = 、  >、  >=、  <、 <=、 !=  <>

(2)逻辑运算 : and、 or 、not、 和其他运算组合写的 in 

mysql> select * from stu;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  1 | 小明 | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|  2 | 小红 | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  3 | 小兰 | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
|  4 | 小王 | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  5 | 老王 | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
|  6 | 老刘 | 2004-01-01 00:00:00 |        |          | NULL    |    40 |
|  7 | 小丽 | 2003-01-01 00:00:00 |       |          | 东莞    |    50 |
|  8 | 小芳 | 2002-01-01 00:00:00 |       |          | 福建    |    60 |
|  9 | 小粒 | 2001-01-01 00:00:00 |        |          | 福州    |    70 |
+----+------+---------------------+--------+----------+---------+-------+
9 rows in set (0.00 sec)

mysql> select id from stu where id=7;
+----+
| id |
+----+
|  7 |
+----+
1 row in set (0.00 sec)

mysql> select * from stu where id=7;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  7 | 小丽 | 2003-01-01 00:00:00 |       |          | 东莞    |    50 |
+----+------+---------------------+--------+----------+---------+-------+
1 row in set (0.00 sec)

mysql> select * from stu where id>7;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  8 | 小芳 | 2002-01-01 00:00:00 |       |          | 福建    |    60 |
|  9 | 小粒 | 2001-01-01 00:00:00 |        |          | 福州    |    70 |
+----+------+---------------------+--------+----------+---------+-------+
2 rows in set (0.00 sec)

mysql> select * from stu where id!=7;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  1 | 小明 | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|  2 | 小红 | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  3 | 小兰 | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
|  4 | 小王 | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  5 | 老王 | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
|  6 | 老刘 | 2004-01-01 00:00:00 |        |          | NULL    |    40 |
|  8 | 小芳 | 2002-01-01 00:00:00 |       |          | 福建    |    60 |
|  9 | 小粒 | 2001-01-01 00:00:00 |        |          | 福州    |    70 |
+----+------+---------------------+--------+----------+---------+-------+
8 rows in set (0.00 sec)

mysql> select name,address from stu where id!=7;
+------+---------+
| name | address |
+------+---------+
| 小明 | 北京    |
| 小红 | 上海    |
| 小兰 | 广州    |
| 小王 | 深圳    |
| 老王 | NULL    |
| 老刘 | NULL    |
| 小芳 | 福建    |
| 小粒 | 福州    |
+------+---------+
8 rows in set (0.00 sec)

mysql> select name,address from stu where id<>7;
+------+---------+
| name | address |
+------+---------+
| 小明 | 北京    |
| 小红 | 上海    |
| 小兰 | 广州    |
| 小王 | 深圳    |
| 老王 | NULL    |
| 老刘 | NULL    |
| 小芳 | 福建    |
| 小粒 | 福州    |
+------+---------+
8 rows in set (0.00 sec)

mysql> select name from stu where name<>'老王';
+------+
| name |
+------+
| 小明 |
| 小红 |
| 小兰 |
| 小王 |
| 老刘 |
| 小丽 |
| 小芳 |
| 小粒 |
+------+
8 rows in set (0.00 sec)

mysql> select name from stu where gender=1;
+------+
| name |
+------+
| 小红 |
| 小兰 |
| 小丽 |
| 小芳 |
+------+
4 rows in set (0.00 sec)

mysql> select * from stu where gender=1 and id>4;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  7 | 小丽 | 2003-01-01 00:00:00 |       |          | 东莞    |    50 |
|  8 | 小芳 | 2002-01-01 00:00:00 |       |          | 福建    |    60 |
+----+------+---------------------+--------+----------+---------+-------+
2 rows in set (0.00 sec)

mysql> select * from stu where gender=0 or id<4;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  1 | 小明 | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|  2 | 小红 | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  3 | 小兰 | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
|  4 | 小王 | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  5 | 老王 | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
|  6 | 老刘 | 2004-01-01 00:00:00 |        |          | NULL    |    40 |
|  9 | 小粒 | 2001-01-01 00:00:00 |        |          | 福州    |    70 |
+----+------+---------------------+--------+----------+---------+-------+
7 rows in set (0.00 sec)

2、模糊查询  select * from table_name where 字段  like "模糊值"

类似于正则表达式查询,%表示 任意多个字符;_表示任意一个字符

mysql> select * from stu where name like '小%';
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  1 | 小明 | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|  2 | 小红 | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  3 | 小兰 | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
|  4 | 小王 | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  7 | 小丽 | 2003-01-01 00:00:00 |       |          | 东莞    |    50 |
|  8 | 小芳 | 2002-01-01 00:00:00 |       |          | 福建    |    60 |
|  9 | 小粒 | 2001-01-01 00:00:00 |        |          | 福州    |    70 |
+----+------+---------------------+--------+----------+---------+-------+
7 rows in set (0.00 sec)

mysql> insert into stu values(0,'张三丰','1000-01-01',0,0,'武当山',100);
Query OK, 1 row affected (0.00 sec)

mysql> select * from stu where name like '%丰';
+----+--------+---------------------+--------+----------+---------+-------+
| id | name   | birthday            | gender | isdelete | address | score |
+----+--------+---------------------+--------+----------+---------+-------+
| 10 | 张三丰 | 1000-01-01 00:00:00 |        |          | 武当山  |   100 |
+----+--------+---------------------+--------+----------+---------+-------+
1 row in set (0.00 sec)

mysql> select * from stu where name like '%三%';
+----+--------+---------------------+--------+----------+---------+-------+
| id | name   | birthday            | gender | isdelete | address | score |
+----+--------+---------------------+--------+----------+---------+-------+
| 10 | 张三丰 | 1000-01-01 00:00:00 |        |          | 武当山  |   100 |
+----+--------+---------------------+--------+----------+---------+-------+
1 row in set (0.00 sec)

mysql> select * from stu where name like '张%' or name like '%王';
+----+--------+---------------------+--------+----------+---------+-------+
| id | name   | birthday            | gender | isdelete | address | score |
+----+--------+---------------------+--------+----------+---------+-------+
|  4 | 小王   | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  5 | 老王   | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
| 10 | 张三丰 | 1000-01-01 00:00:00 |        |          | 武当山  |   100 |
+----+--------+---------------------+--------+----------+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from stu where name like '张__';
+----+--------+---------------------+--------+----------+---------+-------+
| id | name   | birthday            | gender | isdelete | address | score |
+----+--------+---------------------+--------+----------+---------+-------+
| 10 | 张三丰 | 1000-01-01 00:00:00 |        |          | 武当山  |   100 |
+----+--------+---------------------+--------+----------+---------+-------+
1 row in set (0.00 sec)

mysql> select * from stu where name like '张_';
Empty set (0.00 sec)

 

3、范围查询 select * from table_name where id in(1,3,5,7);

in 、not in、between

mysql> select * from stu where id in(1,3,5,7);
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  1 | 小明 | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|  3 | 小兰 | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
|  5 | 老王 | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
|  7 | 小丽 | 2003-01-01 00:00:00 |       |          | 东莞    |    50 |
+----+------+---------------------+--------+----------+---------+-------+
4 rows in set (0.04 sec)

mysql> select * from stu where id not in(1,3,5,7);
+----+--------+---------------------+--------+----------+---------+-------+
| id | name   | birthday            | gender | isdelete | address | score |
+----+--------+---------------------+--------+----------+---------+-------+
|  2 | 小红   | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  4 | 小王   | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  6 | 老刘   | 2004-01-01 00:00:00 |        |          | NULL    |    40 |
|  8 | 小芳   | 2002-01-01 00:00:00 |       |          | 福建    |    60 |
|  9 | 小粒   | 2001-01-01 00:00:00 |        |          | 福州    |    70 |
| 10 | 张三丰 | 1000-01-01 00:00:00 |        |          | 武当山  |   100 |
+----+--------+---------------------+--------+----------+---------+-------+
6 rows in set (0.00 sec)

mysql> select * from stu where id between 1 and 5;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  1 | 小明 | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|  2 | 小红 | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  3 | 小兰 | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
|  4 | 小王 | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  5 | 老王 | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
+----+------+---------------------+--------+----------+---------+-------+
5 rows in set (0.00 sec)

mysql> select * from stu where id between 1 and 5 and gender=1;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  2 | 小红 | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  3 | 小兰 | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
+----+------+---------------------+--------+----------+---------+-------+
2 rows in set (0.00 sec)

 

4、聚合查询 select count(*) from table_name  where 查询条件

(1)统计个数:select count(*) from table_name  where 查询条件

(2)列的最大值:select max(*) from table_name where 查询条件

(3)列的最小值:select min(*) from table_name where 查询条件

(4)列求和:select sumx(*) from table_name  where 查询条件

(5)列求平均值:select avg(*) from table_name  where 查询条件


mysql> select count(*) from stu;
+----------+
| count(*) |
+----------+
|       10 |
+----------+
1 row in set (0.00 sec)

mysql> select count(id) from stu;
+-----------+
| count(id) |
+-----------+
|        10 |
+-----------+
1 row in set (0.01 sec)


mysql> select count(*) from stu where gender=0;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)

mysql> select max(score) from stu;
+------------+
| max(score) |
+------------+
|        100 |
+------------+
1 row in set (0.00 sec)

mysql> select min(score) from stu;
+------------+
| min(score) |
+------------+
|         20 |
+------------+
1 row in set (0.00 sec)

mysql> select sum(score) from stu where gender=1;
+------------+
| sum(score) |
+------------+
|        290 |
+------------+
1 row in set (0.00 sec)


mysql> select avg(score) from stu where gender=0;
+------------+
| avg(score) |
+------------+
|    58.3333 |
+------------+
1 row in set (0.00 sec)

 5、分组查询   select gender as "性别",count(*) from stu  group by gender;

男生女生的总数:select gender as "性别",count(*) from stu  group by gender;

男生的总人数:

① select count(*) from  stu where gender=0;

② select gender as "性别",count(*) from stu group by gender having gender=0;

“having ”:分组之后 继续筛选,分组结束之后  group by 结果进行筛选

“where”:原始数据筛选

mysql> select gender,count(*) from stu group by gender;
+--------+----------+
| gender | count(*) |
+--------+----------+
|        |        6 |
|       |        4 |
+--------+----------+
2 rows in set (0.00 sec)

mysql> select  gender as 性别,count(*) from stu group by gender;
+------+----------+
| 性别 | count(*) |
+------+----------+
|      |        6 |
|     |        4 |
+------+----------+
2 rows in set (0.00 sec)


mysql> select score as 分数,count(*) from stu group by score;
+------+----------+
| 分数 | count(*) |
+------+----------+
|   90 |        1 |
|   80 |        1 |
|  100 |        2 |
|   20 |        1 |
|   30 |        1 |
|   40 |        1 |
|   50 |        1 |
|   60 |        1 |
|   70 |        1 |
+------+----------+
9 rows in set (0.00 sec)

mysql> select count(*) from stu where gender=0;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)

mysql> select gender as 性别,count(*) from stu group by gender;
+------+----------+
| 性别 | count(*) |
+------+----------+
|      |        6 |
|     |        4 |
+------+----------+
2 rows in set (0.00 sec)

mysql> select gender as 性别,count(*) from stu group by gender
    -> ;
+------+----------+
| 性别 | count(*) |
+------+----------+
|      |        6 |
|     |        4 |
+------+----------+
2 rows in set (0.00 sec)



mysql> select gender as 性别,count(*)
    -> from stu
    -> group by gender
    -> having gender=0;

+------+----------+
| 性别 | count(*) |
+------+----------+
|      |        6 |
+------+----------+
1 row in set (0.00 sec)

6、索引查询

索引查询,查询效率最高

1、提高效率的方法:

(1)数据类型越小越好,如int

(2)能用整型最好

(3)不适用NULL,用0,“ ”,特殊符号代替

2、验证执行时间流程:

(1)set profiling=1

(2)查询内容

(3)show profiles

3、索引查询

(1)创建索引: creat index IndexName on TableName(key(length))

(2)查看索引:show index from TableName

(3)删除索引:drop index IndexName on TableName

mysql> select * from areas where title="贵州省";
+--------+--------+------+
| id     | title  | pid  |
+--------+--------+------+
| 520000 | 贵州省 | NULL |
+--------+--------+------+
1 row in set (0.00 sec)

mysql> show profiles;
+----------+------------+-----------------------------------------+
| Query_ID | Duration   | Query                                   |
+----------+------------+-----------------------------------------+
|        1 | 0.00196375 | select * from areas where title="?????" |
+----------+------------+-----------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> create index titleIndex on areas(title(50));
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from areas where title="贵州省";
+--------+--------+------+
| id     | title  | pid  |
+--------+--------+------+
| 520000 | 贵州省 | NULL |
+--------+--------+------+
1 row in set (0.00 sec)

mysql> show profiles;
+----------+------------+---------------------------------------------+
| Query_ID | Duration   | Query                                       |
+----------+------------+---------------------------------------------+
|        1 | 0.00196375 | select * from areas where title="?????"     |
|        2 | 0.07919425 | create index titleIndex on areas(title(50)) |
|        3 | 0.00048900 | select * from areas where title="?????"     |
+----------+------------+---------------------------------------------+
3 rows in set, 1 warning (0.00 sec)

mysql> show index from areas;
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| areas |          0 | PRIMARY    |            1 | id          | A         |        3258 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| areas |          1 | pid        |            1 | pid         | A         |         372 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
| areas |          1 | titleIndex |            1 | title       | A         |        3205 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
3 rows in set (0.02 sec)

mysql>  drop index titleIndex on areas;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

7、判断空 select * from tablename where key is null;

null 、 not null

查询符号的优先级:

()>   not  >  条件运算  > and  > or

mysql> select * from stu where address is null;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  5 | 老王 | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
|  6 | 老刘 | 2004-01-01 00:00:00 |        |          | NULL    |    40 |
+----+------+---------------------+--------+----------+---------+-------+
2 rows in set (0.00 sec)

mysql> select * from stu where address is not null;
+----+--------+---------------------+--------+----------+---------+-------+
| id | name   | birthday            | gender | isdelete | address | score |
+----+--------+---------------------+--------+----------+---------+-------+
|  1 | 小明   | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|  2 | 小红   | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  3 | 小兰   | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
|  4 | 小王   | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  7 | 小丽   | 2003-01-01 00:00:00 |       |          | 东莞    |    50 |
|  8 | 小芳   | 2002-01-01 00:00:00 |       |          | 福建    |    60 |
|  9 | 小粒   | 2001-01-01 00:00:00 |        |          | 福州    |    70 |
| 10 | 张三丰 | 1000-01-01 00:00:00 |        |          | 武当山  |   100 |
+----+--------+---------------------+--------+----------+---------+-------+
8 rows in set (0.00 sec)

mysql> select * from stu where address is not null and gender=1;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  2 | 小红 | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  3 | 小兰 | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
|  7 | 小丽 | 2003-01-01 00:00:00 |       |          | 东莞    |    50 |
|  8 | 小芳 | 2002-01-01 00:00:00 |       |          | 福建    |    60 |
+----+------+---------------------+--------+----------+---------+-------+
4 rows in set (0.00 sec)

8、排序  order by 字段 desc;

order by 字段 asc : 升序 (默认)

order by 字段 desc:降序 

mysql> select * from stu
    -> where isdelete=0
    -> order by score desc;

+----+--------+---------------------+--------+----------+---------+-------+
| id | name   | birthday            | gender | isdelete | address | score |
+----+--------+---------------------+--------+----------+---------+-------+
|  3 | 小兰   | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
| 10 | 张三丰 | 1000-01-01 00:00:00 |        |          | 武当山  |   100 |
|  1 | 小明   | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|  2 | 小红   | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  9 | 小粒   | 2001-01-01 00:00:00 |        |          | 福州    |    70 |
|  8 | 小芳   | 2002-01-01 00:00:00 |       |          | 福建    |    60 |
|  7 | 小丽   | 2003-01-01 00:00:00 |       |          | 东莞    |    50 |
|  6 | 老刘   | 2004-01-01 00:00:00 |        |          | NULL    |    40 |
|  5 | 老王   | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
|  4 | 小王   | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
+----+--------+---------------------+--------+----------+---------+-------+
10 rows in set (0.00 sec)



mysql> select * from stu
    -> where gender=0
    -> order by id desc;

+----+--------+---------------------+--------+----------+---------+-------+
| id | name   | birthday            | gender | isdelete | address | score |
+----+--------+---------------------+--------+----------+---------+-------+
| 10 | 张三丰 | 1000-01-01 00:00:00 |        |          | 武当山  |   100 |
|  9 | 小粒   | 2001-01-01 00:00:00 |        |          | 福州    |    70 |
|  6 | 老刘   | 2004-01-01 00:00:00 |        |          | NULL    |    40 |
|  5 | 老王   | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
|  4 | 小王   | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  1 | 小明   | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
+----+--------+---------------------+--------+----------+---------+-------+
6 rows in set (0.00 sec)



mysql> select * from stu
    -> where gender=0;

+----+--------+---------------------+--------+----------+---------+-------+
| id | name   | birthday            | gender | isdelete | address | score |
+----+--------+---------------------+--------+----------+---------+-------+
|  1 | 小明   | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|  4 | 小王   | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  5 | 老王   | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
|  6 | 老刘   | 2004-01-01 00:00:00 |        |          | NULL    |    40 |
|  9 | 小粒   | 2001-01-01 00:00:00 |        |          | 福州    |    70 |
| 10 | 张三丰 | 1000-01-01 00:00:00 |        |          | 武当山  |   100 |
+----+--------+---------------------+--------+----------+---------+-------+
6 rows in set (0.00 sec)

9、分页     limit   start,count

在实际开发中 涉及到的是 数学计算问题

mysql> select * from stu
    -> limit 0,3;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  1 | 小明 | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|  2 | 小红 | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  3 | 小兰 | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
+----+------+---------------------+--------+----------+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from stu
    -> limit 3,2;
+----+------+---------------------+--------+----------+---------+-------+
| id | name | birthday            | gender | isdelete | address | score |
+----+------+---------------------+--------+----------+---------+-------+
|  4 | 小王 | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  5 | 老王 | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
+----+------+---------------------+--------+----------+---------+-------+
2 rows in set (0.00 sec)

 

10、去重  select distinct key from table_name;

去重 列 中的内容

mysql> select address from stu;
+---------+
| address |
+---------+
| 北京    |
| 上海    |
| 广州    |
| 深圳    |
| NULL    |
| NULL    |
| 东莞    |
| 福建    |
| 福州    |
| 武当山  |
+---------+
10 rows in set (0.00 sec)

mysql> select distinct address from stu;
+---------+
| address |
+---------+
| 北京    |
| 上海    |
| 广州    |
| 深圳    |
| NULL    |
| 东莞    |
| 福建    |
| 福州    |
| 武当山  |
+---------+
9 rows in set (0.00 sec)

 

三、关联

 1、E-R模型 (实例:学生表、学科表、成绩表的关系)

思路:成绩表scores的stuid subid ,分别通过外键foreign,链接学生表stu、学科表subjects的id

(0)E-R模型 简介

① 实体-联系模型(简称E-R模型)Entity-relationship model

② 表表关系   1对1 1 对多  多对多 (不建议表和表之间建立 循环的关系闭合)

③ 多表约束 产生关系,如果有删除修改操作, 对应的关联表数据  就会报错,通过逻辑删除可以解决这个问题 

(1)方法一:建表时,增加两个外键

foreign key(stuid) references stu(id),

foreign key(subid) references subjects(id),

mysql> show tables;
+------------------+
| Tables_in_animal |
+------------------+
| stu              |
| subjects         |
+------------------+
2 rows in set (0.01 sec)

mysql> create table scores(
    -> id int primary key auto_increment,
    -> stuid int,
    -> subid int,
    -> score decimal(5,2),
    -> foreign key(stuid) references stu(id),
    -> foreign key(subid) references subjects(id)
    -> );
Query OK, 0 rows affected (0.07 sec)

mysql> insert into scores values(0,1,1,80),(0,2,2,60),(0,2,3,70),(0,3,1,90),(0,4,4,60),(0,5,2,75);
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from scores;
+----+-------+-------+-------+
| id | stuid | subid | score |
+----+-------+-------+-------+
|  1 |     1 |     1 | 80.00 |
|  2 |     2 |     2 | 60.00 |
|  3 |     2 |     3 | 70.00 |
|  4 |     3 |     1 | 90.00 |
|  5 |     4 |     4 | 60.00 |
|  6 |     5 |     2 | 75.00 |
+----+-------+-------+-------+
6 rows in set (0.00 sec)

② 方法二:先建表,在约束

alter table scores add contraint stu foreign key (stuid)  references stu(id) on delete cascade

cascade 级联关系,一删除 有关联的表 全部删除

restrict 限制关系

set null 外键制空

no action

2、多表链接查询 (实例:对学生表、学科表、成绩表 三表的关联查询 )

(1)多表查询 inner join

查询学生的名字 学科对应的成绩

(2)A左链接B表  left join

查询结果 以A为基准操作

(3)A 右链接B表   right join

查询结果 以B为基准


mysql> select stu.sname,subjects.stitle,scores.score
    -> from scores
    -> inner join left stu on scores.stuid=stu.id
    -> inner join subjects on scores.subid=subjects.id;

+------+-------+-------+
| name | title | score |
+------+-------+-------+
| 小明 | 语文  | 80.00 |
| 小兰 | 语文  | 90.00 |
| 小红 | 数学  | 60.00 |
| 老王 | 数学  | 75.00 |
| 小红 | 英语  | 70.00 |
| 小王 | 科学  | 60.00 |
+------+-------+-------+
6 rows in set (0.00 sec)


mysql> select stu.name,subjects.title,scores.score
    -> from scores
    -> left join stu on scores.stuid=stu.id
    -> left join subjects on scores.subid=subjects.id;
+------+-------+-------+
| name | title | score |
+------+-------+-------+
| 小明 | 语文  | 80.00 |
| 小红 | 数学  | 60.00 |
| 小红 | 英语  | 70.00 |
| 小兰 | 语文  | 90.00 |
| 小王 | 科学  | 60.00 |
| 老王 | 数学  | 75.00 |
+------+-------+-------+
6 rows in set (0.00 sec)

mysql> select stu.name,avg(scores.score)
    -> from scores
    -> inner join stu on scores.stuid=stu.id
    -> group by stu.name;
+------+-------------------+
| name | avg(scores.score) |
+------+-------------------+
| 小明 |         80.000000 |
| 小红 |         65.000000 |
| 小兰 |         90.000000 |
| 小王 |         60.000000 |
| 老王 |         75.000000 |
+------+-------------------+
5 rows in set (0.01 sec)

mysql> select stu.name,sum(scores.score)
    -> from scores
    -> inner join stu on scores.stuid=stu.id
    -> where stu.gender=0
    -> group by stu.name;
+------+-------------------+
| name | sum(scores.score) |
+------+-------------------+
| 小明 |             80.00 |
| 小王 |             60.00 |
| 老王 |             75.00 |
+------+-------------------+
3 rows in set (0.00 sec)

mysql> select stu.name,max(scores.score)
    -> from scores
    -> inner join stu on scores.stuid=stu.id
    -> where stu.id<5
    -> group by stu.name;
+------+-------------------+
| name | max(scores.score) |
+------+-------------------+
| 小明 |             80.00 |
| 小红 |             70.00 |
| 小兰 |             90.00 |
| 小王 |             60.00 |
+------+-------------------+
4 rows in set (0.00 sec)
mysql> select * from
    -> scores
    -> left join stu on scores.stuid=stu.id;

+----+-------+-------+-------+------+------+---------------------+--------+----------+---------+-------+
| id | stuid | subid | score | id   | name | birthday            | gender | isdelete | address | score |
+----+-------+-------+-------+------+------+---------------------+--------+----------+---------+-------+
|  1 |     1 |     1 | 80.00 |    1 | 小明 | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|  2 |     2 |     2 | 60.00 |    2 | 小红 | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  3 |     2 |     3 | 70.00 |    2 | 小红 | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|  4 |     3 |     1 | 90.00 |    3 | 小兰 | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
|  5 |     4 |     4 | 60.00 |    4 | 小王 | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|  6 |     5 |     2 | 75.00 |    5 | 老王 | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
+----+-------+-------+-------+------+------+---------------------+--------+----------+---------+-------+
6 rows in set (0.03 sec)



mysql> select * from
    -> scores
    -> right join stu on scores.stuid=stu.id;

+------+-------+-------+-------+----+--------+---------------------+--------+----------+---------+-------+
| id   | stuid | subid | score | id | name   | birthday            | gender | isdelete | address | score |
+------+-------+-------+-------+----+--------+---------------------+--------+----------+---------+-------+
|    1 |     1 |     1 | 80.00 |  1 | 小明   | 2008-01-01 00:00:00 |        |          | 北京    |    90 |
|    2 |     2 |     2 | 60.00 |  2 | 小红   | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|    3 |     2 |     3 | 70.00 |  2 | 小红   | 2007-01-01 00:00:00 |       |          | 上海    |    80 |
|    4 |     3 |     1 | 90.00 |  3 | 小兰   | 2006-01-01 00:00:00 |       |          | 广州    |   100 |
|    5 |     4 |     4 | 60.00 |  4 | 小王   | 2005-01-01 00:00:00 |        |          | 深圳    |    20 |
|    6 |     5 |     2 | 75.00 |  5 | 老王   | 2009-01-01 00:00:00 |        |          | NULL    |    30 |
| NULL |  NULL |  NULL |  NULL |  6 | 老刘   | 2004-01-01 00:00:00 |        |          | NULL    |    40 |
| NULL |  NULL |  NULL |  NULL |  7 | 小丽   | 2003-01-01 00:00:00 |       |          | 东莞    |    50 |
| NULL |  NULL |  NULL |  NULL |  8 | 小芳   | 2002-01-01 00:00:00 |       |          | 福建    |    60 |
| NULL |  NULL |  NULL |  NULL |  9 | 小粒   | 2001-01-01 00:00:00 |        |          | 福州    |    70 |
| NULL |  NULL |  NULL |  NULL | 10 | 张三丰 | 1000-01-01 00:00:00 |        |          | 武当山  |   100 |
+------+-------+-------+-------+----+--------+---------------------+--------+----------+---------+-------+
11 rows in set (0.00 sec)

 

3、自关联查询(实例:将省、城市、区县 放在一个表里面实现查询)

当数据量不大时,采用自关联

案例:将省、城市、区县 放在一个表里面实现数据存储和查询

(1)查询省份名   pid is null 

(2)查询某一省份的城市  城市 pid = id

(3)查询某一城市的区县  区县 pid =id

mysql> desc areas
    -> ;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| title | varchar(50) | YES  |     | NULL    |       |
| pid   | int(11)     | YES  | MUL | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from areas limit 0,10;
+--------+----------+--------+
| id     | title    | pid    |
+--------+----------+--------+
| 110000 | 北京市   |   NULL |
| 110100 | 北京市   | 110000 |
| 110101 | 东城区   | 110100 |
| 110102 | 西城区   | 110100 |
| 110103 | 朝阳区   | 110100 |
| 110104 | 丰台区   | 110100 |
| 110105 | 石景山区 | 110100 |
| 110106 | 海淀区   | 110100 |
| 110107 | 门头沟区 | 110100 |
| 110108 | 房山区   | 110100 |
+--------+----------+--------+
10 rows in set (0.00 sec)

mysql> select * from areas where pid is null;
+--------+------------------+------+
| id     | title            | pid  |
+--------+------------------+------+
| 110000 | 北京市           | NULL |
| 120000 | 天津市           | NULL |
| 130000 | 河北省           | NULL |
| 140000 | 山西省           | NULL |
| 150000 | 内蒙古自治区     | NULL |
| 210000 | 辽宁省           | NULL |
| 220000 | 吉林省           | NULL |
| 230000 | 黑龙江省         | NULL |
| 310000 | 上海市           | NULL |
| 320000 | 江苏省           | NULL |
| 330000 | 浙江省           | NULL |
| 340000 | 安徽省           | NULL |
| 341402 | 居巢区           | NULL |
| 350000 | 福建省           | NULL |
| 360000 | 江西省           | NULL |
| 370000 | 山东省           | NULL |
| 410000 | 河南省           | NULL |
| 420000 | 湖北省           | NULL |
| 430000 | 湖南省           | NULL |
| 440000 | 广东省           | NULL |
| 450000 | 广西壮族自治区   | NULL |
| 460000 | 海南省           | NULL |
| 500000 | 重庆市           | NULL |
| 510000 | 四川省           | NULL |
| 520000 | 贵州省           | NULL |
| 530000 | 云南省           | NULL |
| 540000 | 西藏自治区       | NULL |
| 610000 | 陕西省           | NULL |
| 620000 | 甘肃省           | NULL |
| 630000 | 青海省           | NULL |
| 640000 | 宁夏回族自治区   | NULL |
| 650000 | 新疆维吾尔自治区 | NULL |
| 990000 | 新疆建设兵团     | NULL |
+--------+------------------+------+
33 rows in set (0.00 sec)

mysql> select city.* from areas as city
    -> inner join areas as province on city.pid=province.id
    -> where province.title="陕西省";
+--------+------------+--------+
| id     | title      | pid    |
+--------+------------+--------+
| 610100 | 西安市     | 610000 |
| 610200 | 铜川市     | 610000 |
| 610300 | 宝鸡市     | 610000 |
| 610400 | 咸阳市     | 610000 |
| 610500 | 渭南市     | 610000 |
| 610600 | 延安市     | 610000 |
| 610700 | 汉中市     | 610000 |
| 610800 | 榆林市     | 610000 |
| 610900 | 安康市     | 610000 |
| 611000 | 商洛市     | 610000 |
| 611100 | 杨凌示范区 | 610000 |
+--------+------------+--------+
11 rows in set (0.00 sec)

mysql> select district.* from areas as district
    -> inner join areas as city on city.id=district.pid
    -> where city.title="西安市";
+--------+--------+--------+
| id     | title  | pid    |
+--------+--------+--------+
| 610101 | 长安区 | 610100 |
| 610102 | 新城区 | 610100 |
| 610103 | 碑林区 | 610100 |
| 610104 | 莲湖区 | 610100 |
| 610111 | 灞桥区 | 610100 |
| 610112 | 未央区 | 610100 |
| 610113 | 雁塔区 | 610100 |
| 610114 | 阎良区 | 610100 |
| 610115 | 临潼区 | 610100 |
| 610122 | 蓝田县 | 610100 |
| 610124 | 周至县 | 610100 |
| 610125 | 户县   | 610100 |
| 610126 | 高陵县 | 610100 |
+--------+--------+--------+
13 rows in set (0.00 sec)

 

四、视图 

对于复杂查询进行封装,便于调用

1、创建视图  create view 视图的名字 as  sql的查询语句

2、查看视图 结果   select * from 视图名字

3、删除视图  drop view  视图名字

mysql> create view studentsscore as
    -> select stu.name,scores.score from scores
    -> inner join stu on scores.stuid=stu.id;
Query OK, 0 rows affected (0.01 sec)


mysql> create view zuidazhi as
    -> select stu.name,max(scores.score)
    -> from scores
    -> inner join stu on scores.stuid=stu.id
    -> where stu.id<5
    -> group by stu.name;
Query OK, 0 rows affected (0.01 sec)



mysql> show tables
    -> ;
+------------------+
| Tables_in_animal |
+------------------+
| scores           |
| stu              |
| studentsscore    |
| subjects         |
| zuidazhi         |
+------------------+
5 rows in set (0.00 sec)



mysql> select * from studentsscore;
+------+-------+
| name | score |
+------+-------+
| 小明 | 80.00 |
| 小红 | 60.00 |
| 小红 | 70.00 |
| 小兰 | 90.00 |
| 小王 | 60.00 |
| 老王 | 75.00 |
+------+-------+
6 rows in set (0.00 sec)

mysql> select * from zuidazhi;
+------+-------------------+
| name | max(scores.score) |
+------+-------------------+
| 小明 |             80.00 |
| 小红 |             70.00 |
| 小兰 |             90.00 |
| 小王 |             60.00 |
+------+-------------------+
4 rows in set (0.00 sec)

mysql> drop table zuidazhi;
ERROR 1051 (42S02): Unknown table 'animal.zuidazhi'

mysql> drop view zuidazhi;;
Query OK, 0 rows affected (0.01 sec)

五、事务

1、事务四大特性 ACID

(1)原子性A

(2)一致性C

(3)隔离性I

(4)持久性D

2、mysql支持事务 要求的类型:innodb,ddb

3、事务流程

(1)开启事务 begin

(2)提交事务 commit

(3)事务回滚 rollback

sell1: 开启事务,相当于先写入缓存区,缓存区可以看见插入的数据


mysql> select * from subjects;
+----+-------+
| id | title |
+----+-------+
|  1 | 语文  |
|  2 | 数学  |
|  3 | 英语  |
|  4 | 科学  |
|  5 | AI    |
+----+-------+
5 rows in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into subjects values(0,'人工智能');
Query OK, 1 row affected (0.00 sec)

mysql> select * from subjects;
+----+----------+
| id | title    |
+----+----------+
|  1 | 语文     |
|  2 | 数学     |
|  3 | 英语     |
|  4 | 科学     |
|  5 | AI       |
|  6 | 人工智能 |
+----+----------+
6 rows in set (0.00 sec)c)

sell1中事务插入了“人工智能”,sell2真实数据库中还没有存在,需要提交

sell2:

mysql> select * from subjects;
+----+-------+
| id | title |
+----+-------+
|  1 | 语文  |
|  2 | 数学  |
|  3 | 英语  |
|  4 | 科学  |
|  5 | AI    |
+----+-------+
5 rows in set (0.00 sec)

sell1:提交事务后,写入数据库

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

sell2:

mysql> select * from subjects;
+----+----------+
| id | title    |
+----+----------+
|  1 | 语文     |
|  2 | 数学     |
|  3 | 英语     |
|  4 | 科学     |
|  5 | AI       |
|  6 | 人工智能 |
+----+----------+
6 rows in set (0.00 sec)

sell1:回滚事务,相当于撤销缓存区中上一步的操作


mysql> insert into subjects values(0,'电路');
Query OK, 1 row affected (0.00 sec)

mysql> select * from subjects;
+----+----------+
| id | title    |
+----+----------+
|  1 | 语文     |
|  2 | 数学     |
|  3 | 英语     |
|  4 | 科学     |
|  5 | AI       |
|  6 | 人工智能 |
|  7 | 电路     |
+----+----------+
7 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from subjects;
+----+----------+
| id | title    |
+----+----------+
|  1 | 语文     |
|  2 | 数学     |
|  3 | 英语     |
|  4 | 科学     |
|  5 | AI       |
|  6 | 人工智能 |
+----+----------+
6 rows in set (0.00 sec)

六、与Python交互

1、connection对象

(1)建立和数据库的链接

 host="localhost",
 port=3306,
 db='animal',
 user='root',
 passwd="123456",
 charset='utf8'

(2)提交事务  conn.commit()
(3) 关闭游标  cur.close()
(4)关闭链接   conn.close()

2.Cursor对象

(1)execute():执行MySQL的语句

(2)fetchone():一行数据一个元祖

(3)fetchall():一个大元组包含多个 小元祖

# 安装 pip install pymysql

import pymysql

try:
'''一.链接 数据库  链接对象 connection() '''
    conn = pymysql.Connect(
        host="localhost",
        port=3306,
        db='animal',
        user='root',
        passwd="123456",
        charset='utf8'
    )
'''二. 创建 游标对象 cursor() '''
    cur = conn.cursor()

    '''1、增加一条数据 科目表--GO语言'''
    # insert_sub = 'insert into subjects values(0,"GO语言")'
    # result = cur.execute(insert_sub)
    # print(result)

    '''2、修改'''
    update_sub = 'update subjects set title="区块链" where id=7'
    result = cur.execute(update_sub)

    '''3、删除'''
    # delete_sub = 'delete from  stu  where id=8'
    # result = cur.execute(delete_sub)

    # select_sub = 'select * from subjects where id=1'
    # cur.execute(select_sub)
    # result = cur.fetchall()
    # result = cur.fetchone()
    # print(result)

    # for res in result:
    #
    #     print(result)

'''三、提交事务'''
    conn.commit()

'''四、关闭游标'''
    cur.close()

'''五、关闭链接'''
    conn.close()

except Exception as e:
    print(e)

六、mysql的备份和恢复

1、备份   mysqldump  -u root -p db_name table_name > 备份文件绝对路径

mysqldump  -u root -p 123456 animal stu > D:\beifen

2、恢复   mysql -u root -p db_name < 备份文件的绝对路径

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值