Mysql起步之路二

多表查询:

CREATE TABLE IF NOT EXISTS emp(

                        idINT UNSIGNED AUTO_INCREMENT KEY,

                        nameVARCHAR(20) NOT NULL,

                        ageTINYINT NOT NULL DEFAULT 18,

                        emailVARCHAR(20) NOT NULL DEFAULT '[email protected]',

                        depIdTINYINT UNSIGNED NOT NULL

                        )ENGINE=INNODBCHARSET=UTF8;

 

 

create table dep(

id tinyint unsignedauto_increment key,

depName varchar(50) not nullunique,

depDesc varchar(100) not nulldefault ''

)ENGINE=INNODB CHARSET=UTF8;

 

INSERT INTO dep(depName,depDesc)VALUES('PHP教学部','研发PHP'),

('JAVA教学部','研发JAVA'),

('MySql教学部','研发mysql'),

('GO教学部','研发GO');

 

INSERT INTOemp(name,age,depId) VALUES('king',22,1),

('queue',21,2),

('jack',25,1),

('mooc',30,3),

('lili',32,3),

('jonh',11,2);

1、 笛卡尔积的形式:

    SELECT emp.id,emp.name,emp.age,dep.depNamefrom emp,dep;

2、 内连接的形式:查询两个表中符合连接条件的记录

    SELECT 字段名称,… FROM tb_name1

    INNER JOIN tb_name2

    ON 连接条件;

    Eg:SELECT e.name,age,d.depName FROMemp AS e INNER JOIN dep AS d ON e.depId=d.id;

3、 外链接的形式

    a)        左外链接:先显示左表中的全部记录,再去右表中查询符合条件的记录,不符合的以NULL代替

               SELECT 字段名称,… FROM tb_name1

              LEFT OUTER JOIN tb_name2

                ON 连接条件;

                Eg:SELECT e.name,age,d.depName FROMemp AS e LEFT JOIN dep AS d ON e.depId=d.id;

    b)        右外链接:先显示右表中的全部记录,再去左表中查询符合条件的记录,不符合的以NULL代替

                SELECT 字段名称,… FROM tb_name1

                 RIGHTOUTER JOIN tb_name2

                 ON 连接条件;

                Eg:SELECT e.name,age,d.depName FROMemp AS e RIGHT JOIN dep AS d ON e.depId=d.id;

            Eg:三表联查:

            SELECTs.id, s.productName, s.price, c.cateName, u.username, u.email

            FROMshops AS s

            JOIN userAS u

            ONs.adminId=u.id

            JOIN cateAS c

            ONs.cateId=c.id;

外键约束(只有INNODB引擎的表支持外键):

         子表的外键必须关联父表的主键

         创建外键:

         1、 建表是指定外键:[CONSTRAINT 外键名称] FOREIGN KEY(字段名称) REFERENCES 主表(字段名称)

                Eg:

                CREATE TABLE news_cate(

                idTINYINT unsigned AUTO_INCREMENT key COMMENT'编号',

                cateNameVARCHAR(50) NOT NULL unique COMMENT '分类名称',

                cateDescVARCHAR(50) NOT NULL default 'xxx' COMMENT '分类描述'

                )ENGINE=INNODB CHARSET=UTF8;

                INSERT news_cate(cateName)values('国内新闻'),

            ('国际新闻'),

            ('娱乐新闻'),

            ('体育新闻');

            CREATE TABLE news(

            id INT unsigned auto_increment key comment '编号',

            title varchar(20) not null unique comment '新闻标题',

            content varchar(50) not null comment '新闻内容',

            cateId tinyint unsigned not null comment '新闻所属分类编号',

            CONSTRAINT cateId_fk_newsCate FOREIGN KEY(cateId) REFERENCES news_cate(id)

            )ENGINE=INNODB CHARSET=UTF8;

                INSERT news(title,content,cateId)values('a1', 'aaa1', 1),

                ('a2', 'aaa2', 1),

                ('a3', 'aaa3', 1),

                ('a4', 'aaa4', 4),

                ('a5', 'aaa5', 2),

                ('a6','aaa6', 3);

                注意:

                    1、 子表的外键字段和主表的主键字段要相似,若是数值型要求一致,并且有无符号也要一致;若是字符型,要求类型一致,长度可以不同

                    2、 如果外键字段没有创建索引,会自动创建

    2、 动态创建外键

        a)        动态删除外键

                 ALTERTABLE tb1_name DROP FOREIGN KEY fk_name;

                           ALTER TABLE news

                           DROP FOREIGN KEY cateId_fk_newsCate;

        b)        动态添加外键

                ALTER TABLE tb1_name

                ADD [CONSTRAINT外键名称] FOREIGN KEY(外键字段) REFERENCES 主表(主键字段);

                           ALTER TABLE news

                            ADD FOREIGN KEY(cateId) REFERENCES news_cate(id);

注意:动态添加外键之前表中的记录一定是合法的记录,不能有脏值,否则添加不成功

    3、 外键的约束参照操作:

            a)        CASCADE----从父表删除或更新,子表也跟着删除或更新

            b)        SET NULL ----从父表删除或更新,并设置子表的外键列为NULL。

            c)        NO ACTION | RESTRIC ---拒绝对父表做更新或删除操作

                ALTERTABLE news

                ADD CONSTRAINT cateId_fk_newsCate FOREIGNKEY(cateId) REFERENCES news_cate(id)

                ON DELETE CASCADE ON UPDATE CASCADE;


猜你喜欢

转载自blog.csdn.net/qq_37585236/article/details/80603894