表查询(下)

表查询(下)

一 、联合分组

按多个字段综合结果进行分组

#数据来源:在单表student下
#按 area与port组合后的结果进行分组,只有组合后的结果还一致,才认为是一组
eg:
select group_concat(name),area,port from emp group by area,port;
--------------------+--------+-----------+
| group_concat(name) | area   | port      |
+--------------------+--------+-----------+
| yangsir,san1,san   | 上海   | 浦东      |
| san2               | 上海   | 浦西      |
| ruakei             | 上海   | 陆家嘴    |
| zero               | 中国   | 黄浦      |
| owen               | 安徽   | 宣城      |
| jason              | 安徽   | 巢湖      |
| ying               | 安徽   | 芜湖      |
| kevin,engo         | 山东   | 济南      |
| monkey             | 山东   | 青岛      |
| tank               | 广州   | 广东      |
| jerry              | 江苏   | 张家港    |
| jiboy              | 江苏   | 苏州      |
+--------------------+--------+-----------+

二、子查询

子查询:将一条查询sql的结果作为另一条查询sql的条件

#insert into 表 select 子查询

# select fron 表 where() in (select 子查询)[表不能与delete表相同]
'''查每个学校身高最高的那个人的全部信息'''

1)#子查询的sql
select school,max(height) from student group by school;
#先查询出每个学校的最大身高
+--------+-------------+
| school | max(height) |
+--------+-------------+
| 北大   | 183.1       |
| 复旦   | 183.3       |
| 清华   | 185.9       |
+--------+-------------+

2)#查
select * from student where (school,height) in (select school,max(height) from student group by school);
+----+------+--------+--------+--------+--------+--------+
| id | name | gender | height | area   | port   | school |
+----+------+--------+--------+--------+--------+--------+
|  2 | bbb  | 男     | 183.1  | 上海   | 青浦   | 北大   |
|  3 | ccc  | 男     | 183.3  | 北京   | 朝阳   | 复旦   |
|  4 | ddd  | 男     | 185.9  | 广东   | 广州   | 清华   |
+----+------+--------+--------+--------+--------+--------+
# 将子查询转换为一张表

1)# 创建一个存子查询数据的一张表
create table school_height(
school_name varchar(64),
max_height varchar(64));

2)#将子查询的数据增加到school_height表中
insert into school_height select school,max(height) from student group by school;
+-------------+------------+
| school_name | max_height |
+-------------+------------+
| 北大        | 183.1      |
| 复旦        | 183.3      |
| 清华        | 185.9      |
+-------------+------------+

3)#需求(同样也会实现上面的需求)
select name,school_name,height
from student join school_height
on student.school = school_height.school_name
and student.height = school_height.max_height;
+------+-------------+--------+
| name | school_name | height |
+------+-------------+--------+
| bbb  | 北大        | 183.1  |
| ccc  | 复旦        | 183.3  |
| ddd  | 清华        | 185.9  |
+------+-------------+--------+

# update 表 set 字段=值 where 字段 in (select 子查询)[表不能与delete表相同]

'''每个部门最大身高加一'''
update school_height set max_height=max_height+1;
+-------------+------------+
| school_name | max_height |
+-------------+------------+
| 北大        | 184.1      |
| 复旦        | 184.3      |
| 清华        | 186.9      |
+-------------+------------+

'''给school_height表额外增加一个新学校'''
insert into school_height values ('南开', 188);
+-------------+------------+
| school_name | max_height |
+-------------+------------+
| 北大        | 184.1      |
| 复旦        | 184.3      |
| 清华        | 186.9      |
| 南开        | 188        |
+-------------+------------+

'''更改'''
update school_height set max_height=max_height+1 where school_name in (select distinct school from student);
+-------------+------------+
| school_name | max_height |
+-------------+------------+
| 北大        | 185.1      |
| 复旦        | 185.3      |
| 清华        | 187.9      |
| 南开        | 188        |
+-------------+------------+

#You can't specify target table 'school_height' for update in FROM clause
#报错,update更新的表 与 子查询select的表 相同
update school_height set max_height=max_height+1
where school_name in
(select distinct school_name from school_height);

#delete from 表 where() in (select 子查询)[表不能与delete表相同]

delete from school_height where school_name in (select distinct school from student);
+-------------+------------+
| school_name | max_height |
+-------------+------------+
| 南开        | 188        |
+-------------+------------+

#错误: delete删除的表 与 子查询select的表 相同
delete from school_height where school_name in (select distinct school_name from school_height);

三、区间修饰条件:all与any

all:要满足所有的条件

where salary < all(3, 6, 9) => salary必须小于所有情况

any:满足其中一个条件就行

where salary < any(3, 6, 9) => salary只要小于一种情况

eg:
select * from student where height < all(select height from student where id<4);
#先找到id<4的学生的身高,分别为 173.1,183.1,183.3,之后再拿身高作为参照物,找出满足所有满足身高条件(身高小于173.1)的同学
+----+------+--------+--------+--------+--------------+--------+
| id | name | gender | height | area   | port         | school |
+----+------+--------+--------+--------+--------------+--------+
|  5 | eee  | 女     | 168    | 山东   | 烟台         | 北大   |
|  6 | fff  | 女     | 165    | 新疆   | 乌鲁木齐     | 北大   |
|  8 | hhh  | 女     | 166.1  | 广州   | 广东         | 复旦   |
| 13 | ppp  | 女     | 155    | 江苏   | 连云港       | 清华   |
+----+------+--------+--------+--------+--------------+--------+

四、视图:view

视图的增删改操作可以直接映射给真是 表(本质就是对真是表进行操作)

  • 视图是存在内存中的临时表
  • 视图的创建依赖select语句
  • 视图支持对数据的增删改查
  • 视图不允许对视图表的字段做修改
  • 视图不仅支持创建,也支持更新与删除
'''创建视图'''
'''create view 视图名[(别名们)] as select 语句'''

create view 视图名[(别名们)] as select 语句;
eg:
create view v1 as select
school,max(height)
from student group by school;
+--------+-------------+
| school | max(height) |
+--------+-------------+
| 北大   | 183.1       |
| 复旦   | 183.3       |
| 清华   | 185.9       |
+--------+-------------+

'''创建或替换视图'''
''' create or replace 视图名[(别名们)] as select 语句;'''
create or replace view v1(school_name, max_height) as select school, max(height) from student group by school;
+-------------+------------+
| school_name | max_height |
+-------------+------------+
| 北大        | 183.1      |
| 复旦        | 183.3      |
| 清华        | 185.9      |
+-------------+------------+

''' alter 视图名[(别名们)] as select 语句;'''
alter view v1(name, height) as select school, max(height) from student group by school;
+--------+--------+
| name   | height |
+--------+--------+
| 北大   | 183.1  |
| 复旦   | 183.3  |
| 清华   | 185.9  |
+--------+--------+

'''删除视图'''
drop view 视图名
eg:drop view v1;

'''视图可以作为正常表完成连表查询'''
eg:create or replace view v2 as select name,gender,height from student;
select * from v2;
+------+--------+--------+
| name | gender | height |
+------+--------+--------+
| aaa  | 女     | 173.1  |
| bbb  | 男     | 183.1  |
| ccc  | 男     | 183.3  |
| ddd  | 男     | 185.9  |
| eee  | 女     | 168    |
| fff  | 女     | 165    |
.........

视图的增删改

视图可以完成增删改,增删改本质是对真实的表进行操作

#先创建一个视图
create or replace view v2 as select id,name,gender,height from student;

#改
update v2 set height=height+1 where id=1; #两个表都改变了
select * from v2;
+----+------+--------+--------+
| id | name | gender | height |
+----+------+--------+--------+
|  1 | aaa  | 女     | 174.1  |

select * from student;
+----+------+--------+--------+-----------+--------------+--------+
| id | name | gender | height | area      | port         | school |
+----+------+--------+--------+-----------+--------------+--------+
|  1 | aaa  | 女     | 174.1  | 甘肃      | 张掖         | 清华   |

#删
deleate from v2 where id = 1;

#增
create or replace view v3 as select * from student;
insert into v2 values(18,'wwb','男','183','上海','青浦','北大');

#操作视图会影响真实表,反之也会影响
update sutdent set height = height+1  whereid= 1;

五、事务

通常一些业务需要多条sql参与,参与的sql会形成一个 执行整体,该整体我们就称之为事务(事务就是包含多条执行的sql语句)

5.1事务的四大特性

  • 原子性:所有的执行都要一次性成功,不能有任何一个执行失败,要么同时成功,要么同时失败
  • 一致性:事务前后的数据完整性应该保持一致
  • 隔离性:支持并发,执行可以同时进行,数据不会乱
  • 持久性:一旦事务被提交,他对数据的改变就是永久性的,接下来如果数据库有故障,也不会对提交的数据有影响
create table bank(
id int primary key auto_increment,
name varchar(16),
money decimal(65,2));

insert into bank(name,money) values('yjy',10),('wwb',20);

#假设出现以下执行情况
update bank set money = money-1 where name = 'yjy';
update bank set money = money+1 where name = 'wwb';

'''没有事务支持下,yjy的钱就丢了'''
#这种执行是错误的,因为ypp不存在,yjy的银行账户钱转丢了
update bank set money = money-1 where name = 'yjy';
update bank set money = money+1 where name = 'ypp'; 

'''将2条sql看做事务处理'''
#开启事务
begin;
update bank set money = money-1 where name = 'yjy';
update bank set money = money+1 where name = 'ypp';
#确认无误,提交事务
commit;
#确认有误,回滚事务
rollback;

原文地址:https://www.cnblogs.com/yanjiayi098-001/p/11595203.html

时间: 2024-11-01 14:18:05

表查询(下)的相关文章

Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉加载实现!)

上一节我们实现了数据表的加载,但是,当数据表数据很多时,我们就要考虑数据的分页,这里我们选用了PullToRefreshListView控件,先看一下该控件的说明: 效果图:                                 正在刷新                                                                       刷新后        一.导入Library 下载源码后(https://github.com/chrisba

Django 跨表查询--神奇的双下划线和点

我在django的moles中创建了两个calss,如下: class Project(models.Model):     name = models.CharField(u'项目名称',max_length=32,blank=True)     id = models.CharField(u'项目ID',max_length=32,unique=True,primary_key=True,blank=True)     create_date = models.DateTimeField(u

Django Mysql数据库-基于双下划线的跨表查询

一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的 model 为止.(相当于用sql语句用join连接的方式,可以在settings里面设置,可查看sql语句) 数据库模型: class Book(models.Model): nid = models.AutoField(primary_key=Tru

Django-orm:单表查询、基于对象和双下划线的多表操作、集合查询、分组查询、F查询和Q查询

############################################## 单表操作 ############################################## 简单查: models.User.objects.filter(id=3) # queryset对象,相当于一个列表,放了一个或多个User对象 models.User.objects.filter(id=3).first() # User对象,相当于只去了queryset对象中的第一个 增: 第一种

67 orm13查询语句,外键查询,多对多查询 单表查询双下划线方法

主要内容:https://www.cnblogs.com/maple-shaw/articles/9403501.html 注意:  如果想要文件中运行整个django项目: 需要在文件中写入: import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_operate.settings") import django djan

Mysql数据库理论基础之五--SELECT单多表查询、子查询、别名

一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分区,从而使得很大的表成为可能

web day16 数据库 完整性约束,mySQL编码问题,备份与恢复,多表查询

约束 * 约束是添加在列上的,用来约束列的! 1. 主键约束(唯一标识) ****非空*** ****唯一*** ****被引用**** * 当表的某一列被指定为主键后,该列就不能为空,不能有重复值出现. * 创建表时指定主键的两种方式: > CREATE TABLE stu( sid      CHAR(6) PRIMARY KEY, sname     VARCHAR(20), age         INT, gender     VARCHAR(10) ); 指定sid列为主键列,即为s

SQL联表查询

数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(table)按照(where)一定的条件(expression)查找(select)我要的数据(column); 但是在实际工作中用到的比较多的往往还是多联表查询,所以在这里记下自己学习多联表查询的心得. 首先聊一聊笛卡尔积,这是几乎所有数据库书籍在讲多联表查询时第一个要讲的东西,我等P民也只能是把笛卡尔

Day04 多表查询

1. 笛卡尔集 笛卡尔集会在下面条件下产生: 省略连接条件 连接条件无效 所有表中的所有行互相连接 为了避免笛卡尔集, 可以在 WHERE加入有效的连接条件. 2. Oracle连接 3. 等值连接 4. 表的别名 5. 连接多个表 6. 非等值连接 7. 内连接和外连接 8. 自连接 9. 1999连接 SQL语句的多表查询方式: 例如:按照department_id查询employees(员工表)和departments(部门表) 的信息. 方式一(通用型):SELECT ... FROM