MySQL之----在java编程加强知识点

在数据中,建表处理是很常见且很实用的方法。

表和表之间的关系有 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 null关键字。

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;回滚所做的修改。如果在操作时出错,应该从新开始一个事务。

设置事物隔离级别

在mySql的命令行设置隔离级别。

在MySql的命令行设置隔离级别,只对此打开的命令行窗口有效。第一个命令行窗口,就是一个独立的客户端。

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;

时间: 2024-08-03 00:28:34

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

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

阿尔法颜色组成(alpha color component):颜色组成用来描述颜色的透明度或不透明度.阿尔法组成越高,颜色越不透明. API:应用编程接口.针对软件包或"工具箱"的接口说明.API包含了工具箱中所有类或子程序及其使用说明. Applet:与可以单独运行的应用程序不同,Applet是一种在Web浏览器中运行在Web页面上的Java程序. 动画(animation):由一组静态图片快速显示展示出动态效果.每一幅静态图片叫做帧.在Java中,动画通常由 Timer 对象驱动.

Java编程中容易疏忽的知识点

(1)Frame与窗口事件 1.Window.Frame.Dialog和FileDialog都属于有边框容器,他们的父类为Window,但是Window本身属于无边框的,算是有边框容器的一个例外. 2.Frame可以作为一个Application的最外层容器,也可以被其他容器创建并弹出成为独立的容器,但是无论哪种情况,Frame都作为最顶层容器的存在,不能被其他容器所包含. 3.新创建的Frame是不可见的.需要使用setVisible(true)方法使其可见. 4.每个Frame在其右上角都有

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

switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) { case integral-value1: statement; break; case integral-value12: statement; break; default: statement; } 其中integral-selector(整数选择因子)是一个能产生整数值的表达式.并且说

Java研发工程师知识点总结

Java研发工程师知识点总结 最近一次更新2017年12月08日 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 四.Java虚拟机 五.数据库(Sql.MySQL.Redis等) 六.算法与数据结构 七.计算机网络 八.操作系统(OS基础.Linux等) 九.其他 一.Java基础(语言.集合框架.OOP.设计模式等) 1. HashMap和Hashtable的区别 Hashtable是基于陈旧的Dicti

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

Java编程思想总结笔记Chapter 2

本章介绍Java程序的基本组成部分,体会到Java中几乎一切都是对象. 第二章   一切都是对象 目录: 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.3 永远不需要销毁对象 2.4 创建新的数据类型:类 2.5 方法.参数和返回值 2.6 构建一个Java程序 2.7 你的第一个Java程序 2.8 注释和嵌入式文档 2.9 编码风格 2.1 用引用操纵对象 一切都看作对象,操纵的标识符实际上是对象的一个"引用",遥控器(引用)操纵电视机(对象),想调控电视,只需通过遥控

Java编程思想(三) —— 访问权限的控制

之前没去注意的修饰符,一般变量前面没添加,一个是不知道有什么用,一个是懒,后面遇到项目的时候就会发现私有和公有区别还是很大的. (1)首先是包名 使用一个类的时候,例如集合类,就需要引入这个包,然后再使用该包下面的类.如: package com.myown.iaiti; public class Print { static void print(String s){ System.out.println(s); } } 自定义的包,通过引入自己的包,以后你就可以使用自己写的方法进行字符串的打

java编程思想第1、2、3章细节总结

转眼已经大二学期的暑假,已经使用java有一年了,才开始看thinking in java 这本经典书籍,算是做个系统总结吧,只列一些目前还掌握不熟的需要谨记的知识点. 第一章:对象导论 1.java中的权限:public,protected,private,default. public:可以被任何对象访问. protected:只能在本类和本类的内部类中使用,通过继承操作可以继承下去. private:只能在本类和本类的内部类中使用. default:如果没有加任何权限,则默认就是这个def

五本书籍助你从零基础学习java编程到精通之路

前天的文章给大家介绍了Java初学者应该学习哪些基础,亦是美网络小编从Java的三个大方向:J2SE.J2EE.J2ME对大家做了前景分析,这两天也收到了大家的很多反馈,很多小伙伴看了后对自己的Java编程方向有了比较明确的目标,也有小伙伴们说,要是能提供一些Java初学者应看的书籍就更好了,其实推荐Java书籍已经被规划在小编写的Java编程系列文章之中,常言道:书中自有黄金屋,书中自有颜如玉,下面亦是美网络小编给大家推荐的Java书籍中虽然没有黄金屋和颜如玉,但却能让Java编程的初学者快速