これらのいくつかの SQL 面接の質問は、職歴 0 年の卒業生のほとんどを殺します。

最近、友人が面接中に SQL の質問に遭遇したと言って、いくつかの SQL の質問を送りました。質問を見てください。確かに一般的な SQL の質問とは異なります。実務経験のない初心者にとっては、一部の質問が 1 つの質問を書くことができ、一部の質問は 2 つの質問を書くことができますが、まだいくつかのトリックがあります。多くの。

ただし、実務経験のあるプログラマーの場合、これらの質問のうち少なくとも 3 つは問題ありません。
あなたが卒業したばかりのクラスメートである場合、面接でこれらの質問に偶然遭遇し、その方法をたまたま知っている場合は、おめでとうございます。これらのいくつかの SQL 質問で、面接に 90% の確率で合格する可能性があります。

くだらない話はやめて、次の質問から始めましょう。

質問 1: SQL ステートメントを使用して、ビジネス テーブル (test_1) のフィールド (A) 内の純粋な数値ではないレコードをクエリします。

質問 2: SQL 文を使用して、製品売上ランキング テーブル (test_2) の 3 番目から 6 番目の製品名と売上
データをクエリします。 製品売上ランキング test_2 (製品番号: pro_id、販売量: sales_volume)
製品テーブル test2_pro (product番号: pro_id、製品名 pro_name)

質問 3: SQL 文を使用して、主キーに従ってテーブルの c フィールドの重複データを削除します (テーブル: test_3、主キー: 2 つのフィールド a と b、フィールド c は varchar)

問4:業務テーブル(test_4)(図1)のデータをSQL文で集計し、店舗別、支払方法ごとの支払金額を日次で集計し、SQL文で次のように変換してください。図 2 に示す形式。

================================================= ================================================= ===============================================
_

講義の前に一言言っておきますが、SQLの質問は気持ち悪いです、経験が無いならまずデータを構築しないと、たとえ書き出しても、書いた内容が正しいかどうかは保証できません。構築が水平でない場合、SQL 文の実行結果が正しくても、SQL 文が正しくない可能性があります。

上記の内容が理解できない人もいるかもしれないので、とりあえず無視しましょう ある年、ある月のある日、昨日は正しく実行されたSQL文が今日は間違っているという事態に遭遇するかもしれません。 , 昨日の間違ったデータがたまたま昨日の間違ったSQLに遭遇して、最終的に正しい結果が得られたので、昨日の実行結果が正しかったことが分かると思います。それで。

さて、今回はデータの構築を手伝いました。SQL の質問をしたい場合は、実際のスキルを練習するために自分で練習する必要があります。そのため、この記事では直接答えを示しません。質問は難しいものではありません。練習するには、少し時間をかけて自分で答えを見つけると、問題を解く喜びも得られます。まだ疑問がある場合は、記事に戻ることもできます。答えを得る方法は記事の最後にあります。

CREATE TABLE `test_1` (
  `a` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `test_1` (`a`) VALUES ('abcd1234');
INSERT INTO `test_1` (`a`) VALUES ('1234');
INSERT INTO `test_1` (`a`) VALUES ('1234abcd');
INSERT INTO `test_1` (`a`) VALUES ('abcd');
INSERT INTO `test_1` (`a`) VALUES ('<>?:"');
INSERT INTO `test_1` (`a`) VALUES ('abcd1234aaaa');
INSERT INTO `test_1` (`a`) VALUES ('abcd1234aa234234aa');

CREATE TABLE `test_2` (
  `pro_id` int(11) NOT NULL,
  `sales_volume` int(11) NOT NULL,
  PRIMARY KEY (`pro_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (1, 7);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (2, 8);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (3, 1);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (4, 9);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (5, 10);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (6, 6);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (7, 4);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (8, 5);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (9, 3);
INSERT INTO `test_2` (`pro_id`, `sales_volume`) VALUES (10, 2);

CREATE TABLE `test2_pro` (
  `pro_id` int(11) NOT NULL,
  `pro_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`pro_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (1, 'Mate20');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (2, 'Mate20Pro');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (3, 'Mate30');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (4, 'Mate30Pro');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (5, 'Mate40');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (6, 'Mate40Pro');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (7, 'Mate50');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (8, 'Mate50Pro');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (9, 'P10');
INSERT INTO `test2_pro` (`pro_id`, `pro_name`) VALUES (10, 'P20');


CREATE TABLE `test_3` (
  `a` int(11) NOT NULL,
  `b` int(11) NOT NULL,
  `c` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`a`,`b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test_3` (`a`, `b`, `c`) VALUES (1, 1, 'Tom');
INSERT INTO `test_3` (`a`, `b`, `c`) VALUES (1, 2, 'Tom');
INSERT INTO `test_3` (`a`, `b`, `c`) VALUES (2, 1, 'Jarry');
INSERT INTO `test_3` (`a`, `b`, `c`) VALUES (2, 2, 'Martin');
INSERT INTO `test_3` (`a`, `b`, `c`) VALUES (2, 3, 'Amy');

CREATE TABLE `test_4` (
  `单号` varchar(255) DEFAULT NULL,
  `门店` varchar(255) DEFAULT NULL,
  `结单日期` datetime DEFAULT NULL,
  `支付方式` varchar(255) DEFAULT NULL,
  `支付金额` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020001', '1001', '2022-08-15', '现金', 3);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020002', '1002', '2022-08-14', '支付宝', 4);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020003', '1003', '2022-08-15', '微信', 7);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020004', '1001', '2022-08-14', '银行卡', 6);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020005', '1001', '2022-08-15', '现金', 8);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020006', '1003', '2022-08-14', '微信', 12);
INSERT INTO `test_4` (`单号`, `门店`, `结单日期`, `支付方式`, `支付金额`) VALUES ('2020007', '1004', '2022-08-15', '银行卡', 13);


まず最初の質問について話しましょう。

SQL ステートメントを使用して、ビジネス テーブル (test_1) のフィールド (A) 内の純粋な数値ではないレコードをクエリします。

この質問は一見すると難しくないはずですが、通常の状況では従来の SQL ステートメントを使用することは不可能です。つまり、LIKE を使用して確認したい場合は、申し訳ありませんが、実行できません。このとき、正規表現を使用する必要があります。通常の使用方法を検索してください。

2 番目の質問を見てみましょう。


商品売上ランキングテーブル(test_2)の3位から6位までの商品名と売上データをSQL文で問い合わせます。 商品売上リストtest_2(商品番号:pro_id、売上数量:sales_volume)
商品テーブルtest2_pro(商品番号:pro_id) , 製品名 pro_name)

この問題はそれほど難しくはなく、学習できる大学院生でも問題なく解答できます。試験ポイントは 2 つあります。
1 つはテーブル接続、もう 1 つは制限の使用法ですが、詳細は説明しません。

それから3番目の質問

SQL 文を使用して、主キーに従ってテーブルの c フィールドの重複データを削除します (テーブル: test_3、主キー: a、b 2 つのフィールド、c フィールドは varchar)

この質問は少し難しいです。重複データを削除する投稿はインターネット上にたくさんありますが、その 99% は主キー 1 つです。この質問では主キーが 2 つあるのは少し面倒ですが、考え方は似ています。
たとえば、次のようなアイデアです。

delete from Student
  where Name in( select Name from Student group by  Name having count(Name) > 1) and 
 ID not in(select  max(ID) from Student group by  Name having count(Name) > 1 )

サブクエリを使用して重複する名前リストを見つけ、() 内の名前を使用して削除するレコードを選択します。
次に、() 内にない id を使用して、重複データの中で id 値が最大のものを保持し、その他を削除します。

IN サブクエリを使用する場合、サブクエリには 1 つの列しか含めることができないことはわかっていますが、複数の列を一致させる必要がある場合はどうすればよいでしょうか? これはどうすればいいですか?

実際、サブクエリは 1 つの列しかサポートできず、複数の列を 1 つの列に変更しても問題ないという考えはすでに存在しています。コラムになるにはどうすればいいですか?
concat を使って 2 つの列を接続するなど、さまざまな方法がありますが、注意が必要なのは、レコードが 2 つある場合、a 列と b 列はそれぞれ 11, 2、1, 12 になります。対処しないと実行結果に影響が出ますが、どうすれば解決できますか?頭を使ってください。

最後の4番目の質問:

業務テーブル(test_4)(図1)のデータをSQL文で集計し、店舗別、支払方法ごとの支払金額を日単位で集計し、SQL文でフォーマットに変換図2の。

実際、この SQL インタビューの質問は非常に古典的で、典型的な行から列までを表すため、多くの初心者は混乱します。この問題に対する一般的な解決策は 2 つあります:
1 つはサブクエリ方式、もう 1 つはケース方式ですが、どちらの SQL ステートメントも非常に面倒なようです。
今日は、MYSQL の別の SUM(IF()) メソッドを紹介します。

select 门店,结单日期,sum(if(支付方式='现金',t.支付金额,0)) as 现金
from test_4 t 
group by 门店,结单日期
order by 结单日期,门店

================================================= == ==
実際のところ、SQL の学習に近道はありません。最良の方法は練習することです。練習するときは、まず問題を徹底的に分析し、複雑な問題を分解し、段階的にテストして解決する必要があります。3000 行の SQL ステートメントでも作成できます。

皆さんが怠けてしまわないように、回答を CSDN リソースにアップロードしました。リンクをクリックしてダウンロードしてください。

https://download.csdn.net/download/aley/86401105
はダウンロードに 1 ポイント必要なので、知識を学ぶのに苦労する必要があります。私を叱りたい場合は、コメントで苦情を言ってください。ははは。

ポイントが無い学生は、VX公式アカウントから【八尾SIR面接室】を検索し、注目して「SQL面接質問01」と返信することで、回答を得る事もできます。

おすすめ

転載: blog.csdn.net/aley/article/details/126349751