ホームページ  >  記事  >  データベース  >  MySQL の制約、マルチテーブル クエリ、サブクエリの詳細な説明

MySQL の制約、マルチテーブル クエリ、サブクエリの詳細な説明

黄舟
黄舟オリジナル
2017-09-07 10:58:441744ブラウズ

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,&#39;无部门&#39;) 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。