1. Detección de inclusión de colecciones
En una tabla, busque registros basados en la inclusión del conjunto.
[Ejemplo 1] En la tabla de empleados, calcule el salario promedio de cada departamento en las ciudades de primer nivel. Parte de los datos son los siguientes:
CARNÉ DE IDENTIDAD | NOMBRE | CIUDAD | SALARIO |
1 | Rebeca | Tianjin | 7000 |
2 | Ashley | Tianjin | 11000 |
3 | Raquel | Shijiazhuang | 9000 |
4 | Emily | Shenzhen | 7000 |
5 | Ashley | Nanjing | 16000 |
... | ... | ... | ... |
[Ideas para resolver preguntas]
Al seleccionar datos de la tabla de empleados, es necesario determinar si la ciudad del empleado pertenece a un conjunto constante que consta de Beijing, Shanghai, Guangzhou y Shenzhen. Cuando el número de miembros en el conjunto es menor que 10, la función A.contain () se puede usar para filtrar.
[Secuencia de comandos SPL]
UNA | segundo | |
1 | = conectar ("db"). consulta ("seleccionar * de Empleado") | / Conéctese a la base de datos y consulte la tabla de empleados |
2 | [Pekín, Shanghái, Guangzhou, Shenzhen] | / Crea un conjunto constante de ciudades de primer nivel |
3 | = A1.seleccionar (A2.contain (CIUDAD)) | / Utilice la función A.contain () para seleccionar los registros donde la ciudad está contenida en las ciudades de primer nivel. |
4 | = A3. Grupos (DEPT; avg (SALARIO): SALARIO) | / Agrupar y resumir el salario medio de cada departamento |
Los resultados de A4 son los siguientes:
DEPT | SALARIO |
Finanzas | 7833.33 |
HORA | 7187.5 |
Márketing | 7977.27 |
... | ... |
En una tabla, busque registros basados en el juicio inclusivo de un conjunto más grande.
[Ejemplo 2] En la tabla de ventas, cuente las ventas mensuales de los principales clientes en 2014. Parte de los datos son los siguientes:
CARNÉ DE IDENTIDAD | Cliente | SellerId | Fecha | Cantidad |
10400 | EASTC | 1 | 2014/01/01 | 3063.0 |
10401 | HANAR | 1 | 2014/01/01 | 3868,6 |
10402 | ERNSH | 8 | 2014/01/02 | 2713.5 |
10403 | ERNSH | 4 | 2014/01/03 | 1005,9 |
10404 | MAGAA | 2 | 2014/01/03 | 1675.0 |
... | ... | ... | ... | ... |
[Ideas para resolver preguntas]
Esta pregunta es similar a la del [Ejemplo 1]: al seleccionar datos de la tabla de ventas, es necesario juzgar si el cliente de ventas pertenece al conjunto constante de grandes clientes. Cuando el conjunto tiene muchos miembros (más de 10), puede ordenar el conjunto de constantes primero y luego usar la opción @b de la función A.contain () para realizar una búsqueda binaria.
[Secuencia de comandos SPL]
UNA | segundo | |
1 | = conectar ("db"). consulta ("seleccionar * de Ventas") | / Conéctese a la base de datos y consulte la tabla de ventas |
2 | = ["SAVEA", "QUICK", "ERNSH", "HUN", "RATTC", "HANAR", "FOLKO", "QUEEN, MEREP", "WHITC", "FRANK", "KOENE"]. Ordenar () | / Cree una colección constante de grandes clientes y clasifique |
3 | = A1.select (año (Fecha) == 2014 && A2.contain@b (Cliente)) | / Seleccione los registros de los principales clientes en 2014. Cuando el conjunto A está ordenado, use la opción @b de la función A.contain () para realizar una búsqueda binaria. |
4 | = A3.groups (mes (fecha): mes; suma (monto): monto) | / Agrupar y resumir las ventas mensuales |
Los resultados de A 4 son los siguientes:
ESTADO | SALARIO |
California | 7700.0 |
Texas | 7592.59 |
Nueva York | 7677.77 |
Florida | 7145.16 |
Otro | 7308.1 |
2. Detección de inclusión de asignación de clave externa
En las dos tablas, los registros se buscan en función de la detección de inclusión de la asignación de clave externa.
[Ejemplo 3] Consulta cuántos estudiantes de cada clase han tomado el curso "Matlab". La selección de cursos y el horario de los cursos son los siguientes:
[Ideas para resolver preguntas]
从选课表选出数据时,需要判断课程的名称是否等于“Matlab”。可以先在课程表中筛选出课程名称是“Matlab”的课程集合,再选出选课表的课程 ID 从属于这个集合的记录。
【SPL 脚本】
A | B | |
1 | =connect("db") | /连接数据库 |
2 | =A1.query("select * from Course") | /查询课程表 |
3 | =A1.query("select * from SelectCourse") | /查询选课表 |
4 | =A2.select(Name=="Matlab") | /从课程表中选出指定课程 |
5 | =A3.join@i(CourseID, A4:ID) | /使用函数 A.join() 的 @i 选项进行连接过滤 |
6 | =A5.groups(Class; count(1):SelectCount) | /分组汇总各班报名的人数 |
A6的执行结果如下:
Class | SelectCount |
Class 1 | 3 |
Class 2 | 5 |
… | … |
3. 非外键的包含性检测
在两个表中,根据非外键的包含性检测查找记录。
【例 4】 查询各班所有某科成绩超过 80 分的学生数量。成绩表和学生表如下:
【SQL 语句】
从学生表选出数据时,需要判断学生是否有单科成绩超过 80 分的。可以先在成绩表中选出所有大于 80 分的记录,再按学生 ID 去重,得到某科成绩高于 80 分的学生 ID 的集合。接下来只要选出学生的 ID 从属于这个集合的记录。
【SPL 脚本】
A | B | |
1 | =connect("db") | /连接数据库 |
2 | =A1.query("select * from Student") | /查询学生表 |
3 | =A1.query("select * from Score") | /查询学生成绩表 |
4 | =A3.select(Score>80) | /选出有成绩超过 80 分的记录 |
5 | =A4.id(StudentID) | /使用 id 函数按学生 ID 去重 |
6 | =A2.join@i(ID, A5) | /使用函数 A.join@i() 连接过滤 |
7 | =A6.groups(Class; count(1):StudentCount) | /分组汇总每个班级的学生数量 |
A7的执行结果如下:
Class | StudentCount |
Class 1 | 9 |
Class 2 | 11 |
… | … |
在两个表中,根据非外键的匹配性检测查找记录,优化提速。
【例 5】查询 2014 年各城市有销售记录的客户数量。销售表和客户表如下:
【解题思路】
从客户表选出数据时,需要判断客户在 2014 年是否有销售记录。可以先在销售表中选出 2014 年的记录,再按客户 ID 去重,得到 2014 年有销售记录的客户 ID 的集合。接下来只要选出客户表的 ID 从属于这个集合的记录。
【SPL 脚本】
A | B | |
1 | =connect("db") | /连接数据库 |
2 | =A1.query("select * from Customer") | /查询客户表 |
3 | =A1.query("select * from Sales where year(Date)=2014 order by CustomerID") | /查询 2014 年的销售记录,并按客户 ID 排序 |
4 | =A3.groups@o(ID) | /使用 groups 函数按客户 ID 去重,有序时使用 @o 选项 |
5 | =A2.join@i(ID, A4:CustomerID) | /使用函数 A.join@i() 连接过滤 |
6 | =A5.groups(City; count(1):CustomerCount) | /分组汇总每个城市的客户数量 |
A6的执行结果如下:
City | CustomerCount |
Dongying | 6 |
Tangshan | 7 |
… | … |
4. 外键映射的不包含性检测
在两个表中,根据外键映射的不包含性检测查找记录。
【例 6】 查询 2014 年每个新增客户的销售总额。销售表和客户表如下:
【解题思路】
从客户表选出数据时,需要判断该客户在 2014 年没有销售记录。可以先在销售表中筛选出 2014 年有销售记录的集合,再选出客户表的 ID 不从属于这个集合的记录。
【SPL 脚本】
A | B | |
1 | =connect("db") | /连接数据库 |
2 | =A1.query("select * from Sales where year(OrderDate)=2014") | /查询 2014 年的销售记录 |
3 | =A1.query("select * from Customer") | /查询客户表 |
4 | =A2.join@d(CustomerID ,A3:ID) | /使用函数 A.join@d() 从销售表中选出客户 ID 在客户表中不存在的记录 |
5 | =A4.groups(CustomerID; sum(Amount):Amount) | /分组汇总每个客户的销售额 |
A5的执行结果如下:
CustomerID | Amount |
DOS | 11830.1 |
HUN | 57317.39 |
… | … |
《SPL CookBook》中还有更多相关计算示例。