MySQL的封锁、多表查询、子查询

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

因为一些列不只怕设置为null值,所以能够对增进非空约束。

询问中有询问(查看select关键字的个数)

  • 自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2 ;

二 、主键自增加

贰 、概念模型

叁 、非空约束

② 、关系模型:在数据库中表,1对多,1对1,多对多。

  • 因为主键列的表征是:必须唯一,不可以为空,所以大家常见会内定主键为整型,然后设置其机动拉长,那样可以保险在插入数据时主键列的绝无仅有和非空性格。
  • 创建表时钦点主键自增进

    CREATE TABLE stu(

    sid  INT PRIMARY KEY AUTO_INCREMENT,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10)
    

    );

  • 修改表时设置主键自增进:

     以标准筛选去除笛Carl积中没用的音信。

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

自律:约束是添加在列上的,用来约束列的。

  在表中创造一对一关系比较特殊,需求让内部一张表的主键,即是主键又是外键。

  • 单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2)IN (SELECT
    列1,列2 FROM 表2 别名2 WHERE 条件);
  • 修改表时去除主键自增进:
  • WHERE后作为基准存在
  • FROM后当做表存在(多行多列)

SELECT * FROM 表1名

UNION ALL

SELECT * FROM 表2名;

①分类

SELECT e.ename, e.sal , d.dname  FROM emp e INNER JOIN dept d ON
 e.deptno=d.deptno;

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,(SELECT……)表2 别名2 WHERE
    条件;

ALTER TABLE stu CHANGE sid sid INT ;

二 、修改表时添加外键约束:

① 、主键约束(唯一标识):非空、唯① 、被引述

① 、一对一关乎

③ 、连接查询

在表中确立多对多涉及须要动用中间表,即须要三张表,在中间表中应用四个外键,分别引用其余两张表的主键。

  • 方言:SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名1.xx=别名2.xx;

⑤ 、多表查询

对sname列设置了非空约束。

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

  • 单行单列:SELECT * FROM 表1 别名1 WHERE 列1
    [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE
    条件) ;

INSERT INTO stu VALUES(NULL,’zhangsan’,23,’man’);

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

SELECT * FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE
job=’经理’) ;

车库某个列不可以设置双重的值,所以能够对列添加唯一约束。

  • 多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN,ALL,ANY] (SELECT
    列 FROM 表2 别名2 WHERE 条件);

ALTER TABLE stu DROP PRIMARY KEY;

一 、创立时添加外键约束

4、子查询

  • 联合结果集
  • 连年查询
  • 子查询

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 NATURAL LEFT OUTER JOIN 表2 别名2
    ON 别名1.xx=别名2.xx;
  • 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON
    别名1.xx=别名2.xx;

    • 右表记录随便是或不是满足条件都会询问出来,而左表唯有满足条件才能出来。右表中不知足条件的笔录,左表部分都为null。
  • 右外自然:SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2
    别名2 ON 别名1.xx=别名2.xx;
  • 全链接:可以采取UNION来完结全连接。
  • 务求被联合表中,结果集列的类型和列数相同
  • UNION,去除重复行
  • UNION ALL,不去除重复行
  • 内接连查询出的有着记录都满意条件

例如:

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

①出现的职位

④ 、唯一约束

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`))
*/

③ 、外键约束

②条件

在中间表中创制关系,如:

  • 剔除主键:

SELECT * FROM emp WHERE (job,deptno) IN (SELECT job,deptno from emp
WHERE deptno=30) ;

肆 、数据库关系模型

ALTER TABLE stu ADD PRIMARY KEY(sid);

  钦点sid列为主键列,即为sid列添加主键约束

  • 外键必须是另一表的主键的值(外键要引用主键。)
  • 外键可以再一次
  • 外键可以为空

二 、多对多涉及

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

②内连接

  • 修改表时指定主键:
  • 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON
    别名1.xx=别名2.xx;
  • 测试主键自增进:

壹 、约束之主键约束

一 、对象模型:在Java中是domain ,例如:User、Student .

INSERT INTO stu_tea VALUES(5,1);

INSERT INTO stu_tea VALUES(2,2);

INSERT INTO stu_tea VALUES(3,2);

  • 内连接
  • 外连接
    • 左外连接
    • 右外连接
    • 全外连接(mysql不支持)
    • 理所当然连接(属于一种简化格局)

SELECT * FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);

③外连接

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;

1、分类

  • 当表的某一列被内定为主键后,该类就不能为空,无法有重复值出现
  • 创办表时内定主键的两种方式:

    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)
    

    );

CREATE TABLE stu (
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname  VARCHAR(20) NOT NULL,
   age   INT,
   sex  VARCHAR(10)
);
  • 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON
    别名1.xx=别名2.xx;

    • 左表记录随便是还是不是满意条件都会询问出来,而右表唯有满足条件才能出去。左表中不满意条件的记录,右表部分都为null。

ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

相关文章