目次
10. 従業員テーブル emp があり、名前、性別、部門、給与のフィールドがあります。次のデータをクエリします。
関係テーブルの作成
1 対多 (1:n) では、多テーブルに外部キーが作成されます (外部キーは 1 つのテーブルの主キーに対応します)。
多対多 (m:n) は追加の中間テーブルを作成します。中間テーブルには少なくとも 2 つのフィールドがあり、多対多の両方のパーティの主キーを指す外部キーとして機能します。
データベースSQLの実行順序
1. SQL ステートメントには通常、次のものが含まれます。
集計関数の 制限 による順序 を 持つ グループ の 結合
から 選択します。
2. 実行シーケンスについて説明します。
1) まず、記述したステートメントの順序に従って左から右に実行されないことを確認します。
2) 結果セットを取得します --> クエリの特定のフィールドを指定 --> 特定の内容に従って並べ替えます
- 1.まず from と join を実行してテーブル間の関係を決定し、予備的な結果セット 1 を取得します。
- 2.結果セット 1 をフィルターして取得 –> 結果セット 2
- 3 .グループ化のための group by --> 結果セット 3
- 4.結果セット 3 を次の条件でフィルタリングし、----> 結果セット 4 を取得します。
- クエリのフィールドを指定します。
- 5.Select はクエリ対象のフィールドを指定するか、集計関数 -> 結果の重複排除を指定します。
- 6.グループ化された結果セットを結合し、条件による順序に従って並べ替えます。
- 7. limit または topがある場合は、最後に実行されます。
内部接続と外部接続の書き方
内部結合
1.A は Ax = Bx で B を結合します。
2.Ax = Bx 上の内部結合 B、内部は省略可能
3.ここで、Ax = Bx;
select * A join B on Ax = Bx ここで...
select * from A,B where Ax = Bx..
外部結合
1.A は Ax = Bx で B を左結合します。
2.A は Ax = Bx で B を右結合します。
select * A left join B on Ax = Bx ここで...
1. 製品リストを設計する
製品名、製品価格、製品在庫、製品説明のフィールドを含む製品テーブルを設計します。
drop table if exists product;
create table product(
name varchar(20), --商品名称 varchar() 使用字符集UTF8 一个汉字占三个字节
price decimal(11,2), --商品价格 使用decimal() 比double精确
storage int, --商品库存
description varchar(100) --商品描述。
);
2. 教師リストを設計する
名前、年齢、身長、体重、性別、学歴、誕生日、ID 番号のフィールドを含む教師テーブルを設計します。
drop table if exists teacher;
create table teacher(
name varchar(20),
age int,
height double,
weight double,
sex bit,
birthday TIMESTAMP, timestamp 时间日期型 精确到秒 格式 2000-1-1 10:05:00
id_number varchar(18)
);
3.書籍リストをデザインする
次のフィールドを含む書籍テーブルをデザインします:書籍名、書籍著者、書籍価格、書籍カテゴリ
drop table if exists book;
create table book(
name varchar(20),
author varchar(20),
price decimal(11,2),
category varchar(20)
);
4. クエリの練習
公開日 create_date が 2019 年 1 月 1 日の午前 10 時 30 分から 2019 年 11 月 10 日の午後 4 時 2 分までである記事を記事テーブルでクエリします。
select * from Article where create_date が '2019-01-01 10:30:00' から '2019-11-10 16:02:00' まで;
5. クエリの練習
クエリ記事テーブルで、記事タイトルが空であるか、公開日 create_date が 2019 年 1 月 1 日以降になっています。
select * タイトルが null の記事から、または create_date > '2019-01-01 00:00:00';
6. 勤怠管理システムの設計
従業員テーブル、勤怠記録テーブル 従業員および 1 対多の記録を含む勤怠システム
-- 主要考虑记录表中的记录信息,是如何关联到员工表,员工与记录关系为1:m。
create table emp(
id int primary key,
name varchar(20)
);
create table info(
id int primary key,
emp_id int,
info_date timestamp,
foreign key (emp_id) references emp(id)
);
7. 学校寮管理システムの設計
学校の寮管理システムには、寮情報、学生情報、寮の日常点検記録が義務付けられています。寮と学生の間で1対多、寮と病棟回診の間で1対多
-- 主要考虑学生与宿舍的关系:m:1,宿舍的查房记录是根据宿舍来查的,与宿舍有关系,一个宿舍可以多次查房,宿舍与查房记录是1:m的关系
create table dormitory(
id int primary key,
number varchar(20)
);
create table student(
id int primary key,
name varchar(20),
dormitory_id int,
foreign key (dormitory_id) references dormitory(id)
);
create table info(
id int primary key,
dormitory_id int,
status bit,
info_date timestamp,
foreign key (dormitory_id) references dormitory(id)
);
8. 車両違反システムの設計
車両違反システムは、利用者テーブル、車両テーブル、違反情報テーブルから構成される。違反情報テーブルには、ユーザと車両の違反情報が含まれる。
-- 用户可以拥有多辆车,关系为1:m,
题目已经说明违章信息包括用户和车辆,说明违章信息表中要记录用户和车辆
,一个用户可以有多次违章记录,用户与违章记录关系为1:m,
一辆车也可以有多次违章记录,车辆与违章记录关系也为1:m
create table user(
id int primary key,
name varchar(20)
);
create table cars(
id int primary key,
name varchar(20),
user_id int,
foreign key (user_id) references user(id)
);
create table info(
id int primary key,
user_id int,
cars_id int,
foreign key (user_id) references user(id), --两个外键
foreign key (cars_id) references cars(id)
);
9. 学校食堂の管理システムを設計する
学食管理システムには、学食テーブル、学食倉庫テーブル、倉庫料金記録テーブルが含まれます。
-- 一个食堂有多个仓口卖饭,关系为1:m,
--每个仓口卖饭可以有很多次,仓口与收费记录也是1:m
create table hall(
id int primary key,
name varchar(20)
);
create table hall_opening(
id int primary key,
name varchar(20),
hall_id int,
foreign key (hall_id) references hall(id)
);
create table info(
id int primary key,
price int,
info_date timestamp,
hall_opening_id int,
foreign key (hall_opening_id) references hall_opening(id)
);
10. 従業員テーブル emp があり、名前、性別、部門、給与のフィールドがあります。次のデータをクエリします。
1. 男性従業員と女性従業員の平均給与をクエリする
性別別の emp グループから「平均給与」として sex,avg(salsry) を選択します。
2. 各部門の給与総額を問い合わせる
出発ごとに従業員グループから出発、合計(給与)を選択します。
3. 2 番目に給与が高い部門を問い合わせる
従業員グループから出発順序、合計(給与)降下制限1,1で出発、合計(給与)を選択します。
4.重複した名前を持つ従業員情報をクエリする
count(name)>1 を持つ名前によって emp グループから名前を選択します。
5. 各部門の給与が 10,000 を超える男性従業員の平均給与をクエリします。
従業員から出発、平均(給与)を選択します。ここで、性別 = '男'、給与> 10000 出発ごとにグループ化します。
11.実際の面接の質問
従業員テーブル、部門テーブル、給与テーブルがあり、クエリ条件に従って対応するSQLを記述します[東城宜龍2020学校採用筆記試験問題]
これで、従業員テーブル、部門テーブル、給与テーブルが追加されました。部門テーブルのフィールドには、部門 ID、名前が含まれ、従業員テーブルのフィールドには、スタッフ ID、名前、年齢、部門 ID が含まれ、給与テーブルの給与のフィールドには、給与 ID、スタッフ ID、給与、月が含まれます。
(質問 a): '2016-09' 月の各部門の給与総額を求めます。
出発、スタッフ、給与から出発名、合計(給与)を選択します。ここで、出発.デパートID = スタッフ.デパートID、スタッフ.スタッフ_ID = 給与.スタッフID、および月は「2016-09-01 00:00:00」から「2016-」までです。 09-30 23:59:59' 出発.Depart_id によるグループ化;
選択する
出発地名、金額(給与)
から
出発 スタッフに参加する 出発地.Depart_id = Staff.Depart_id
給与をstaff.staff_id =給与.staff_idに結合します
どこ
「2016-09-01 00:00:00」から「2016-09-30 23:59:59」までの月
グループ化
出発.出発_id;
(問題b):各部門の人数を求め、部門名と部門数を出力してもらいます。
select 出発.デパートID,カウント(スタッフID) から出発,スタッフ ここで 出発.デパートID = スタッフ.デパートID グループによる出発.デパートID;
(問題c):会社の各部門の月給を調べ、当月と今月の給料の合計を出力してもらいます。
; から、Department.Depart_id ,mouth,sum(salary) を選択します。
12.実際の面接の質問
以下のデータベースの検索条件を記述してください[SJTU Sinuo 2020 筆記試験問題]
次の 2 つのテーブルがあります。
表A(varchar(32)名、intグレード)
データ: zhangshan 80、lisi 60、wangwu 84
表B(varchar(32) 名、整数年齢)
データ:zhangshan 26、lisi 24、wangwu 26、wutian 26
次のクエリ結果を取得する SQL ステートメントを作成します。
| 名前 | グレード | 年齢 |
| --------- | ----- | ---- |
|張山 | 80 | 26 |
| リシ | 60 | 24 |
| 王武 | 84 | 26 |
| ウーティアン | null | 26 |
B から B.name 、学年、年齢を選択し、B 上の A を左に結合します。 = A.name;