数据库高级查询

1.  EXISTS子查询

      语法:

      select ....... from 表名 where EXISTS(子查询);

     子查询有无返回结果:exists 子查询结果为TRUE

     子查询无返回结果:exists 子查询结果为FALSE,外层查询不执行

   其实exists这个单词早就在我们新建表的时候就有了,那个语法是create table if exists 表名,这句话会判断我们新建的表是否已经存在,不存在的话就会新建表,存在的话就报错,通过这个我们就可以知道exists是做什么的了吧,没错,就是判断一条语句是否有无结果,有的话就会执行,没有的话就不会,比如我们可以和一条语句绑定,如查询一个学生成绩的表,如果成绩有大于80分的同学,那就将他们的成绩由高到低排序,这里就可以用exists,举了一条栗子后是不是感觉exists和if很像啊,没错,这里的exists就相当于if,因为格式问题我就不把列子放出来了,就用文字给大家解释一遍。


2. 分组查询

   MySQL里面我们用group by 来进行分组,而排序我们则用order by 来进行排序,所以分组排序就是先分组在排序,

  其语法如下:

    select  字段或者函数  from 表名 where 条件  group by  字段(要有重复字段属性) order by 字段

   解释下这条语句,其中where 条件可写可不写,最后一个字段其中的属性要能比较大小,排序有asc(从小到大)和desc(从大到  小),不写的话默认是asc,也就是从小到大排序

      列:

         SELECT`subjectNo`,AVG(`studentResult`) AS 课程平均成绩

         FROM `result`

         GROUP BY `subjectNo`;


3.分组筛选

     我们都知道筛选都是用where来筛选条件的,这个where语句我们都是写在 查询语句时 表的后面,但我们又想在分组或者排序后等条件后筛选怎么办呢,还能不能用where了呢,答案是不能的,我们这里就要用到HAVING 这个语法了

    语法格式如下:

   select 字段或者函数 from 表名 where 条件 GROUP BY 字段(按照什么来进行分组) HAVING(筛选条件)

   比如:

             SELECT`subjectNo`,AVG(`studentResult`) AS 课程平均成绩

             FROM `result`

             GROUP BY `subjectNo`

             HAVING  AVG(`studentResult`)>=60;

4. where与having的对比

     where子句:用来筛选from子句中指定的操作所产生的行

     group by 子句:用来分组where子句的输出

     having子句:用来从分组的结果中筛选行

5.多表连接查询

     1.内连接

      首先我们要先了解什么是内连接,怎么说呢?简单来说就是将有相同字段的表根据语法将它们连接起来,从而得到我们想要的数据,而我们想要的数据分别在两张不同的表里面,这时候就要用到内连接了,

SELECT Cname,Cno,Tname,Depart FROM course INNER JOIN teacher ON course.`Tno`=teacher.`Tno`;

首先我们来看下这条语句,查询字段Cname,Cno,Tname,Depart,而这四个字段又不在同一张表里面,我们就要用inner join 这个语法将两张表连接起来,连接起来的办法就是找出两张表里面有相同的那个字段,并将两张表course和teacher用等号关联起来,这里写了两张表分别都有Tno这个字段,

      其实还有一种简便的办法,我本人比较喜欢下面这个,但我们在工作中常用的是上面那种,我分不清两种方法有什么区别,感兴趣的可以自己百度。

    SELECT Cname,Cno,Tname,Depart FROM course,teacher WHERE course.`Tno`=teacher.`Tno`;

看到没,from后面写上要关联的表,where 后面则写表字段的连接,多张表也可以这样,from后面写上每个表的名字并用逗号分隔开,where后面则每张表的字段相关联,比如表1.字段1=表2.字段1 and 表2.字段2=表3.字段2,这样,这就相当于a,b,c三条线,a与b平行,b与c 平行,那么a与c也平行,就是这个思想,只要任意两张表的相同字段就可以连接起来,不过是多用几个and 

如果多张表的话,第一种方式也要随之改变,

          SELECTS.studentName AS 姓名,SU.subjectName AS 课程,R.studentResult AS 成绩

         FROMstudent AS S

         INNER JOIN `result` AS R ON  (S.`studentNo` = R.`studentNo`)

         INNER JOIN `subject` AS SU ON(SU.subjectNo=R.subjectNo);

只不过是多用几个inner join 即可

     2.外连接

          a.左外连接

  什么叫左外连接呢?官方的解释是:左外联接是以左表为基础的,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL

 这里也和上面的多表连接差不多,不过要分主表和从表,即左表和右表,我们查询的时候往往有多个字段,而两张表里面的字段又不可能全部都有,比如一张表有成绩这个字段,而另一张没有,如果查询的时候我们要看成绩字段怎么办,那其值就以null填充,意思就是空。

列:

                     SELECT   S.studentName,R.subjectNo,R.studentResult

                     FROM   studentAS S

                     LEFT JOIN result AS R

                     ON S.studentNo = R.studentNo;

          b.右外连接

右外连接和左外连接一样,位置颠倒一下就行,只不过这里是字段是空值,而字段属性有值


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,查询数据库高级写法可以使用ORM(对象关系映射)框架,例如SQLAlchemy。ORM框架可以将数据库中的表映射为Python中的类,并且提供了一系列的查询接口,方便开发者进行数据库操作。 下面是一个简单的示例代码,演示了使用SQLAlchemy查询数据库的方法: 首先,我们需要安装SQLAlchemy模块,可以使用pip命令进行安装: ``` pip install sqlalchemy ``` 然后,我们需要定义一个数据库表,并将其映射为Python中的类: ``` from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base # 创建连接数据库的引擎 engine = create_engine('mysql+pymysql://username:password@host:port/database') # 创建基类 Base = declarative_base() # 定义User类,对应数据库中的user表 class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50)) age = Column(Integer) def __repr__(self): return f'<User(name={self.name}, age={self.age})>' ``` 在这个示例中,我们首先使用create_engine()方法创建一个连接数据库的引擎。然后使用declarative_base()方法创建一个基类Base,该基类继承自SQLAlchemy的基类,并且可以将数据库中的表映射为Python中的类。最后我们定义了一个User类,它继承自Base类,并且对应数据库中的user表,其中包括id、name和age三个属性。 接下来,我们可以使用SQLAlchemy提供的查询接口查询数据库: ``` from sqlalchemy.orm import sessionmaker # 创建Session类 Session = sessionmaker(bind=engine) # 创建Session对象 session = Session() # 查询所有用户 users = session.query(User).all() print(users) # 查询年龄大于等于18的用户 users = session.query(User).filter(User.age >= 18).all() print(users) # 查询姓名为Alice的用户 user = session.query(User).filter(User.name == 'Alice').first() print(user) ``` 在这个示例中,我们首先使用sessionmaker()方法创建一个Session类,它可以创建Session对象。然后我们创建了一个Session对象,并使用query()方法查询数据库中的用户信息。其中,all()方法表示查询所有用户,filter()方法可以根据条件进行筛选,first()方法表示查询第一个符合条件的用户。 这样,我们就可以方便地使用SQLAlchemy进行数据库操作,并且可以避免手写SQL语句的繁琐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值