当前位置:首页 > 编程教程 > mysql技术文章 > MySql学习day03:数据表之间的连接、查询详解

深入理解MySql数据表之间的连接、查询

  • 发布时间:
  • 作者:码农之家
  • 点击:74

这篇文章主要知识点是关于MySql、数据表、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

PHP+MySQL程序设计及项目开发
  • 类型:PHP+MySQL大小:105.1MB格式:PDF作者:郑广成,朱翠苗
立即下载

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

主键:

关键字:primary key

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

主键分类:

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

主键使用方式:

方式一:

    Create table t1(

       Id int primary key,

       Name varchar(100)

);

Insert into t1 values(1,'zs');

Insert into t1 values(2,'ls');

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

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

主键自动增长:

关键字: auto_increment

   create table t4(

                     id int primary key auto_increment,

                     name varchar(100)

);

Insert into t4(name) values(‘zs');

Insert into t4 values(null,'ls');

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

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

域完整性:

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

数据类型

长度

非空约束:NOT NULL

唯一约束:UNIQUE

    CREATE TABLE t5(

                     username varchar(100) NOT NULL UNIQUE,

                     gender varchar(100) NOT NULL,

                     phonenum varchar(100) UNIQUE

       );

数据表之间的连接:

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

创建客户表:

CREATE TABLE customers(

  id int,

  name varchar(100),

  address varchar(255),

  PRIMARY KEY(id)

);

创建订单表:

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)

);

插入数据:

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

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

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

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

创建老师表:

   Create table teachers(

              id int,

              name varchar(100)

              salary float(8,2),

              primary key(id)

);

创建学生表:

 Create table students(

  id int,

  name varchar(100),

  grade varchar(100),

  primary key(id)

); 

第三张表格:

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)

);

插入数据:

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

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

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

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数据表之间的连接、查询详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

MySql 相关电子书
学习笔记
网友NO.285635

如何解决一次非法关机导致mysql数据表损坏的问题

排查修复数据表的经过: 1、访问网页,提示错误,连接不到数据库。 2、启动mysql服务,卸载和关闭rpm安装的mysql服务 (昨天安装postfix好像yum安装了mysql),用netstat -anp |grep mysqld 命令查看mysql服务没有起来,用mysql -uroot -p也连接不到服务器。 3、查看错误提示: 110726 17:02:23 [ERROR] Cant open the mysql.plugin table. Please run mysql_upgrade to create it. 110726 17:02:23 [ERROR] /usr/local/mysql/libexec/mysqld: Table ./mysql/host is marked as crashed and last (automatic?) repair failed 110726 17:02:23 [ERROR] Fatal error: Cant open and lock privilege tables: Table ./mysql/host is marked as crashed and last (automatic?) repair failed 110726 17:02:23 mysqld_safe mysqld from pid file /var/lib/mysql/localhost.localdomain.pid ended 110726 17:24:31 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 110726 17:24:31 [Warning] --skip-locking is deprecated and will be removed in a future relea……

网友NO.867075

mysql中数据库与数据表编码格式的查看、创建及修改

一、查看数据库编码格式 mysql show variables like 'character_set_database'; 二、查看数据表的编码格式 mysql show create table 表名; 三、创建数据库时指定数据库的字符集 mysqlcreate database 数据库名 character set utf8; 四、创建数据表时指定数据表的编码格式 create table tb_books ( name varchar(45) not null, price double not null, bookCount int not null, author varchar(45) not null ) default charset = utf8; 五、修改数据库的编码格式 mysqlalter database 数据库名 character set utf8; 六、修改数据表格编码格式 mysqlalter table 表名 character set utf8; 七、修改字段编码格式 mysqlalter table 表名 change 字段名 字段名 类型 character set utf8;mysqlalter table user change username username varchar(20) character set utf8 not null; 八、添加外键 mysqlalter table tb_product add constraint fk_1 foreign key(factoryid) references tb_factory(factoryid);mysqlalter table 表名 add constraint 外键……

网友NO.876882

mysql数据库修改数据表引擎的方法

对于MySQL数据库,如果你要使用事务以及行级锁就必须使用INNODB引擎。如果你要使用全文索引,那必须使用myisam。 INNODB的实用性,安全性,稳定性更高但是效率比MYISAM稍差,但是有的功能是MYISAM没有的。修改MySQL的引擎为INNODB,可以使用外键,事务等功能,性能高。 查看数据表的状态 SHOW TABLE STATUS FROM sites WHERE NAME='site'; SHOW TABLE STATUS FROM db_name WHERE NAME='table_name'; 更改表的引擎 alter table table_name engine=innodb; alter table table_name engine=myisam; ……

网友NO.920639

MYSQL使用.frm恢复数据表结构的实现方法

我们都知道当我们建立数据表(innodb或myisam)时,会生成相应的文件(如:MYD,MYI,frm) 在这里,我们探讨下使用frm文件恢复 innodb和myisam类型表的结构,不过由于他们存储引擎的特性,所以恢复的方法也不一样,以下是详细的恢复过程。 myisamchk "xxx.frm" myisamchk 可以试出来,库是不是 myisam 类型 1:恢复innodb类型数据表结构 我们先从test数据目录 copy一个innodb.frm文件到另外一个库(innodb) mysql USE innodb; mysql DATABASE changed mysql SHOW CREATE TABLE innodb; ERROR 1146 (42S02): TABLE 'innodb.innodb' doesn't exist 说明拷贝过来的文件是不能直接使用的,然后我们建立另外一个库(tmp),并在这个库里建立一个innodb类型的表 mysql CREATE DATABASE tmp; mysql CREATE TABLE innodb (`id` int(11) NOT NULL) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 然后我们copy innodb下的 innodb.frm 到 tmp数据目录下,并覆盖tmp目录下的innodb.frm 下面我们 resta……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com