ホームページ >データベース >mysql チュートリアル >MySQL の制約、マルチテーブル クエリ、サブクエリの詳細な説明
1. 制約の主キー制約
制約: 制約は列を制約するために列に追加されます。
1.主キー制約(一意の識別):非null、一意、参照
テーブルの列が主キーとして指定される場合、クラスを空にすることはできず、重複する値は出現できません
テーブルの作成時に主キーを指定する 2 つの方法:
CREATE TABLE stu( sid CHAR(6) PRIMARY KEY, sname VARCHAR(20), age INT, sex VARCHEAR(10) ); CREATE TABLE stu( sid CHAR(6) , sname VARCHAR(20), age INT, sex VARCHEAR(10), PRIMARY KEY(sid) );
sid 列を主キー列として指定する、つまり、sid 列に主キー制約を追加する
テーブルを変更するときに主キーを指定する:
ALTER TABLE stu ADD PRIMARY KEY(sid);
主キーを削除します:
ALTER TABLE stu DROP PRIMARY KEY;
2. 主キーは自動的に大きくなります
主キー列の特性は次のとおりです: 一意である必要があり、空にすることはできないため、通常は主キーを整数として指定し、次のように設定します。これにより、データの挿入時に主キー列の一意性と非 null 特性が保証されます。
テーブル作成時に主キーの自動インクリメントを指定する
CREATE TABLE stu( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20), age INT, sex VARCHEAR(10) );
テーブル変更時に主キーの自動インクリメントを設定する:
ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
テーブル変更時に主キーの自動インクリメントを削除する:
ALTER TABLE stu CHANGE sid sid INT ;
主キーをテストするauto-increment:
INSERT INTO stu VALUES(NULL,'zhangsan',23,'man'); INSERT INTO stu(sname,age,sex) VALUES(NULL,'zhangsan',23,'man');
3. 非 null 制約
一部の列には null 値を設定できないため、非 null 制約を追加できます。
例:
CREATE TABLE stu ( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20) NOT NULL, age INT, sex VARCHAR(10) );
は、sname 列に非 null 制約を設定します。
4. 一意の制約
ガレージ内の一部の列には繰り返し値を設定できないため、列に一意の制約を追加できます。
例:
CREATE TABLE stu ( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20) NOT NULL UNIQUE, age INT, sex VARCHAR(10) );
2. 概念モデル
1. オブジェクト モデル: Java のドメイン、例: ユーザー、学生
2. データベース内のテーブル、1 対多、1 対 1、多対多。
3. 外部キーの制約
外部キーは別のテーブルの主キーの値でなければなりません (外部キーは主キーを参照する必要があります)
外部キーは繰り返し可能です
外部キーは空でも構いません
1. 制約を作成するときに外部キーを追加します
CREATE TABLE dept ( deptno INT PRIMARY KEY AUTO_INCREMENT, dname VARCHAR(50) ); insert into dept values(10,'研发部'); insert into dept values(20,'人力部'); insert into dept values(30,'财务部'); CREATE TABLE emp ( empno INT PRIMARY KEY AUTO_INCREMENT, ename VARCHAR(50), deptno INT, CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno) ); CREATE TABLE dept ( deptno INT PRIMARY KEY AUTO_INCREMENT, dname VARCHAR(50) ); INSERT INTO dept VALUES(10,'研发部'); INSERT INTO dept VALUES(20,'人力部'); INSERT INTO dept VALUES(30,'财务部'); INSERT INTO emp(empno,ename) VALUES(null,'zhangsan'); INSERT INTO emp(empno,ename,deptno) VALUES(null,'lisi',10); INSERT INTO emp(empno,ename,deptno) VALUES(null,'zhangsan',80); /* Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`mydb2`.`emp`, CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`)) */
2. テーブルを変更するときに外部キー制約を追加します
1. 1 対 1 の関係を確立します。テーブル内のテーブルは特別です。主キーは主キーと外部キーの両方です。
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERNCES dept(deptno);
2. 多対多の関係
テーブル内で多対多の関係を確立するには、中間テーブルを使用する必要があります。つまり、3 つのテーブルが必要で、中間テーブルで 2 つの外部キーを使用します。 table を使用して、他の 2 つのテーブルの主キーを参照します。
CREATE TABLE hasband ( hid INT PRIMARY KEY AUTO_INCREMENT, hname VARCHAR(50) ); CREATE TABLE wife ( wid INT PRIMARY KEY AUTO_INCREMENT, wname VARCHAR(50), CONSTRAINT fk_wife_hasband FOREIGN KEY (wid) REFERENCES hasband(hid) );
次のような関係を中間テーブルに確立します。
CREATE TABLE student ( sid INT PRIMARY KEY , ...... ); CREATE TABLE teacher( tid INT PRIMARY KEY , ...... ); CREATE TABLE stu_tea ( sid INT, tid INT, ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY (sid) REFERENCES student(sid) , ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY (tid) REFERENCES teacher(tid) );
5. 複数テーブル クエリ
1. 結果セットを結合
接続クエリ
サブクエリ
2. 必須マージされるテーブルでは、結果セット内の列の型と数が同じです
UNION、重複行を削除します
UNION ALL、重複行を削除しません
INSERT INTO stu_tea VALUES(5,1); INSERT INTO stu_tea VALUES(2,2); INSERT INTO stu_tea VALUES(3,2);
3. 結合クエリ
①分類
内部結合
外部結合
左外部結合
右外部結合
完全外部結合(mysqlはサポートしていません)
自然結合(簡略化された方法に属します)
②内部結合
方言: SELECT * FROM Table 1 Alias 1、Table 2 Alias 2 WHERE Alias 1.xx = Alias 2.xx;
SELECT * FROM 表1名 UNION ALL SELECT * FROM 表2名;
デカルト積内の不要な情報を削除するには、条件付きフィルタリングを使用します。
標準: SELECT * FROM テーブル 1 エイリアス 1 INNER JOIN テーブル 2 エイリアス 2 ON エイリアス 1.xx = エイリアス 2.xx;
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno; SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno;
ナチュラル: SELECT * FROM テーブル 1 エイリアス 1 NATURAL JOIN テーブル 2 エイリアス 2;内部結合でクエリされたすべてのレコードは条件
③外部結合
を満たします。 左外部: SELECT * FROM Table 1 Alias 1 LEFT OUTER JOIN Table 2 Alias 2 ON Alias 1.xx = Alias 2。 xx;
左側のテーブルのレコード 条件が満たされるかどうかに関係なくクエリが実行され、右側のテーブルは条件が満たされる場合にのみ取得できます。左側のテーブルの条件を満たさないレコードは、右側のテーブルでは null になります。
SELECT e.ename, e.sal , d.dname FROM emp e INNER JOIN dept d ON e.deptno=d.deptno;
自然な左外側: SELECT * FROM テーブル 1 エイリアス 1 NATURAL LEFT OUTER JOIN テーブル 2 エイリアス 2 ON エイリアス 1.xx = エイリアス 2.xx
右外側: SELECT * FROM テーブル1 Alias 1 RIGHT OUTER JOIN Table 2 Alias 2 ON Alias 1.xx = Alias 2.xx;
右側のテーブルのレコードは、条件を満たすかどうかに関係なくクエリされます。左側のテーブルのレコードは、条件を満たす場合にのみ取得できます。条件を満たさない右側のテーブルのレコードは、左側のテーブルでは null になります。
右外側の自然: SELECT * FROM Table 1 Alias 1 NATURAL RIGHT OUTER JOIN Table 2 Alias 2 ON Alias 1.xx = Alias 2.xx
完全なリンク: UNION を使用して、完全結合を完了します。
SELECT e.ename, e.sal , d.dname FROM emp e NATURAL JOIN dept d;
4. サブクエリ
クエリ内にクエリがある(選択キーワードの数を確認)
①出現位置
WHERE以降に条件として存在する
FROM以降にテーブルとして存在する(複数行)複数列)
②条件
単一行単一列: SELECT * FROM table 1 alias 1 WHERE column 1 [=, >, 95ec6993dc754240360e28e0de8de30a=, <=, !=] (SELECT columns FROM table 2 エイリアス 2 WHERE 条件);
SELECT e.ename, e.sal , IFNULL(d.dname,'无部门') AS dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;
複数の行と単一の列: SELECT * FROM テーブル 1 エイリアス 1 WHERE 列 1 [IN,ALL,ANY] (SELECT 列 FROM テーブル 2 エイリアス 2 WHERE 条件);および複数の列: SELECT * FROM table 1 alias 1 WHERE (Column 1, Column 2) IN (SELECT Column 1, Column 2 FROM Table 2 Alias 2 WHERE 条件);
SELECT e.ename, e.sal , d.dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno UNION SELECT e.ename, e.sal , d.dname FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno;
複数の行と複数の列: SELECT * FROMテーブル 1 エイリアス 1、(SELECT...) テーブル 2 エイリアス 2 WHERE 条件
以上がMySQL の制約、マルチテーブル クエリ、サブクエリの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。