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);
リーリー
対応するデータを置き換えるだけです。
その SQL で表現される意味はおそらく次のとおりです:
注
except
の後には、この従業員が習得したすべてのskill
が続きます。1. SQL の本であれ、オンライン情報であれ、人々は長くて複雑な SQL ステートメントを書きたがりますが、これは実際には間違っています。 SQL ステートメントが長すぎて複雑すぎると、構造設計、コード作成、デバッグ、メンテナンス、プロジェクトの引き継ぎなどが困難になるためです。
2. 正しい考え方は、各ステートメントをできるだけ単純かつ短くすることです。より多くの変数、テーブル変数、一時テーブルを使用して複雑さを軽減し、より多くの関数、ストアド プロシージャ、ビューを使用して再利用性を高め、結合とコードの冗長性を軽減します。
個人的な質問:
タイトルの説明は不正確ですか?
スキルで 3 つのスキルを習得している従業員を見つける必要があります。この 3 つのスキルだけでなく他のスキルも習得している従業員がいる場合、
そのような従業員は本の SQL ステートメントによって選別されます
あるいは質問は、スキル表のすべてのスキルを習得し、のみ習得する従業員に変更するべきではないでしょうか?
問題の核心は、集合 A のすべてのメンバーが集合 B にあることを SQL でどのように表現するかということです。
否定の否定の論理が使用されます: 集合 B にない集合 A のメンバーは存在しません
セット A: Skills テーブルのすべてのレコード
セット B: EmpSkills テーブルは各従業員に対応するレコード
SQL の論理変換のプロセス:
1. EmpSkill の全従業員を検索します
EmpSkill テーブル内の各従業員に対応するスキルを削除します
上記の「否定の否定」条件に従って、従業員がスキルテーブル内のすべてのスキルを持っているかどうかを判断します
もう 1 つのアイデアは、まず従業員とスキルのマトリックスを構築し、それが EmpSkill テーブルに存在するかどうかを確認することです。存在する場合、除外条件としてはスキルが不完全であることを意味します。SQL は次のようになります。 :
リーリー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