当前位置 博文首页 > mataodehtml的博客:java学习之路——第四十四天

    mataodehtml的博客:java学习之路——第四十四天

    作者:[db:作者] 时间:2021-08-11 09:46

    ?-- 唯一约束:unique

    ?? -- 指定字段为唯一约束的时候。它的值不能重复。一张表中可以有多个唯一约束

    ?? -- 将student表中的tel和ID设置为唯一约束

    ?? DROP TABLE student;

    CREATE TABLE? student(

    ? sid INT PRIMARY KEY AUTO_INCREMENT,

    ? sname CHAR(10),

    ? tel CHAR(11) UNIQUE,

    ? ID? CHAR(18) UNIQUE

    );

    INSERT INTO student(sname,tel,ID) VALUES('张三','12345678912','123456789987654321');

    INSERT INTO student(sname,tel,ID) VALUES('李四','32345678912','223456789987654321');

    ?

    ## 外键约束

    -- 外键和主键是建立表与表之间关系的唯一途径!往往一张表的主键是另外一张表的外键

    -- 创建外键的语法:1.创建表的时候添加外键?? 2.通过修改表结构创建外键

    -- constraint 外键名 foreing key(字段名) reference? 相对于哪张表的外键(哪张表的主键);

    ?

    -- 创建一个用户表

    CREATE TABLE t_user(

    ? uid INT PRIMARY KEY AUTO_INCREMENT,

    ? uname CHAR(10)

    );

    INSERT INTO t_user(uname) VALUES('zs');

    INSERT INTO t_user(uname) VALUES('ls');

    INSERT INTO t_user(uname) VALUES('ww');

    -- 创建一个版块表,每一个版块都是由用户表中用户管理

    CREATE TABLE t_section(

    ?sid INT PRIMARY KEY AUTO_INCREMENT,

    ?sname CHAR(10),

    ?u_id INT,

    ?CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid)

    );

    INSERT INTO t_section(sname,u_id) VALUES('java',1);

    INSERT INTO t_section(sname,u_id) VALUES('.net',1);

    INSERT INTO t_section(sname,u_id) VALUES('php',2);

    INSERT INTO t_section(sname,u_id) VALUES('c',4);-- 报错,u_id的值必须来自t_user中的uid

    -- 查询zs管理哪个版块

    SELECT sname FROM t_section WHERE? t_section.u_id=1;

    ?

    ## 表与表之间的关系

    --? 一对一? 一对多(多对一)??? 多对多

    -- 老师表

    CREATE TABLE teacher(

    ???????? id VARCHAR(10) PRIMARY KEY,

    ???????? NAME VARCHAR(10)

    );

    -- 课程表

    CREATE TABLE course(

    ???????? id VARCHAR(10) PRIMARY KEY,

    ???????? NAME VARCHAR(10),

    ???????? t_id VARCHAR(10),

    ???????? FOREIGN KEY(t_id) REFERENCES teacher(id)

    );

    ?

    -- 学生表

    DROP TABLE student;

    CREATE TABLE student(

    ???????? id VARCHAR(10) PRIMARY KEY ,

    ???????? NAME VARCHAR(10)

    );

    ?

    -- 学生和课程的中间表

    CREATE TABLE stuCourse(

    ???????? id VARCHAR(10) PRIMARY KEY,

    ???????? stu_id VARCHAR(10),

    ???????? couse_id VARCHAR(10),

    ???????? score INT,

    ???????? FOREIGN KEY(stu_id) REFERENCES student(id),

    ???????? FOREIGN KEY(couse_id) REFERENCES course(id)

    );

    ?

    ## 多表之间的查询操作

    CREATE TABLE A(

    ? A_ID INT? PRIMARY KEY AUTO_INCREMENT,

    ? A_NAME VARCHAR(10)

    );

    INSERT INTO A VALUES(1,'苹果');

    INSERT INTO A VALUES(2,'橘子');

    INSERT INTO A VALUES(3,'香蕉');

    ?

    CREATE TABLE B(

    ?A_ID INT? PRIMARY KEY AUTO_INCREMENT,

    ? B_PRICE DOUBLE

    );

    INSERT INTO B VALUES(1,2.3);

    INSERT INTO B VALUES(2,3.5);

    INSERT INTO B VALUES(4,NULL);

    ?

    SELECT * FROM A,B;-- 结果为笛卡尔积,大多数据对我们来说没有任何意义

    ## 内连接 :多张表中的公共部分,就是我们数学中的集合的交集

    -- 语法1:select 列名 , 列名 .... from 表名1,表名2 where 表名1.列名 = 表名2.列名;

    -- 查询每种水果的价格

    SELECT A.`A_ID`,A_NAME,B_PRICE FROM A,B WHERE? A.`A_ID`=B.`A_ID`;

    -- 语法2:select * from 表名1? inner join 表名2 on 条件

    SELECT A.`A_ID`,A_NAME,B_PRICE FROM A JOIN B ON? A.`A_ID`=B.`A_ID`;

    ?

    ## 外连接:

    -- 左外连接:左表数据不动,右边表的数据往左表上去添加,不管是否找到,都将显示左边表中全部记录。

    -- 语法: select * from 表1 left outer join 表2 on 条件;

    -- 不管能否查到水果对应的价格,都要把水果显示出来。

    SELECT * FROM A LEFT OUTER JOIN B ON A.`A_ID`=B.`A_ID`;

    ?

    -- 右外连接:右表数据不动,左边表的数据往右表上去添加,不管是否找到,都将显示右边表中全部记录。

    -- 语法: select * from 表1 right outer join 表2 on 条件;

    -- 不管能否查到价格对应的水果,都要把价格显示出来。

    SELECT * FROM A RIGHT OUTER JOIN B ON A.`A_ID`=B.`A_ID`;

    ?

    ## 全外连接:左外连接和右外连接的结果合并,且会去掉重复的记录。

    -- 语法:select * from 表1 full outer join 表2 on 条件;但是mysql数据库不支持此语法。Oracle数据库支持

    SELECT * FROM A FULL OUTER JOIN B ON A.`A_ID`=B.`A_ID`;

    -- 我们又必须要这个结果怎么办?这个时候可以通过联合查询来得到结果

    -- 需求1:将左连接和右连接整合在一起显示出来。(使用union all)

    -- 需求2:将左连接和右连接整合在一起 去除重复的 显示出来。(使用union)

    SELECT * FROM A LEFT OUTER JOIN B ON A.`A_ID`=B.`A_ID` UNION ALL SELECT * FROM A RIGHT OUTER JOIN B ON A.`A_ID`=B.`A_ID`;

    SELECT * FROM A LEFT OUTER JOIN B ON A.`A_ID`=B.`A_ID` UNION? SELECT * FROM A RIGHT OUTER JOIN B ON A.`A_ID`=B.`A_ID`;

    ?

    ## SQL语句子查询

    ? --? 子查询:把一个sql的查询结果作为另外一个查询的参数存在。

    ? -- 常见的子查询有where型子查询(将查询结果当成条件来用)?

    ? -- from型子查询(将查询结果当成表来用)

    ? -- 需求1:查询价格最贵的水果名称

    ? -- 1.找出最贵价格

    ? SELECT MAX(B_PRICE) FROM B;

    ? -- 2.找出最贵价格的id

    ? SELECT A_ID FROM B WHERE B_PRICE=(SELECT MAX(B_PRICE) FROM B);

    ? -- 3.最贵价格的id到A表中匹配水果

    ? SELECT A_NAME FROM A? WHERE A_ID=(SELECT A_ID FROM B WHERE B_PRICE=(SELECT MAX(B_PRICE) FROM B))

    cs