数据库表查询进阶(1)

数据库表查询进阶(1),第1张

in *** 作符允许我们在 WHERE 子句中规定多个值。

where 字段名 in (值1,值2,值3)

示例: where age in (20,21,25);

age 字段的值 只要是 20或者21或者25 的数据 都满足条件

where not in (值1,值2,值3)</pre>

示例: where age in (20,21,25);

age 字段的值 只要 不是 20或者21或者25 的数据 都满足条件

select

from sc

where score in (70,80,90);

select

from sc

where score not in (70,80,90);

select

from student

where birthday in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06');</pre>

select

from student

where birthday not in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06');

MySQL中的分页查询, limit 通常放在sql 语句的最末尾

limit 4

查询前4条数据

limit 4,3

从第4条数据之后开始,查询3条数据

也就是 第5,6,7条的数据

limit 4 offset 10;

offset后面的数字是指记录数

从第10条 之后的数据开始 查询4条数据

也就是 第 11,12,13,14条数据

select from student limit 5;

select from student limit 9,6;

select from student limit 6 offset 9;

查询成绩表中 前7条的数据;

select from sc limit 7;

查询成绩表中 第 5到10 条的数据

select from sc limit 4,6;

查询成绩表中 第 3到8 条的数据;

select from sc limit 2 , 6;

如果字段没有要求非空,则字段值 可以为空,就是null值。如果要查询某个 字段 为 null的数据,不能使用 字段名=null,要用 字段名 is null;

where 字段名 is null;

字段名 为空的符合条件

where 字段名 is not null;

字段名 不为空的符合条件

1查询teacher表,给tid 起别名为 教师编号,tname 起别名为 教师姓名

select tid as 教师编号,tname as 教师姓名 from teacher

2查询 sc 表, 给 cid 起别名为 课程编号,sid 起别名为 学生编号, score起别名为分数;

select cid 课程编号 ,sid 学生编号,score 分数 from sc

3查询 course 表,给表起别名为 c,使用 c字段查询 表数据

select c from course as c ;

起别名是为了后续学习多表联查 做铺垫,语法十分简单

比如查询 student 表的 学生姓名 和 生日 的sql语句:

select sname,birthday from student;

给 sname,birthday字段 起别名 ,改为中文

select sname as 姓名,birthday as 生日 from student;

起了别名后,查出来的字段会以别名展示。

as 关键字也可以省略,字段名 和 别名之间 用空格隔开即可

select sname 姓名, birthday 生日 from student;

例子:

select asname, abirthday from student as a;

给表 起别名 同样是 使用 as关键字(可以使用空格隔开代替as关键字), a 就代表 student表,查询字段时,可以 使用 asname 代表 student的sname字段。

给表起别名 通常用在 多表查询,本次使用演示,先熟悉语法。

在某些复杂的场景下,可能需要多条sql 才能查询出想要的数据,把多条sql拼接起来 就是嵌套查询

句式1

select XXX from A表 where xx =/in (select XXX from B表)

句式2

select XXX from (select XXX from XXXX)b

句式3

select XXX from A表 a

join (select XXX from B表)b on axx = bxx

select from sc where sid = (select sid from student where sname = '周梅');

select from sc where sid in (select sid from student where sex='女');

select asname,bscore,cscore from student a

inner join (select sid,score from sc where cid =1) b on asid = bsid

inner join (select sid,score from sc where cid = 2) c on asid = csid

where bscore › cscore;

聚合函数对一组值执行计算,并返回单个值,也被称为组函数。

就是sql提供的一种查询方法,比如查询 最大值,最小值,总数,平均等等。

聚合函数不能写在where的查询条件里面

查询 最小值

select min(字段) from 表;

查询 最大值

select max(字段) from 表;

select max(tid) from teacher;

select min(tid) from teacher;

select max(ascore) ,bcname from sc a

inner join course b on acid=bcid

where asid =(select sid from student where sname='周梅') group by bcname limit 1 ;

查询 该字段的 总数

select sum(字段) from 表

查询 该字段的 平均数

select avg(字段) from 表

select avg(score) from sc;

select avg(sscore) from student a inner join sc s on asid = ssid

where asex ='女';

查询 数据 总条数

count( ) 是查询总共有多少条数据

count(字段) 是查询该字段 不为 null的 总共有多少条数据

例:

select count( ) from 表

去重,查询数据时,相同的数据只展示 一条

语法:

select distinct 字段 from 表;

例:去重查询学生表中的生日字段

select distinct birthday from student;

本篇文章继续围绕SQL的语法重点为大家介绍 连接 高级连接 的使用,以及 使用连接的注意事项

SQL最强大的功能之一就是能在数据查询的执行中 连接(join)表 。连接是利用SQL的SELECT语句能执行的最重要的 *** 作,很好地理解连接及其语法是学习SQL的极为重要的一点。在能够有效地使用连接前,我们必须了解 关系表 以及 关系数据库 设计的一些基础知识。下面的介绍并不能涵盖这一主题的所有内容,但作为入门已经够了。

连接

理解关系表,最好是来看个例子。

有一个包含产品目录的数据库表,其中每类物品占一行。

对于每一种物品,要存储的信息包括产品描述、价格,以及生产该产品的供应商。

现在有同一供应商生产的多种物品,那么在何处存储供应商名、地址、联系方法等供应商信息呢?将这些数据与产品信息分开存储的理由是:

同一供应商生产的每个产品,其供应商信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间;

如果供应商信息发生变化,例如供应商迁址或电话号码变动,只需修改一次即可;

如果有重复数据(即每种产品都存储供应商信息),则很难保证每次输入该数据的方式都相同。不一致的数据在报表中就很难利用。

关键是, 相同的数据出现多次不是一件好事 ,这是关系数据库设计的基础。

关系表的设计就是要 把信息分解成多个表 一类数据一个表 。各表通过某些共同的值互相关联(所以才叫关系数据库)。在这个例子中可建立两个表:一个存储供应商信息,另一个存储产品信息。Vendors表包含所有供应商信息,每个供应商占一行,具有唯一的标识。此标识称为 主键 (primary key),可以是供应商ID或任何其他唯一值。Products表只存储产品信息,除了存储供应商ID(Vendors表的主键)外,它不存储其他有关供应商的信息。Vendors表的主键将Vendors表与Products表关联,利用供应商ID能从Vendors表中找出相应供应商的详细信息。

这样做的 好处 是:

供应商信息不重复,不会浪费时间和空间;

如果供应商信息变动,可以只更新Vendors表中的单个记录,相关表中的数据不用改动;

由于数据不重复,使得处理数据和生成报表更简单。

总之,关系数据可以有效地存储,方便地处理。因此,关系数据库的可伸缩性远比非关系数据库要好。

为什么使用连接

连接将数据分解为多个表实现 更有效 地存储、 更方便 地处理,且 可伸缩性更好

可伸缩性:能够适应不断增加的工作量而不失败。

连接作为一种机制,能在一条SELECT语句中用来关联表。使用特定的语法,可连接多个表返回一组输出。

创建连接

分析 :上述SELECT语句中与之前的语句相同,都是指定检索的列, 区别 在于该语句指定的两列(prod_name,prod_price)在一个表中,而第一列(vend_name)在另一个表中。

FROM子句也有所区别。该FROM子句列出了两个表:Vendors,Products。这两个表由SELECT语句的WHERE子句连接。WHERE子句指示DBMS将Vendors表中的vend_id与Products表中的vend_id匹配起来。

这里使用了 完全限定列名 将Vendorsvend_id和Productsvend_id两列匹配。最终输出了两个不同表中的数据。

高级连接部分将介绍 如何使用表别名,另外的一些连接 ,以及 如何对被连接的表使用聚集函数

使用表别名

之前的文章已经给大家介绍了如何使用别名引用被检索的表列。

SQL还可以 给表名起别名 ,目的是:

缩短SQL语句。

允许在一条SELECT语句中多次使用相同的表。

分析 :上述语句中的FROM子句的三个表都有别名。如此 省略了许多字符 。表别名还可以用于SELECT的列表、ORDER BY子句以及其他语句部分。

需要注意的是: 表别名只在查询执行中使用 。与列别名不同,表别名不返回到客户端。

使用不同类型的连接

接下来将给大家介绍四种其他类型的连接: 自连接 自然连接 内连接 外连接

①自连接

分析: 这是使用了 子查询 的方案。对内部的SELECT语句做了一个简单的检索,返回Jim Jones工作公司的cust_name。该数据用于外部查询的WHERE子句中,以检索出为该公司工作的所有雇员。

下面看看使用了 连接 的方案。

分析:上述语句需要的两个表实际上是相同的表,所以Customers表在FROM子句中出现了两次。但这对于Customers的引用具有歧义,因为没有指示DBMS引用的是哪个Customers表。

于是需要使用表别名解决该问题。Customers表 第一次出现为别名c1 第二次为c2 ,然后再将这些别名用作表名。如SELECT语句使用c1前缀明确给出所需列的全名。如果不这么做,DBMS将返回错误,因为名为cust_id、cust_name、cust_contact的列各有两个。DBMS不知需要哪一列,即使它们都是同一列。

WHERE首先连接两个表,再按第二个表中的cust_contact过滤数据,返回所需的数据。

②自然连接

内连接 返回所有的数据,其中 相同的列可多次出现 。而 自然连接排除多次出现 ,使每一列只返回一次。

一般通过对一个表使用通配符(SELECT ),而对其他的列使用明确的子集来实现自然连接。

分析: 上述语句中,通配符只对第一个表使用,而所有其他列都明确列出来,所以没有出现重复的列被检索出来。

③内连接

目前为止使用的连接称为等值连接,是基于两个表之间的相等测试。该连接也称为内连接。

对该种连接还可以使用不同的语法,明确指定连接的类型。

分析 :该语句中的SELECT与之前的区别在于FROM 子句。此处两个表之间的关系是以 INNER JOIN 指定的部分FROM子句,因此需要使用特定的 ON子句 而不是WHERE子句。但传递给ON的实际条件与WHERE相同。

④外连接

许多连接将一个表中的行与另一个表中的行相关联,但有时候 需要包含没有关联的行 。例如,可能需要使用连接完成以下工作:

对每个顾客下的订单进行计数,包括那些至今尚未下订单的顾客;

列出所有产品以及订购数量,包括没有人订购的产品;

计算平均销售规模,包括那些至今尚未下订单的顾客。

在上述例子中,连接包含了那些在相关表中没有关联行的行。这种连接称为外连接,外连接分为 左外连接 右外连接

左外连接:取左边的表的全部,而右边的表按照条件显示,不符合条件的显示NULL。

右外连接:取右边的表的全部,而左边的表按照条件显示,不符合条件的显示NULL。

下面先给出一个简单的 内连接 ,再给出 左外连接 ,大家对比着理解。

分析 :两个语句都使用了 JOIN 关键字来指定连接类型,与内连接不同的是,左外连接包括没有关联行的行。因此在使用JOIN语法时,还需使用RIGHT或LEFT关键字来指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。

上述左外连接语句使用了LEFT OUTER JOIN 从FROM子句左边的表(Customers)中选择所有行。

若要从右边的表选择所有行,即使用 右外连接 ,则语句如下:

注意 :两种基本的外连接形式,左外连接和右外连接。两者的唯一差别是所关联的表的顺序。

此外,还有一种外连接,即 全外连接 。该连接检索两个表中的所有行并关联可关联的行。与左外连接或右外连接包含一个表的不关联的行不同,全外连接包含两个表的不关联的行。

自连接、自然连接、内连接和外连接的区别

①自连接: 通常用于 两张结构和数据内容完全一样的表 ,在做数据处理时,对它们分别 重命名 来加以区分,然后再进行关联。

②自然连接 :特点是要求两个关系表中进行连接的必须是 相同属性列 (名字相同),无需添加连接条件,且 在结果中消除了重复的属性列

③内连接 :与自然连接相似,区别在于内连接 不要求两属性列同名 ,可以用 using或on 来指定某两列字段相同的连接条件。

④外连接 :可以解决自然连接时某些属性不同导致这些元组被舍弃的问题,起到了 保留要舍弃的结果 的作用。

使用带聚集函数的连接

之前给大家介绍过使用 聚集函数 来汇总数据,殊不知这些函数也可以与连接一起使用。

分析: 上述语句使用了 COUNT函数 。该语句使用INNER JOIN将Customers和Orders表相互关联。GROUP BY子句按顾客分组,因此,函数调用COUNT(Ordersorder_num)对每个顾客的订单计数,将其作为num_ord返回。

分析: 上述语句使用 左外连接 包含所有顾客,包括了那些没有任何订单的顾客。

WHERE子句的重要性

需记住的是,在一条SELECT语句中连接几个表时,相应的关系是在运行中构造的,因为在数据库表中的定义没有指示DBMS如何对表进行连接的内容。

要连接多个表,需要将它们并列于from之后, 关键 是要设置WHERE子句,确保它们之间的 关联关系 必须给出,否则,查询结果会成为笛卡尔积。

笛卡尔积:由没有连接条件的表关系返回的结果为笛卡儿积。

分析 :上述语句输出的结果便是 笛卡尔积 。返回的数据用每个供应商匹配了每个产品,包括了供应商不正确的产品(即使该供应商没有产品)。

连接及其使用的要点

注意所使用的连接类型。一般我们使用内连接,但使用外连接也有效。

关于确切的连接语法,应该查看具体的文档,看相应的DBMS支持何种语法(大多数DBMS使用这两课中描述的某种语法)。

保证使用正确的连接条件(不管采用哪种语法),否则会返回不正确的数据。

应该总是提供连接条件,否则会得出笛卡儿积。

在一个连接中可以包含多个表,甚至可以对每个连接采用不同的连接类型。虽然这样做是合法的,一般也很有用,但应该在测试它们前分别测试每个连接。这会使故障排除更为简单。

以上就是本次介绍的连接和高级连接啦~

下一期将给大家介绍 组合查询 插入数据 更新和删除数据。

我们下期见!

比如:

1、selec name as “姓名” ,sex as "性别" from user

2、select uname as “姓名”,oname as "英文名" ,usex as "性别" from user u ,other o where uid = oid;

as不是给表里的字段取别名,而是给查询的结果字段取别名。

其目的是让查询的结果展现更符合人们观看习惯,在多张表查询的时候可以直接的区别多张表的同名的字段。

扩展资料:

SQL别名:

SQL别名用于为表或表中的列 提供临时名称。

SQL别名通常用于使表名或列名更具可读性。

SQL一个别名只存在于查询期间。

别名使用AS关键字赋予。

在下列情况下使用别名:

1,查询涉及多个表

2,用于查询函数

3,需要把两个或更多的列放在一起

4,列名长或可读性差

语法

1、表名的别名语法:

SELECT 列名

FROM 表名 AS 别名;

2、列名的别名语法:

SELECT 列名 AS 别名

FROM 表名

3、表名和列名的别名混合使用语法:

SELECT 列名 AS 别名

FROM 表名 AS 别名

语法举例

1、使用表名称别名

有两个表分别是:"Persons" 和 "Product_Orders"。分别为它们指定别名 "p" 和 "po"。列出 "John Adams" 的所有定单。

SELECT poOrderID, pLastName, pFirstName

FROM Persons AS p, Product_Orders AS po

WHERE pLastName='Adams' AND pFirstName='John';

2、使用列名称别名

查询 Persons 表中的 LastName 列 (为其定义别名 '姓氏')和 FirstName 列(为其定义别名 ‘名字’),输出所有结果值。

SELECT LastName AS 姓氏, FirstName AS 名字

FROM Persons

以上就是关于数据库表查询进阶(1)全部的内容,包括:数据库表查询进阶(1)、数据分析人必掌握的数据库语言-SQL指南第六期、mysql中 ,如何用 as 取别名 谢谢大家!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10183193.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存