Python 第四十二章 mysql 级联+查询

摘要:
字段n)SELECT(字段1、字段2、字段3

删除或修改被关联字段

场景:book表和publish表为多对一关系,book表的pid字段外键关联到了publish表的id字段
1 查看外键关系名称:
	show create table book;	
        | book  | CREATE TABLE `book` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `name` char(10) DEFAULT NULL,
          `pid` int(11) DEFAULT NULL,
          PRIMARY KEY (`id`),
          KEY `pid` (`pid`),
          CONSTRAINT `book_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `publish` (`id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |



2 删除外键关系
	alter table book drop foreign key book_ibfk_1(外键名称);
3 删除字段
	alter table publish drop id(字段名称);
4 添加字段
	alter table publish add id(字段名称) int(数据类型) primary key auto_increment(约束条件);

5 创建表完成之后,后添加外键关系
	alter table book add foreign key(pid) references publish(id);
	

创建外键时指定外键名称

创建表时:
create table t1(
	id int,
	pid int,
	constraint fk_t1_publish foreign key(pid) references publish(id);
)
创建表完成之后,后添加外键关系
	alter table book add constraint fk_t1_publish foreign key(pid) references publish(id);

级联

级联有几个模式

严格模式(默认的),外键有强制约束效果,被关联字段不能随意删除和修改

模式(cascade):外键有强制约束效果,被关联字段删除或者修改,关联他的那么字段数据会随之删除或者修改

constraint fk_t1_publish foreign key(pid) references publish(id) on delete cascade on update cascade;

set null模式: 被关联字段删除时,关联他的字段数据会置成null

修改表.

行记录的操作

增加insert

insert into 表名 values(字段1,字段2...);
insert into 表名(id,name) values(字段1,字段2),(xx1,xx2);  id,name,age

 插入查询结果
    语法:
    INSERT INTO 表名(字段1,字段2,字段3…字段n) 
                    SELECT (字段1,字段2,字段3…字段n) FROM 表2
                    WHERE …; #将从表2里面查询出来的结果来插入到我们的表中,但是注意查询出来的数据要和我们前面指定的字段要对应好

修改update

语法:
    UPDATE 表名 SET 
        字段1=值1,  #注意语法,可以同时来修改多个值,用逗号分隔
        字段2=值2,
        WHERE CONDITION; #更改哪些数据,通过where条件来定位到符合条件的数据
        
mysql> update t2 set name='xxoo' where id = 1;
注意:不指定后面的where条件的话,会修改这个字段所有的数据

删除记录 delete

 delete from t3;  删除所有的数据,但是不会重置自增字段的数据号
  delete from t3 where id = 1;删除指定的数据,删除id字段数据为1的那一行记录
  清空表
  truncate 表名;  自增字段会重置

查询(*****)

四则运算:
	SELECT salary*12 FROM employee;

自定义显示格式 concat用法
	SELECT CONCAT('姓名: ',name,'  年薪: ', salary*12)  AS Annual_salary FROM employee;


where 条件

1. 比较运算符:> < >= <= <> !=
	SELECT name FROM employee WHERE post='sale'; 

2. between 10 and 15  id值在10到15之间 #大于等于和小于等于的区间
	mysql> select * from employee where id between 10 and 15
3. in(1,3,6)  值是80或90或100
	select * from employee where id in(1,3,6)  等价于id=1 or id=3 or id=6;
4. like 'egon%'
      pattern可以是%或_,
      %表示任意多字符
      	select * from employee where name like "wu%";
      _表示一个字符 
      	select * from employee where name like "al_";结果空
      	select * from employee where name like "al__";#结果alex
      	mysql> select * from employee where name like "al___"; 三个下划线的无法匹配到alex,结果为空

5. 逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not
	select * from employee id>10 and name like "al%";
	select * from employee not id>10;id小于等于10的,not取反

分组 group by

示例:
	# 统计每个岗位的名称以及最高工资
	select post,max(salary) from employee group by post;
	
	分组时可以跟多个条件,那么这个多个条件同时重复才算是一组,group by 后面多条件用逗号分隔
	select post,max(salary) from employee group by post,id;

ONLY_FULL_GROUP_BY模式
set global sql_mode='ONLY_FULL_GROUP_BY';
如果设置了这个模式,那么select后面只能写group by后面的分组依据字段和聚合函数统计结果

分组再过滤,having

select post,max(salary) from employee group by post having max(salary)>20000;
having过滤后面的条件可以使用聚合函数,where不行

去重 distinct

示例:
	 select distinct post from employee;
注意问题:select的字段必须写在distinct的后面,并且如果写了多个字段,比如:
	select distinct post,id from employee;这句话,意思就是post和id两个组合在一起同时重复的才算是重复数据


排序order by

示例:
	select * from employee order by age;
	select * from employee order by age asc;
	上面这两种写法都是按照age字段来进行升序排列
	select * from employee order by age desc;
	desc是降序排列
	
	多条件排序
	按照age字段升序,age相同的数据,按照salary降序排列
	select * from employee order by age asc ,salary esc;
	
	

补充:级联set null的用法和示例

mysql> create table tt2(id int primary key auto_increment,name char(10));

mysql> create table tt3(id int,pid int,foreign key(pid) references tt2(id) on delete set null);
Query OK, 0 rows affected (1.06 sec)

mysql> desc tt3;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| pid   | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> insert into tt2(name) values('xx1'),('xx2');
Query OK, 2 rows affected (0.14 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into tt3 values(1,1),(2,1);
Query OK, 2 rows affected (0.12 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from tt3;
+------+------+
| id   | pid  |
+------+------+
|    1 |    1 |
|    2 |    1 |
+------+------+
2 rows in set (0.00 sec)

mysql> delete from tt2 where id = 1;
Query OK, 1 row affected (0.10 sec)

mysql> select * from tt3;
+------+------+
| id   | pid  |
+------+------+
|    1 | NULL |
|    2 | NULL |
+------+------+
2 rows in set (0.00 sec)

免责声明:文章转载自《Python 第四十二章 mysql 级联+查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇js小功能合集:计算指定时间距今多久、评论树核心代码、字符串替换和去除。Ubuntu系统配置系列1——更新软件源下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MYSQL8.0+ 使用JDBC查询中文乱码的问题

在建表时,附加一句  DROP TABLE IF EXISTS `sys_table`;CREATE TABLE `sys_table` ( ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8;set names gb2312; navicat 如果出现中文乱码,可以查看mysql的字符集和navicat字符集是否统一,使用 ...

MySQL/MariaDB数据库的索引工作原理和优化

MySQL/MariaDB数据库的索引工作原理和优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 实际工作中索引这个技术是影响服务器性能一个非常重要的指标,因此我们得花时间去了解一下索引的相关特性。索引是一把双刃剑用得好可以快速查询数据,用得不好数据库查询速度不仅慢还降低服务器性能,浪费磁盘空间。 一.索引概述 1>.什么是索引...

python——模块(Module)的概念、使用以及安装第三方模块

一、模块定义 python中,一个.py文件就是一个模块(Module)。使用模块的好处:1、提高了代码的可维护性。我们把函数进行分组,分别放在不同的模块中。2、编写代码不必要从0开始,当一个模块编写完毕,就可以被其他的模块引用。python有很多内置的模块和第三方模块供引用。3、可以避免函数名和变量名重复。相同的函数名和变量名可以同时存在于不同的模块中。...

ZH奶酪:【Python】random模块

Python中的random模块用于随机数生成,对几个random模块中的函数进行简单介绍。如下:random.random() 用于生成一个0到1的随机浮点数。如: import random random.random() 输出: 0.3701787746508932 random.uniform(a,b) 用于生成一个指定范围内的随机浮点数,两个参...

mysql 视图

一、使用视图的理由是什么?1.安全性。一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限。 2.查询性能提高。3.有灵活性的功能需求后,需要改动表的结构而导致工作量比较大。那么可以使用虚拟表的形式达到少修改的效果。这是在实际开发中比较有用的。例子:假如因为某...

Nacos微服务部署(超详细)基于Centos7

目录 Nacos集群部署与持久化 准备环境 Linux-Centos-7安装Mysql5.7数据库 Nacos压缩包上传及Mysql数据库配置 Nacos集群部署 Nginx负载均衡部署 Nginx整合Nacos Nacos集群部署与持久化 准备环境 请确保是在环境中安装使用: 64 bit OS Linux/Unix/Mac,推荐使用Li...