导航

  • 1. 查询语法
  • 2.子句
  • 3.主键约束词汇


1. 查询语法

SELECT [select选项] 
	字段列表[字段别名]/* 
FROM 数据源
[WHERE 子句] 
[GROUP by子句 ][HAVING 子句][ORDER BY 子句][LIMIT 子句];

参考:W3C学校_sql函数

--sql语句中关键字应该用大写字母
--单个查询
SELECT p1 FROM table
--多个查询
SELECT p1,p2 FROM table
--去重查询:去除重复行
SELECT DISTINCT(p1) FROM table
--条件查询:可拓展为很复杂的判断,如where继续嵌套查询;
	--假如想用select使用函数的字段筛选,可以用having子句
SELECT p1 FROM table WHERE p1=1
--函数查询:在查询字段套上函数,如SUM、COUNT、标量值函数等
SELECT function(列) FROM 表
SELECT SUM(IIF(category="class1",num,0)) Cat FROM table

--多表查询
--多列子查询
SELECT q1,p2 FROM (SELECT p1 q1,p2 FROM table)
--左连查询,返回table_1和table_2匹配上的行
SELECT p1 FROM table_1
	LEFT JOIN table_2
		ON table_1.p1=table_2.p1
参数查询
    ①用户输入的查询语句为: 
        SELECT * FROM Customers WHERE ID = ${ID};  
    ②从客户端动态取到的 ID 数值为: 1; 
    ③根据参数值产生新的查询语句:
        SELECT * FROM Customers  WHERE ID = 1

实际上实际的工程经验中,因为查询涉及表量多,字段判断复杂,许多查询由嵌套加函数综合编写,需要不断积累经验。

下面再讲一下 FROM后面的子句

2.子句

  • GROUP BY
    GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
    以下为例,表中column_name相同的字段对应的行会合并起来。
    若是多字段分组,就会把多字段同时完全一致的合成一个小组。
    应用场景:
    常常把group by 做统计工作,对每个分组中的数据应用聚合函数(COUNT,SUM, AVG,etc)
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
  • HAVING
    有时候我们想用合计函数算的字段去条件查询,但是WHERE 关键字无法与合计函数一起使用。
    这时HAVING子句就可以帮忙。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

应用场景:
有时我们用GROUP BY 和合计函数做分组合计,在这个基础上再用HAVING子句来做条件查询。

  • ORDER BY
    ORDER BY 语句用于根据指定的列对结果集进行排序,默认升序,有需要可加上关键字DESC做降序排序;
    也可以一个降序一个升序,但需要在排序字段后都加关键字(DESC或ASC)。
--从order表中查询,且排序先以Word字段的字母进行排序,然后在此基础上用Num数字进行排序
SELECT Word, Num FROM Orders 
ORDER BY Word, Num DESC
  • LIMIT
    LIMIT子句用作限制select返回的行数,部分数据库支持该语句,如MySQL

3.主键约束词汇

可用作约束主键检索

CONSTRAINT [PK_dimTime] PRIMARY KEY CLUSTERED
(
#ASC→主键 属性→ID
[lngTimeID] ASC)
#index:指定索引节点行数≥2 ;
#NORECOMPUTE:不自动更新,手动执行不带他的子句PDATESTATISTICS命令 ;
#DUP_KEY:包惟一约束插入重复数据时,
#选择时:返错,跳过继续执行、没选择时返错,rollback插入语句。
#locks:是否允许行/页面 锁
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = O
N, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY])
 ON [PRIMARY]

小思考题:
医院有张源表,
table_1(记录病人入院数据),字段有 patient_Id, report_Date,dept_Code,doct_Code;
现在需要做一个入院周报,根据输入时间参数的不同,统计每个部门的入院人数情况。

答案

SELECT
	p.dept_Code 部门,
	COUNT(p.dept_Code) 入院人数
FROM table_1 p
WHERE 
	p.report_Date>=${begain_Time}
	p.report_Date<=${end_Time}
GROUP BY p.dept_Code
ORDER BY 入院人数 DESC