在数据中,建表处理是非经常见且非常有用的方法。

表和表之间的关系有 1:1

 1:N

       
N:N

三种方式。

1对1的方式

<span style="font-size:18px;">演示样例:一夫一妻
思考:在一个表中保存着全部人的信息。有男有女。要求查询出全部的夫妻。即一男一女。
注意以下:王五是光棍不应该能查询出来。</span>
<span style="font-size:18px;">CREATE TABLE person(
   id INT,
   NAME VARCHAR(10),
   sex CHAR(1),
   wife INT,
   husband INT
);
INSERT INTO person VALUES(1,'小花','0',0,3);
INSERT INTO person VALUES(2,'玉芬','0',0,4);
INSERT INTO person VALUES(3,'张三','1',1,0);
INSERT INTO person VALUES(4,'李四','1',2,0);
INSERT INTO person VALUES(5,'王五','1',0,0); //一对一关系的操作:查出每对夫妻的姓名
CREATE VIEW w AS SELECT * FROM person WHERE sex='0';
CREATE VIEW m AS SELECT * FROM person WHERE sex='1';
//不利用表与表之间的关系
SELECT w.NAME AS 妻子, m.NAME AS 丈夫 FROM w,m WHERE w.husband=m.id AND m.wife=w.id;
//如今更先进的方式:利用表间的关系
SELECT w.NAME AS 妻子, m.NAME AS 丈夫 FROM w INNER JOIN m ON w.husband=m.id AND m.wife=w.id;
</span>

1对多的方式

1对多,多对1。
一个人能够拥有多辆汽车,要求查询出某人所拥有的全部汽车。
依据范式的要求,应该设计两张表。分别表示人的信息和汽车的信息。<strong>
</strong>
//步骤1:画E-R图
//步骤2:分别建实体表,并给多方的表加入外键约束
CREATE TABLE person2(
   id VARCHAR(32) PRIMARY KEY,
   pname VARCHAR(30),
   sex CHAR(1)
);
CREATE TABLE car(
   id VARCHAR(32) PRIMARY KEY,
   cname VARCHAR(30),
   price NUMERIC(10,2),
   pid VARCHAR(32),
   CONSTRAINT car_fk FOREIGN KEY(pid) REFERENCES person2(id)
);
DROP TABLE car; //步骤3:为两个表加入測试数据
//实体表1
INSERT INTO person2(id,pname,sex) VALUES('P001','Jack','1');
INSERT INTO person2(id,pname,sex) VALUES('P002','Tom','1');
INSERT INTO person2(id,pname,sex) VALUES('P003','Rose','0');
INSERT INTO person2(id,pname,sex) VALUES('P004','Mary','0');
INSERT INTO person2(id,pname,sex) VALUES('P005','Mike','1');
SELECT * FROM person2; ////实体表2
INSERT INTO car(id,cname,price,pid) VALUES('C001','BMW',123.5,'P001');
INSERT INTO car(id,cname,price,pid) VALUES('C002','Benz',123.5,'P001');
INSERT INTO car(id,cname,price,pid) VALUES('C003','BMW',223.5,'P001'); INSERT INTO car(id,cname,price,pid) VALUES('C011','BMW',83.5,'P003');
INSERT INTO car(id,cname,price,pid) VALUES('C012','Benz',100,'P003');
INSERT INTO car(id,cname,price,pid) VALUES('C013','Audi',223.5,'P003'); INSERT INTO car(id,cname,price,pid) VALUES('C021','BMW',88.5,'P004');
INSERT INTO car(id,cname,price,pid) VALUES('C022','QQ',10,'P004'); INSERT INTO car(id,cname,price,pid) VALUES('C023','Audi',73,'P005');
INSERT INTO car(id,cname,price) VALUES('C033','Audi',1000);
/查询:哪些人有什么样的车 (用"表名.列名"的形式訪问列,假设列名不反复,能够省略表名)
//利用一方的主键和“多方”的外键进行关联
SELECT person2.pname,car.cname FROM person2,car WHERE person2.id=car.pid;
//查询Jack有什么车
SELECT person2.pname,car.cname FROM person2,car WHERE person2.id=car.pid AND person2.pname='Jack' ;
//查询哪些人有两辆以上的车
SELECT person2.pname,COUNT(pname) AS 车数量 FROM person2,car WHERE person2.id=car.pid GROUP BY pname HAVING COUNT(pname)>=2 ORDER BY 车数量;
SELECT * FROM person2 WHERE id IN ( SELECT pid FROM car GROUP BY pid HAVING COUNT(pid)>=2 ); //查询哪些人没有车
SELECT * FROM person2 WHERE id NOT IN( SELECT pid FROM car );

多对多

多对多:
一个人能够拥有多种角色。如某人,即是父亲、又是儿子、又是丈夫。而同一时候这三个角色又能够给其它全部的人。 要求查询出即是父亲、又是儿子、又是丈夫的全部人。 查询出全部人拥有的全部角色。<strong>
</strong>
还有学生选课系统都是多对多的情况 

详细的实现方法在最后的比笔记中贴出来

数据库的约束

主键 primary key
在创建表时指定主键---在声明主键时。应该同一时候使用not nullkeyword。
Create table stud(id int primary key,…..)
在创建完毕之后指定主键:
Alter table stud add constraint stud_pk primary key(id);
主键自己主动增长:
Auto_increment 适合于int类型的字段
外键 foreign key-表示一种引用关系
与还有一个表的关联关系-称为外键。外键的作用时当主表中没有记录时。无法向子表中写入无引用的记录:
Alter table stud  add constraint stud_fk foreign key(stud_clsid) references cls(id);
主外键关系是一种1对多的关系。假设主表中没有的记录,子表中将不能添加。
创建主外键关联,两个表的数据类型和大小必须保持一致否则创建将不会成功。
能够通过可视化界面操作主外关联。
唯一 unique – 与主键有所差别,主键不能为null,而unique能够有一列为null这是SqlServer的限制,但Mysql能够写入多列的null值,所以,在mysql上使用unique时一般再通过not null进行限制。

alter table cls  add constraint cls_uk unique(name); /* 指定name不能反复*/
默认值 default
在创建表时,能够指定默认值如:
Create table stud(sex char(1) default ‘1’,…..);

使用关联对数据进行查询
当一个表的数据不能满足我们的须要时。我们就要从多个表中查询数据。

此时必须使用关联查询:
inner join – 内关联。两方必须都要存在。 
left join -左关联。

以左边数据为准。
right join - 右关联。在上面的表与表之间的关系用到的

总结:

存储过程

三种方式:

1。最简单。最主要的方式。

“DELIMITER$$”这句是为了让解析器把“$$”当作结束标志(否则默认是把“;“号当作结束标记),这样存储过程中的语句结束符";"就不会当作过程的结束标记。
DELIMITER$$
CREATE PROCEDURE p1()
BEGIN
SELECT * FROM stud;
INSERT INTO stud(id,sname,age,score,dept) VALUES(1014,'刘三丰',33,55,'通信学院');
END$$
DELIMITER; //把结束标记还原回来 CALL p1(); //调用存储过程p1

2。带參数的方式

//带參数的存储过程
DELIMITER$$
CREATE PROCEDURE p2(IN id INT, IN nm VARCHAR(30) )
BEGIN
INSERT INTO stud(id,sname) VALUES(id,nm);
END$$
DELIMITER ; DROP PROCEDURE p2;
CALL p2(1015,'吊丝');

3,带返回值的

//有返回值的存储过程----參数与变量问题( @变量名  。一个@为用户变量。两个@即 @@为全局的系统变量 )
DELIMITER$$
CREATE PROCEDURE p3(IN id INT, IN nm VARCHAR(30), OUT num INT )
BEGIN
INSERT INTO stud(id,sname) VALUES(id,nm);
SELECT COUNT(*) INTO num FROM stud;
END$$
DELIMITER ;
CALL p3(1016,'无名',@aa);
SELECT @aa; //输出变量aa的值

MySql差别大写和小写的查询

<span style="font-size: 18px; white-space: pre;">	</span>mysql查询默认是不区分大写和小写的 如:
<span style="white-space:pre"> </span>select  * from  table_name where  a like  'a%'   
<span style="white-space:pre"> </span>select  * from  table_name where  a like  'A%'   
<span style="white-space:pre"> </span>select * from table_name where a like 'a%'
<span style="white-space:pre"> </span>select * from table_name where a like 'A%'
<span style="white-space:pre"> </span>效果是一样的。
<span style="white-space:pre"> </span>要让mysql查询区分大写和小写。能够:
<span style="white-space:pre"> </span>select  * from  table_name where  binary  a like  'a%'  
<span style="white-space:pre"> </span>select  * from  table_name where  binary  a like  'A%'   
<span style="white-space:pre"> </span>select * from table_name where binary a like 'a%'
<span style="white-space:pre"> </span>select * from table_name where binary a like 'A%'
<span style="white-space:pre"> </span>也能够在建表时,加以标识 
<span style="white-space:pre"> </span>create table table_name(
    <span style="white-space:pre"> </span> a varchar(20) binary
<span style="white-space:pre"> </span>)<span style="font-size: 18px;">
</span>

事务transaction: 

原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能仅仅运行其中的一部分。 
一致性(consistency):在事务处理运行前后,数据库是一致的(数据库数据完整性约束)。 
隔离性(isolcation):一个事务处理对还有一个事务处理的影响。

 
持续性(durability):事务处理的效果能够被永久保存下来 。
一个事务仅仅会有一个结果:要么成功、要么失败。

Start transaction;開始一个事务。

Commit;提交所做的改动。
Rollback;回滚所做的改动。假设在操作时出错。应该从新開始一个事务。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

设置事物隔离级别
在mySql的命令行设置隔离级别。
在MySql的命令行设置隔离级别,仅仅对此打开的命令行窗体有效。第一个命令行窗体,就是一个独立的client。
Select @@tx_isolation; 能够查看眼下的隔离级别。

Set transaction isolation level <级别名称>能够设置隔离级别。
级别名称为:{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } 
须要注意的是,隔离级别必须要在事务其中使用,没有事务,隔离级别也没有意义了。

※事务处理
START TRANSACTION
DELETE FROM stud WHERE id=1015;
DELETE FROM stud WHERE id=1014;
SELECT * FROM stud; ROLLBACK / COMMIT;

MySQL之----在java编程加强知识点的更多相关文章

  1. Java编程学习知识点分享 入门必看

    Java编程学习知识点分享 入门必看 阿尔法颜色组成(alpha color component):颜色组成用来描述颜色的透明度或不透明度.阿尔法组成越高,颜色越不透明. API:应用编程接口.针对软 ...

  2. java 编程小知识点

    --------------------------------- 时间不多了,抓紧做自己喜欢的事情 1. 使用位运算 & 来判断一个数是否是奇数.偶数的速度很快 (a & 1 ) = ...

  3. 记录这段时间java编程的小知识点

    记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift  table 同时按,是整体左 ...

  4. 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  5. JAVA编程思想(第四版)学习笔记----4.8 switch(知识点已更新)

    switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) ...

  6. Java研发工程师知识点总结

    Java研发工程师知识点总结 最近一次更新2017年12月08日 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 ...

  7. (转)2019年给Java编程初学者的建议(附学习大纲)

    本文链接:https://blog.csdn.net/javajlb/article/details/85920904 1. 引言这是一篇初学者干货,请耐心看完,希望对你有帮助 作为初学者的你,命中了 ...

  8. 阿里巴巴Java编程规范考试

    阿里巴巴Java编程规范考试 今天在阿里云官网把阿里巴巴Java编程规范认证考试考过了, 写下这篇文章总结一下考试中需要注意的知识点, 主体内容还是要直接看规范: 编程规约 异常日志 单元测试 安全规 ...

  9. MySQL基础之事务编程学习笔记

    MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...

随机推荐

  1. httpurlconnection get String

    public static String getJSON(String url, int timeout) { HttpURLConnection c = null; try { long reque ...

  2. Android Activity组件的启动过程

    0.总图 1.总图中的第一步,Laucher主线程向ActivityManagerService进程发出START_ACTIVITY_TRANSACTION 如图:第一步 ~/Android/fram ...

  3. lvs 负载均衡环境搭建

    记录一下搭建lvs环境的步骤 当中master 10.0.0.11,backup 10.0.0.15.realserver1 10.0.0.119.realserver210.0.0.11 1.mkd ...

  4. 数组进行多少次OP操作,才干有序

    1 题目描写叙述: 有一个数组:2,1,4,3.对于数组,有一种操作op(idx):将该index相应的数字移到首位.比方: op(3):  2 1 43 -> 3 2 1 4 op(1):   ...

  5. xargs用例一个

    ls -a *.doc|awk -F. '{print $1}' |xargs -I {} java -jar ~/soft/jodconverter-2.2.2/lib/jodconverter-c ...

  6. Oracle多表连接效率,性能优化

    Oracle多表连接,提高效率,性能优化 (转) 执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只 ...

  7. Redis学习笔记(八) 基本命令:SortedSet操作

    原文链接:http://doc.redisfans.com/sorted_set/index.html SortedSet的数据结构类似于Set,不同的是Sorted中的每个成员都分配了一个值(Sco ...

  8. vue中使用UEditor编辑器 -- 2

    1:下载ueditor下来,放在vue项目中的static文件夹下   2:创建ueditor编辑界面 3:椰~~~~~此时已经可以使用了 但是你会发现   (黑人脸)what the fuck??? ...

  9. uva 11300 Spreading the Wealth_数学推倒 + 思维

    这道题和负载平衡问题是同一道题, 如果 n<=100n <= 100n<=100 的话是可以用最小费用流来求解的. 但是题中 nnn 最大可达到 10610^6106, 这就需要我们 ...

  10. node——模块分类,require执行顺序,require注意事项,原理

    node.js模块 在node.js开发中一个文件就可以认为是一个模块. 一.node.js模块分类 核心模块Code Module.内置模块.原生模块 fs http path url ... 所有 ...