You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SQLite中查询同时掌握指定编程语言的员工方法

查询同时掌握指定编程语言子集的员工SQL语句及Python实现

一、先修正你原来的单语言查询SQL

你之前写的单语言查询缺少JOIN的关联条件,正确的查询掌握C++的员工语句应该是:

SELECT e.employee_name
FROM employees e
JOIN employee_known_languages ek ON e.employee_id = ek.employee_id
JOIN programming_languages pl ON ek.language_id = pl.language_id
WHERE pl.language_name = 'C++';

二、查询同时掌握多种语言的SQL(以Python和C++为例)

要找出同时掌握指定多种语言的员工,核心思路是先筛选出掌握目标语言之一的员工,再按员工分组,统计其匹配到的目标语言数量,确保数量等于目标语言的总数:

SELECT e.employee_name
FROM employees e
JOIN employee_known_languages ek ON e.employee_id = ek.employee_id
JOIN programming_languages pl ON ek.language_id = pl.language_id
WHERE pl.language_name IN ('Python', 'C++')
GROUP BY e.employee_id, e.employee_name
HAVING COUNT(DISTINCT pl.language_name) = 2;

这里用DISTINCT是为了避免同一员工重复关联同一种语言的情况(比如员工多次记录掌握同一种语言),保证统计的是不同语言的数量。

三、通用化SQL模板(适配任意语言子集)

如果要查询掌握N种指定语言的员工,只需要替换IN里的语言列表,同时把HAVING后的数字改成N即可。比如要找同时掌握Python、C++、JavaScript的员工:

SELECT e.employee_name
FROM employees e
JOIN employee_known_languages ek ON e.employee_id = ek.employee_id
JOIN programming_languages pl ON ek.language_id = pl.language_id
WHERE pl.language_name IN ('Python', 'C++', 'JavaScript')
GROUP BY e.employee_id, e.employee_name
HAVING COUNT(DISTINCT pl.language_name) = 3;

四、Python动态查询函数实现

下面是一个可以传入任意语言列表、自动生成SQL查询的Python函数,用sqlite3为例(其他数据库如MySQL只需调整连接方式):

import sqlite3

def get_employees_by_languages(db_path, target_languages):
    if not target_languages:
        return []
    
    # 生成SQL占位符,避免SQL注入风险
    placeholders = ', '.join(['?'] * len(target_languages))
    query = f"""
        SELECT e.employee_name
        FROM employees e
        JOIN employee_known_languages ek ON e.employee_id = ek.employee_id
        JOIN programming_languages pl ON ek.language_id = pl.language_id
        WHERE pl.language_name IN ({placeholders})
        GROUP BY e.employee_id, e.employee_name
        HAVING COUNT(DISTINCT pl.language_name) = ?
    """
    
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    # 传入参数:目标语言列表 + 语言总数
    cursor.execute(query, target_languages + [len(target_languages)])
    results = [row[0] for row in cursor.fetchall()]
    conn.close()
    return results

# 调用示例
if __name__ == "__main__":
    # 假设数据库文件为employees.db
    matched_employees = get_employees_by_languages('employees.db', ['Python', 'C++'])
    print("同时掌握Python和C++的员工:", matched_employees)  # 输出结果:['Bob']

内容的提问来源于stack exchange,提问作者Nathan Pierson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:57:10