MySql学习day03:数据表之间的连接、查询详解

吾爱主题 阅读:139 2024-04-05 14:03:27 评论:0

主键:

关键字:primary key

特点:不能为null,并且唯一。

主键分类:

  1. 逻辑主键:例如ID,不代表实际的业务意义,只是用来唯一标识一条记录(推荐)
  2. 业务主键:例如username,参与实际的业务逻辑。

主键使用方式:

方式一:

?
1 2 3 4 5 6 7 8 9 10 11      Create table t1(           Id int primary key ,           Name varchar (100)   );   Insert into t1 values (1, 'zs' );   Insert into t1 values (2, 'ls' );

主键自动增长:

关键字: auto_increment

?
1 2 3 4 5 6 7 8 9 10 11     create table t4(                         id int primary key auto_increment,                         name varchar (100)   );   Insert into t4( name ) values (‘zs ');   Insert into t4 values(null,' ls');

域完整性:

指数据库表的列(即字段)必须符合某种特定的数据类型或约束

数据类型

长度

非空约束:NOT NULL

唯一约束:UNIQUE

?
1 2 3 4 5 6 7 8 9      CREATE TABLE t5(                         username varchar (100) NOT NULL UNIQUE ,                         gender varchar (100) NOT NULL ,                         phonenum varchar (100) UNIQUE           );

数据表之间的连接:

1.一对多(1*N):客户和订单,一个客户可以有多个订单,每个订单只属于一个客户

创建客户表:

?
1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE customers(      id int ,      name varchar (100),      address varchar (255),      PRIMARY KEY (id)   );

创建订单表:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE orders(           order_num int primary key ,           price float (8,2),           status int ,           customer_id int ,   CONSTRAINT customer_id_fk FOREIGN KEY (customer_id) REFERENCES customers(id)   );

插入数据:

2.多对多:用第三张表的外键连接两张表的主键。

老师和学生是多对多关系, 一个老师对应多个学生,一个学生被多个老师教

创建老师表:

?
1 2 3 4 5 6 7 8 9 10 11     Create table teachers(                  id int ,                  name varchar (100)                  salary float (8,2),                  primary key (id)   );

创建学生表:

?
1 2 3 4 5 6 7 8 9 10 11 Create table students(      id int ,      name varchar (100),      grade varchar (100),      primary key (id)   );

第三张表格:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 Create table teacher_student(           t_id int ,           s_id int ,           primary key (t_id,s_id)   CONSTRAINT teacher_id_fk FOREIGN KEY (t_id) REFERENCES teachers(id),   CONSTRAINT student_id_fk FOREIGN KEY (s_id) REFERENCES students(id)   );

插入数据:

3.一对一:一张表的外键连接第二张表的主键,实际开发中不需要这么做,直接设计一张表格就可以了。

多表查询:

交叉连接(笛卡尔积):第一个表格的所有行 乘以 第二个表格中的所有行,最终结果不正确,故一般不使用。

内连接:

因为交叉连接获得的结果集是错误的。因此内连接是在交叉连接的基础上

只列出连接表中与连接条件相匹配的数据行,匹配不上的记录不会被列出。

语法:

隐式语法:

select * from customers,orders where customers.id=orders.customer_id;

显式语法:

 select * from customers c INNER JOIN orders o ON c.id=o.customer_id;

外连接:

外连接是以一张表为基表,其他表信息进行拼接,如果有就拼接上,如果没有显示null; 外连接分为左外连接和右外连接。

左外连接: 以关键字左边的表格为基表进行拼接

语法: select * from customers c LEFT JOIN orders o ON c.id=o.customer_id;

右外连接: 以关键字右边的表格为基表

语法: select * from orders o RIGHT JOIN customers c ON c.id=o.customer_id;

注意:表a左外连接表b与表b右外连接表a结果是一样的。

子查询:

某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候就会用到子查询,为了给主查询(外部查询) 提供数据而首先执行的查询(内部查询)被叫做子查询; 子查询分为嵌套子查询和相关子查询。

嵌套子查询:

内部查询的执行独立于外部查询,内部查询仅执行一次,执行完毕后将结果作为外部查询的条件使用(嵌套子查询中的子查询语句可以拿出来单独运行。)

语法及练习: 查询出id为1的老师教过的所有学生。

select * from students where id in(select s_id from teacher_student where t_id=1);

相关子查询:

内部查询的执行依赖于外部查询的数据,外部查询每执行一次,内部查询也会执行一次。每一次都是外部查询先执行,取出外部查询表中的一个元组,将当前元组中的数据传递给内部查询,然后执行内部查询。根据内部查询执行的结果,判断当前元组是否满足外部查询中的where条件,若满足则当前元组是符合要求的记录,否则不符合要求。然后,外部查询继续取出下一个元组数据,执行上述的操作,直到全部元组均被处理完毕。

语法及练习:求每一科考试成绩大于平均分的学生的分数。

select * from score as a where a.score>(select avg(b.score) from score as b where a.cou_id=b.cou_id);

以上所述是小编给大家介绍的MySql数据表之间的连接、查询详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://blog.csdn.net/weixin_43800846/article/details/89190710

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容