次のコースは MOOC 学習から派生したものです。元のコースを参照してください:データベースの原則とアプリケーション
の大学院レビュー
概要
SQL開発
注:キーワードとなる関数は何ですか。特に最初の create alterdrop は関数を定義することです。
1. SQLは強力で、データ定義、データ操作、データ制御などの機能を実現します。
2. SQL 言語は簡潔であり、コア機能を実現するために使用される動詞の数は少数です
3. SQL はリレーショナル データベースの 3 レベルのスキーマ構造をサポートします。
4. SQL 言語は他の高級言語で書かれたプログラムに埋め込むことができます
注: ステートメントの形式
補足: モード create/drop schema <スキーマ名> authorization <ユーザー名> スキーマの定義 = 名前空間の定義、データベースオブジェクトなどをさらに定義できます。
補足: インデックス: create/drop [ unique/cluster ] インデックス <インデックス名> on <テーブル名>(...column)
基本的なテーブル定義の作成
#创建数据库
create database <数据库名>
#打开数据库
use <数据库名>
#创建表
create table <表名> (
<属性名> <类型> [约束性条件],
<属性名> <类型> [约束性条件]
)
#主键
sno char(6) primary key
#单独约束主键【多个外键时仅此一种方法】
primary key(sno,cno)
#外键
FOREIGN key(sno) references S(sno)
#后续添加外键级联操作--级联更新|不操作
# ON UPDATE{cascade| NO ACTION}:
# ON DELETE{cascade| NO action}:
#用户定义
SN CHAR(10) NOT NULL,
SEX CHAR(2) DEFALUT'男'
check(sex in('男','女'))
check(GRADE between 0 and 100)
SEX CHAR(2) UNIQUE
create table s(
sno VARCHAR(100) PRIMARY KEY,
sn VARCHAR(100),
sd VARCHAR(100),
sb VARCHAR(100),
sex VARCHAR(100) DEFAULT '男'
CHECK (sex in ('男','女'))
)
ベーステーブルの変更
增加列
alter table <表名>
add <属性名> <类型>
#增加约束规则
alter table <表名>
add PRIMARY KEY (SNO);
#改变某列的类型
alter table <表名>
add column <属性名> <类型>
#删除原有的列或者约束规则
alter table <表名>
drop column <列名> [CASCADE| RESTRICT]
#RESTRICT没有视图或者约束引用该属性时,该属性列才可以删除
#CASCADE删除某列时,对应的视图或者约束删除
alter table <表名>
drop [constraint <约束条件>]
#删除表
drop table <表名> [CASCADE| RESTRICT]
クエリ結果には select が表示されます
基本は繰り返さない
1. SQL クエリ ステートメントで、リレーショナル テーブルのすべての属性を結果に表示する必要がある場合は、* を使用します。
2.結果内の重複したタプル選択の個別の ****列を削除します[デフォルトでは削除されません]
3. クエリ結果の計算 [返される結果]
- 集計関数: count/sum/avg/max/min [all|distinct] <列>
- 属性の null 値については、count() 以外は考慮されず、count( ) は考慮される数だけカウントされます。
- 数学関数/文字列関数/日付関数
例: 選択
クエリ結果の並べ替え順
select **
from ***
order by <目列> [ASC|DESC],<目标列> [ASC|DESC]
#ASC默认升序,降序DESC,如果第一目标列相同,按第二列排序
#<目列>也可以用1,2,3表示,表示第i列属性
#例如 order by 2,3 ASC
5. SQL クエリ ステートメントで、ターゲット列の名前を変更する方法:
- オブジェクトの名前を変更した後、AS を使用して新しい名前を示します。age は age1 となります。
- オブジェクトの名前を変更した後、スペースを含む新しい名前、 age age1 を追加します。
- 【NOT】改名後の新しい名前をカッコ内に記載
クエリは次のような条件を満たします。
select .....
from ....
where <元组条件表达式>
タプル条件式:
1. 演算子: ± / % = > < and or not * 例: 5/3=1
**2. 述語: ... と ... 範囲の間 [ではない] LIKE ... ** 一致
[ not] IN (列名...) 指定されたコレクション IS [not] NULL
- LIKE は部分一致クエリに使用されます [一重引用符]
ここで、文字列式のワイルドカードは
_ は任意の 1 文字を表します [0 文字も可能]
% は、長さが 0 の任意の長い文字列を意味します
<属性列名> [not] like 字符串表达式
where sn like '王%'
where cn like '%\ 实验' ESCAPE'\'
#如果查询内容包括%,下划线,需要使用escape转换
たとえば、DB_Design を検索する場合、LIKE 'DB I_ Design' ESCAPE 'I'
前にエスケープ文字を追加し、後ろに ESCAPE 'I' を追加します
- このうち、INは値がコレクションに属するかどうかを判断するために使用されます。
where sd in('数学','计算机')
グループ化集計 group by、had
select .....
from ....
where <元组条件表达式>
group by <属性列名> [<属性列名>] [HAVING <选择条件>]
1.属性名 1 と属性名 2 の値に基づいて順番にグループ化する; 2.グループ化された結果をフィルタリングする句がある
#平均成绩90分以上 【不能用where是因为where不能用聚集函数avg
select sno,avg(grade)
from sc
where avg(grade)>=90 group by sno
#正确的写法
select sno,avg(grade)
from sc
group by sno having avg(grade)>90;
#男生人数>2人的系名
select sd
from sc
where sex="男"
group by sd having count(*)>2;
接続クエリ結合
複数テーブル結合クエリ
#查询选修C01的学生姓名和成绩
select sn,grade
from sc,s #sc和s做笛卡尔积运算
where sc.sno=s.sno and cno='c01'
接続する場合は、どこでコンテンツの等価関係を補足する必要があることに注意してください。
外部結合クエリ
from <左の関係> left |right|full [外側] join <右の関係> on <結合条件>
#查询所有学生姓名及选修课程号为“C01”的成绩,没有选修该课程的学生,成绩显示为空
select sn,grade
from sc right outer join s
on sc.sno=s.sno and cno='c01'
[通常/内部結合] from <左リレーション> [内部] <右リレーション> on <結合条件>
#查询选修“数据结构”课程的学生的学号、姓名和成绩
select s.sno,sn,grade
from s,sc,c
where s.sno=sc.sno and c.cno=sc.cno and cn='数据结构'
select s.sno,sn,grade
from (s inner join sc on s.sno=sc.sno) inner join c on c.cno=sc.cno
where cn='数据结构'
自己結合クエリ
select ...
from s s1,s s2
from s as s1,s as s2
演習例: 関係 R(A, B, C) と S(C, D) があります。SQL ステートメント select A,B,D from R,S (RC=SC は ( )) と同等の関係代数式です。πA,B,D(σR.C= SC(R×S))
ネストされたクエリ メソッド
サブクエリで処理されたデータが親クエリの現在のタプルに関連しているかどうかに応じて、
ネストされたクエリは、独立したサブクエリと相関サブクエリに分類できます。
-
述語 IN [値が集合に属するかどうか]
-
比較演算子
-
量指定子 ANY ALL [部分的にサポート]
ANY のセマンティクスはクエリ結果の特定の値であり、サブクエリ結果の特定の値が比較演算子を満たす場合、比較演算結果は true になります。
ALL のセマンティクスはクエリ結果のすべての値であり、サブクエリ結果の各値が比較演算子を満たす場合、比較演算結果は true になります。
同値関係 [すべての量指定子が部分的にサポートされているため、置換可能であるため]
-
述語が存在します [相関サブクエリ]
サブクエリのクエリ条件(sc.sno)は親クエリの属性(s.sno)を使用する必要があるため
#查询选修“C02”课程的学生姓名
SELECT SN
FROM S
WHERE SNO IN
( SELECT SNO FROM SC WHERE CNO=‘C02’ )
SELECT SN
FROM S
WHERE EXISTS
(SELECT * FROM SC WHERE SC.SNO=S.SNO AND CNO = ‘C02’)
#查询选修全部课程的学生的姓名
#选修全部课程的学生≡没有一门课他不选的学生
SELECT SN
FROM S
WHERE NOT EXISTS
(SELECT * FROM C
WHERE NOT EXISTS
(SELECT * FROM SC
WHERE SC.SNO=S.SNO AND SC.CNO=C.CNO))
集合演算
select ステートメントはコレクションを返します。複数の select ステートメントは複数のコレクションを返すことができます。
コレクション クエリに関与する 2 つの選択ステートメントでは、クエリ結果の属性名が同じであるだけでなく、属性名の順序も一貫している必要があります。
そして組合
#并
select [语句] union select [语句]
#查询选修了课程号为“C01”或“C02”的学生学号。
select sno from sc where cno='c01'
union
select sno from sc where cno='c02'
#union自动去除重复项
select distinct sno from sc
where cno='c01' or cno='c02'
交差する
#交
select [语句] intersect select [语句]
#查询同时选修课程号为“C01”“C02”的学生学号。
select sno from sc where cno='c01'
intersect
select sno from sc where cno='c02'
select sno from sc
where cno='c01' and cno='c02' #错误
select sno from sc
where cno='c01' and sno in (
select sno from sc where cno='c02'
)
差except
#差
select [语句] except select [语句]
#查询选修了课程号为“C01”但没选修“C02”课程的学生学号
select sno from sc where cno='c01'
except
select sno from sc where cno='c02'
select sno from sc
where cno='c01' and cno='c02' #错误
select sno from sc
where cno='c01' and sno not in (
select sno from sc where cno='c02'
)
データ更新
**insert into <テーブル名> (属性名,…) value (値…) **複数のタプルを挿入できます
-
定数値は、対応する属性名と同じ値の範囲と同じ番号を持ちます。
-
タプルの特定の属性が INTO の後に現れない場合、これらの属性の値は空の値 NULL になります。
-
INTO で属性が指定されていない場合、VALUES 句に新しく挿入されたタプルには各属性の値が必要であり、定数値の順序はテーブル定義の属性の順序と一致している必要があります。
-
INSERT ステートメントはビューにデータを挿入できます。
例: INSERT INTO SC(SNO,CNO) VALUES ('S31','C01');
INSERT INTO S VALUES ('S31','Wang Hao','Computer','1999-10-15',' Male');
または、挿入されたタプルはサブクエリの結果です
例:「コンピュータ」学科の学生の「データベース」コースの選択記録を挿入します。
SC(SNO,CNO)に挿入
SELECT SNO,CNO FROM S,C WHERE SD='コンピュータ' AND CN='データベース';
update <テーブル名> set <属性>=<値> ,… ここで、<条件> は複数の属性値を変更できます
delete from <テーブル名> [where <条件> ]
例: 全科目の平均成績よりも成績が低い科目選択タプルを削除する
DELETE FROM SC WHERE GRADE<(SELECT AVG(GRADE) FROM SC);
- 更新操作の健全性チェック
更新操作が参照整合性を満たすことができない場合に採用される処理戦略
実行の拒否 (NO ACTION) • カスケード操作の生成 (CASCADE) • ヌル値の設定 (SET NULL)
- 更新操作では、リレーショナル テーブルのスキーマ構造は変更されません。
- 更新はクエリに基づいていることが多く、更新にはサブクエリがネストされる場合もあります
- 更新では、データベースによって定義されたさまざまな整合性制約を考慮する必要があります
意見
ビュー (View) は実際にはデータベース内に存在するのではなく、カスタム ビューのクエリで使用されるテーブルの仮想テーブル、行、列データであり、ビューの使用時に動的に生成されます。
つまり、ビューはクエリ ステートメントの実行後に返される結果セットであるため、ビューを作成するときの主な作業は、この SQL クエリ ステートメントを作成することです。
通常のデータテーブルの場合、ビューには次の特性があります。
1. シンプル: ビューは、クエリ ステートメントの実行後にフィルタリングされて返された複合条件の結果セットであるため、ビューを使用するユーザーは、ビューの構造、関連付け条件、およびフィルタ条件を気にする必要はありません。後ろの対応するテーブル。
2. セキュリティ: ビューを使用するユーザーは、クエリを許可された結果セットにのみアクセスできます。テーブルの権限管理は、特定の行または列に制限することはできませんが、ビューを使用することで簡単に実現できます。
3. データの独立性: ビューの構造が決まれば、テーブル構造の変更によるユーザーへの影響を防ぐことができます。ソース テーブルに列を追加してもビューには影響しません。ソース テーブルの列名を変更しても、ビューには影響しません。この問題は、ビューに損傷を与えることなくビューを変更することで解決できます。
2 番目に、ビューの構文
create view <视图名> [列名,]
as 子查询
with check option
#with check option 表示对视图进行和更新操作时,要满足视图定义的条件
#如果没有指明字段,默认所有字段
drop view <视图名> [cascade]
#正常的select,update语句
通常のデータテーブルの場合、ビューには次の特性があります:**
1. シンプル: ビューは、クエリ ステートメントの実行後にフィルタリングされて返された複合条件の結果セットであるため、ビューを使用するユーザーは、ビューの構造、関連付け条件、およびフィルタ条件を気にする必要はありません。後ろの対応するテーブル。
2. セキュリティ: ビューを使用するユーザーは、クエリを許可された結果セットにのみアクセスできます。テーブルの権限管理は、特定の行または列に制限することはできませんが、ビューを使用することで簡単に実現できます。
3. データの独立性: ビューの構造が決まれば、テーブル構造の変更によるユーザーへの影響を防ぐことができます。ソース テーブルに列を追加してもビューには影響しません。ソース テーブルの列名を変更しても、ビューには影響しません。この問題は、ビューに損傷を与えることなくビューを変更することで解決できます。
2 番目に、ビューの構文
create view <视图名> [列名,]
as 子查询
with check option
#with check option 表示对视图进行和更新操作时,要满足视图定义的条件
#如果没有指明字段,默认所有字段
drop view <视图名> [cascade]
#正常的select,update语句