Heim  >  Artikel  >  Datenbank  >  Detaillierte Erläuterung von Einschränkungen, Mehrtabellenabfragen und Unterabfragen in MySQL

Detaillierte Erläuterung von Einschränkungen, Mehrtabellenabfragen und Unterabfragen in MySQL

黄舟
黄舟Original
2017-09-07 10:58:441743Durchsuche

1. Primärschlüsseleinschränkungen von Einschränkungen

Einschränkungen: Einschränkungen werden zu Spalten hinzugefügt, um Spalten einzuschränken.

1. Primärschlüsseleinschränkung (eindeutige Identifikation): ungleich Null, eindeutig, referenziert

Wenn eine Spalte der Tabelle als Primärschlüssel festgelegt ist, darf die Klasse nicht leer sein oder ein Duplikat haben Werte. Es gibt

zwei Möglichkeiten, den Primärschlüssel beim Erstellen einer Tabelle anzugeben:

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)
);

Geben Sie die SID-Spalte als Primärschlüsselspalte an, d. h. fügen Sie eine Primärschlüsseleinschränkung hinzu die Sid-Spalte

Beim Ändern des Tabellenprimärschlüssels angeben:

ALTER TABLE stu ADD PRIMARY KEY(sid);

Primärschlüssel löschen:

ALTER TABLE stu DROP PRIMARY KEY;

2. Primärschlüssel automatisch inkrementieren

Weil die Eigenschaften der Primärschlüsselspalte sind: Sie muss eindeutig sein und darf nicht leer sein. Daher wird der Primärschlüssel normalerweise als Ganzzahl angegeben und dann wird sein automatisches Wachstum festgelegt. Dadurch wird sichergestellt, dass die Primärschlüsselspalte vorhanden ist eindeutig und ungleich Null beim Einfügen von Daten.

Geben Sie die automatische Inkrementierung des Primärschlüssels beim Erstellen einer Tabelle an.

CREATE TABLE stu(
    sid  INT PRIMARY KEY AUTO_INCREMENT,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10)
);

Legen Sie die automatische Inkrementierung des Primärschlüssels beim Ändern der Tabelle fest:

ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

Löschen Sie den Primärschlüssel Automatisches Inkrementieren des Schlüssels beim Ändern der Tabelle:

ALTER TABLE stu CHANGE sid sid INT ;

Automatisches Inkrementieren des Primärschlüssels testen:

INSERT INTO stu VALUES(NULL,'zhangsan',23,'man');
INSERT INTO stu(sname,age,sex) VALUES(NULL,'zhangsan',23,'man');

3. Nicht-Null-Einschränkungen

Da einige Spalten dies nicht können auf Nullwerte gesetzt werden, können Sie Nicht-Null-Einschränkungen hinzufügen.

Zum Beispiel:

CREATE TABLE stu (
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname  VARCHAR(20) NOT NULL,
   age   INT,
   sex  VARCHAR(10)
);

Für die Sname-Spalte wird eine Nicht-Null-Einschränkung festgelegt.

4. Eindeutige Einschränkungen

Einige Spalten in der Garage können keine wiederholten Werte haben, daher können Sie den Spalten eindeutige Einschränkungen hinzufügen.

Zum Beispiel:

CREATE TABLE stu (
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname  VARCHAR(20) NOT NULL UNIQUE,
   age   INT,
   sex  VARCHAR(10)
);

2. Konzeptmodell

1. Objektmodell: In Java ist es Domäne, zum Beispiel: Benutzer, Student.

2. Relationales Modell: Tabellen in der Datenbank sind 1-zu-viele, 1-zu-1 und viele-zu-viele.

3. Fremdschlüsseleinschränkungen

Der Fremdschlüssel muss der Wert des Primärschlüssels einer anderen Tabelle sein (der Fremdschlüssel muss auf den Primärschlüssel verweisen).

Fremdschlüssel kann wiederholt werden

Fremdschlüssel können leer sein

1. Fremdschlüsseleinschränkungen beim Erstellen hinzufügen

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. Fremdschlüsseleinschränkungen hinzufügen, wenn die Tabelle geändert wird:

ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERNCES dept(deptno);

IV, Datenbankrelationales Modell

1. Eine Eins-zu-Eins-Beziehung in einer Tabelle herzustellen Es ist notwendig, den Primärschlüssel einer der Tabellen sowohl zu einem Primärschlüssel als auch zu einem Fremdschlüssel zu machen.

2. Viele-zu-viele-Beziehung
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) 
);

Um eine Viele-zu-viele-Beziehung in einer Tabelle herzustellen, müssen Sie eine Zwischentabelle verwenden, das heißt, Sie benötigen drei Tabellen und zwei Fremdschlüssel in der Zwischentabelle verweisen jeweils auf die Primärschlüssel der anderen beiden Tabellen.

Stellen Sie eine Beziehung in der Zwischentabelle her, wie zum Beispiel:
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. Klassifizierung
INSERT INTO stu_tea VALUES(5,1);
INSERT INTO stu_tea VALUES(2,2);
INSERT INTO stu_tea VALUES(3,2);

Ergebnismenge zusammenführen

Abfrage zusammenführen

Unterabfrage

2. Ergebnisabfrage zusammenführen

Erfordert den Typ und die Anzahl der Spalten in der Ergebnismenge in der zusammengeführten Tabelle sind gleich

UNION, doppelte Zeilen entfernen

UNION ALL, keine doppelten Zeilen entfernen

3. Verbindungsabfrage

①Klassifizierung
SELECT * FROM 表1名
UNION ALL
SELECT * FROM 表2名;

Verbindung

Äußerer Join

Linker äußerer Join

Rechter äußerer Join

Vollständiger äußerer Join (MySQL wird nicht unterstützt)

Natürlicher Join (gehört zu einer vereinfachten Methode)

②Inner Join

Dialekt: SELECT * FROM Tabelle 1 Alias ​​1, Tabelle 2 Alias ​​2 WHERE Alias ​​1.xx = Alias ​​2.xx ;

Verwenden Sie bedingte Filterung, um nutzlose Informationen aus dem kartesischen Produkt zu entfernen.

Standard: SELECT * FROM Tabelle 1 Alias ​​1 INNER JOIN Tabelle 2 Alias ​​2 ON Alias ​​1.xx = Alias ​​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;

Natürlich: SELECT * FROM Tabelle 1 Alias ​​1 NATURAL JOIN Tabelle 2 Alias ​​​​2;

SELECT e.ename, e.sal , d.dname  FROM emp e INNER JOIN dept d ON  e.deptno=d.deptno;
Alle vom Inner Join abgefragten Datensätze erfüllen die Bedingungen

③Outer Join
SELECT e.ename, e.sal , d.dname  FROM emp e NATURAL JOIN dept d;

Links außen: SELECT * FROM Table 1 Alias ​​1 LEFT OUTER JOIN Tabelle 2 Alias ​​2 ON Alias ​​1.xx = Alias ​​2.xx

Die Datensätze in der linken Tabelle werden abgefragt, unabhängig davon, ob sie die Bedingungen erfüllen Die Datensätze in der rechten Tabelle können nur abgerufen werden, wenn sie die Bedingungen erfüllen. Datensätze in der linken Tabelle, die die Bedingungen nicht erfüllen, sind in der rechten Tabelle null.

Linker äußerer natürlicher: SELECT * FROM Tabelle 1 Alias ​​​​1 NATURAL LEFT OUTER JOIN Tabelle 2 Alias ​​​​2 ON Alias ​​​​1.xx = Alias ​​​​2.xx;

Rechts außen: SELECT * FROM Tabelle 1 Alias ​​​​1 RIGHT OUTER JOIN Tabelle 2 Alias ​​​​2 ON Alias ​​​​1.xx = Alias ​​​​2.xx; Die Datensätze auf der rechten Seite In der Tabelle wird abgefragt, ob sie die Bedingungen erfüllen oder nicht, während die Datensätze in der linken Tabelle nur abgerufen werden können, wenn sie die Bedingungen erfüllen. Datensätze in der rechten Tabelle, die die Bedingungen nicht erfüllen, sind in der linken Tabelle null.

SELECT e.ename, e.sal , IFNULL(d.dname,'无部门') AS dname  FROM emp e LEFT OUTER JOIN dept d ON  e.deptno=d.deptno;
Right Outer Natural: SELECT * FROM Table 1 Alias ​​​​1 NATURAL RIGHT OUTER JOIN Table 2 Alias ​​​​2 ON Alias ​​​​1.xx = Alias ​​​​2.xx; Vollständiger Link: Sie können UNION verwenden, um „Vollständig verbunden“ abzuschließen.

4. Unterabfrage

Es gibt eine Abfrage in der Abfrage (überprüfen Sie die Anzahl der ausgewählten Schlüsselwörter)

①Die Position, an der sie erscheint

Nach WHERE Existiert als Bedingung

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;
Existiert als Tabelle nach FROM (mehrere Zeilen und mehrere Spalten)

②Bedingung

Einzelne Zeile und einzelne Spalte: SELECT * FROM Tabelle 1 Alias 1 WHERE Spalte 1 [=, >, 95ec6993dc754240360e28e0de8de30a=, <=, !=] (SELECT Spalte FROM Tabelle 2 Alias ​​2 WHERE Bedingung);

Mehrere Zeilen und einzelne Spalte : SELECT * FROM Tabelle 1 Alias ​​1 WHERE Spalte 1 [IN,ALL,ANY] (SELECT Spalte FROM Tabelle 2 Alias ​​2 WHERE Bedingung);

Einzelne Zeile und mehrere Spalten: SELECT * FROM Tabelle 1 Alias ​​1 WHERE (Spalte 1, Spalte 2) IN (SELECT Spalte 1, Spalte 2 FROM Tabelle 2 Alias ​​2 WHERE Bedingung);

Mehrere Zeilen und Spalten: SELECT * FROM Tabelle 1 Alias ​​1, ( SELECT...) Tabelle 2 Alias ​​2 WHERE-Bedingung;

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Einschränkungen, Mehrtabellenabfragen und Unterabfragen in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn