検索

ホームページ  >  に質問  >  本文

mysql - 一个sql查询的题目,望路过大神看下

1.上图两个表,要求找出掌握Skills中全部3个技能的员工,即神崎和相田,要求用mysql的语句实现

2.刚学sql,不是很会,想了好久

3.下面是书里面用sql server写的,我也不是很理解,另外mysql中没有except

SELECT DISTINCT emp
  FROM EmpSkills  ES1
 WHERE NOT EXISTS
        (SELECT skill
           FROM Skills
         EXCEPT
         SELECT skill
           FROM EmpSkills ES2
          WHERE ES1.emp = ES2.emp);
巴扎黑巴扎黑2837日前740

全員に返信(6)返信します

  • 迷茫

    迷茫2017-04-17 15:54:17

    リーリー

    対応するデータを置き換えるだけです。

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 15:54:17

    その SQL で表現される意味はおそらく次のとおりです:

    従業員がマスターした skill のリストが Skills リストから削除された後に空の場合、この従業員が選択されます。

    except の後には、この従業員が習得したすべての skill が続きます。

    返事
    0
  • PHPz

    PHPz2017-04-17 15:54:17

    1. SQL の本であれ、オンライン情報であれ、人々は長くて複雑な SQL ステートメントを書きたがりますが、これは実際には間違っています。 SQL ステートメントが長すぎて複雑すぎると、構造設計、コード作成、デバッグ、メンテナンス、プロジェクトの引き継ぎなどが困難になるためです。

    2. 正しい考え方は、各ステートメントをできるだけ単純かつ短くすることです。より多くの変数、テーブル変数、一時テーブルを使用して複雑さを軽減し、より多くの関数、ストアド プロシージャ、ビューを使用して再利用性を高め、結合とコードの冗長性を軽減します。

    返事
    0
  • 黄舟

    黄舟2017-04-17 15:54:17

    個人的な質問:
    タイトルの説明は不正確ですか?
    スキルで 3 つのスキルを習得している従業員を見つける必要があります。この 3 つのスキルだけでなく他のスキルも習得している従業員がいる場合、
    そのような従業員は本の SQL ステートメントによって選別されます
    あるいは質問は、スキル表のすべてのスキルを習得し、のみ習得する従業員に変更するべきではないでしょうか?

    返事
    0
  • 怪我咯

    怪我咯2017-04-17 15:54:17

    問題の核心は、集合 A のすべてのメンバーが集合 B にあることを SQL でどのように表現するかということです。
    否定の否定の論理が使用されます: 集合 B にない集合 A のメンバーは存在しません

    セット A: Skills テーブルのすべてのレコード
    セット B: EmpSkills テーブルは各従業員に対応するレコード

    SQL の論理変換のプロセス:
    1. EmpSkill の全従業員を検索します

    1. EmpSkill テーブル内の各従業員に対応するスキルを削除します

    2. 上記の「否定の否定」条件に従って、従業員がスキルテーブル内のすべてのスキルを持っているかどうかを判断します


    もう 1 つのアイデアは、まず従業員とスキルのマトリックスを構築し、それが EmpSkill テーブルに存在するかどうかを確認することです。存在する場合、除外条件としてはスキルが不完全であることを意味します。SQL は次のようになります。 :

    リーリー

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 15:54:17

    SELECT a.emp,SUM((CASE WHEN a.skill='Oracle' THEN 1 ELSE 0 END) + (CASE WHEN a.skill='UNIX' THEN 1 ELSE 0 END) + (CASE WHEN a.skill ='Java' THEN 1 ELSE 0 END)) AS count FROM empskills a JOIN スキル b ON a.skill = b.skill GROUP BY a.emp HAVING count = 3

    返事
    0
  • キャンセル返事