本文介绍了SQL查询语句的基本知识点,包括单表查询、子查询和联合查询。单表查询包括基本查询、使用TOP和ORDER BY排序。子查询用于多表查询,作为WHERE子句的过滤条件或计算列。联合查询涉及多表的主外键关系,分为内连接、左连接、右连接和全连接,主要区别在于返回不满足连接条件的数据。最后,强调了这些查询的区别和应用场景。
很多金蝶小伙伴在写插件的时候,用的比较频繁的就是sql语句的查询了。
一般我们都使用DBUtils对象去执行sql语句,这个很方便。
但是,sql 的语句怎么写,尤其是最复杂的查询语句了。
今天德华来说一说sql查询语句的一些基本知识点。
1.单表查询
单表查询是最简单的了,一般就是select * from 后面跟表名。
select * from 表名
Top关键字
如果遇到单表数据量过百万的情况下,建议在*前添加top关键字,例如
select top 1000 * from [User]
上述查询语句表示从User表查询前1000条数据
order by 关键字
有了top 关键字还不够,有时候我们要对数据进行排序,否则看起来乱,就需要用到order by ,例如
select top 1000 * from [User] order by name; --name字段排序(顺序) select top 1000 * from [User] order by name desc; --name字段倒序 select top 1000 * from [User] order by name,age; --先按name字段顺序,如果name相同,按age排序
where关键字
当然用的最多还是where 和and 关键字了。可以对sql查询的数据进行过滤。例如
select * from [User] where name='张三'
上述查询语句表示从User表查询字段name为张三的数据。
另外,还有其他关键字group by和having 和聚合函数 sum、avg等等,那些属于比较高级了,后面在聊。
2.子查询
子查询一般用在多表的查询情况下,所谓 SQL 子查询就是嵌套在其他查询中的查询。子查询通常用于 WHERE 子句的 IN 操作符中进行过滤,以及用来填充计算列。
例如:
SELECT cust_id FROM Orders WHERE order_num IN ( SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01' );
或者:
SELECT cust_name, cust_state, ( SELECT COUNT( * ) FROM Orders WHERE Orders.cust_id = Customers.cust_id ) AS orders FROM Customers ORDER BY cust_name;
上述两种方式都用到了子查询,第一种是作为where条件,第二种是作为查询字段。
3.联合查询
联合查询一般是指多个表有主外键关系的情况下使用,一般分为三种:内连接、左连接(或右连接)、外连接(或全连接)。三种查询一般用在不同的场景,主要区别为:查询结果是否返回不满足on后条件的数据。
如果是按关键字来看的话, 有inner join(内连接)、left join(左连接)、right join(右连接)、full join(全连接)四种方式。
例如我们有两张表:
Orders表通过外键Id_P和Persons表进行关联。
inner join(内连接)
在两张表进行连接查询时,只保留两张表中完全匹配的结果集。
我们使用inner join对两张表进行连接查询,sql如下:
SELECT p.LastName, p.FirstName, o.OrderNoFROM Persons pINNER JOIN Orders oON p.Id_P=o.Id_P and 1=1 --用and连接多个条件ORDER BY p.LastName
查询结果集:
内连接查询 (select * from a join b on a.id = b.id) 与 关联查询 (select * from a , b where a.id = b.id)的区别
left join (左连接)
在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
我们使用left join对两张表进行连接查询,sql如下:
SELECT p.LastName, p.FirstName, o.OrderNoFROM Persons pLEFT JOIN Orders oON p.Id_P=o.Id_PORDER BY p.LastName
查询结果如下:
可以看到,左表(Persons表)中LastName为Bush的行的Id_P字段在右表(Orders表)中没有匹配,但查询结果仍然保留该行。
full join(全连接)
在两张表进行连接查询时,返回左表和右表中所有没有匹配的行。
我们使用full join对两张表进行连接查询,sql如下:
SELECT p.LastName, p.FirstName, o.OrderNoFROM Persons pFULL JOIN Orders oON p.Id_P=o.Id_PORDER BY p.LastName
查询结果如下:
查询结果是left join和right join的并集。
这些连接查询的区别也仅此而已。
一张图来区分
在高中数学上,其实就是交集和并集的关系。很简单。
最后,请小伙伴动动小手关注、点赞、收藏三连!(比心)