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

表和表之间的关系有 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;

最新文章

  1. kettle参数、变量详细讲解[转]
  2. Linux之我见
  3. 【python】python新手必碰到的问题---encode与decode,中文乱码[转]
  4. 【SQL Sever】SQL Sever数据库重命名
  5. java练习题(字符串类):显示4位验证码、输出年月日、从XML中抓取信息
  6. Codeforces Round #385 (Div. 2) A. Hongcow Learns the Cyclic Shift 水题
  7. Implement Stack using Queues
  8. php使用redis存储
  9. NE、EQ等比较操作符的意义
  10. 【转】loadrunner场景对性能测试策略的映射
  11. PXC的原理
  12. python 运行 hadoop 2.0 mapreduce 程序
  13. JS中区分参数方法
  14. js中时间戳与日期转换-js日期操作
  15. asp.net传值
  16. hdu5338 ZZX and Permutations
  17. Sublime自定义语法
  18. Crane (POJ 2991)
  19. SQL Server 一致性读
  20. 实现手写数字识别(数据集50000张图片)比较3种算法神经网络、灰度平均值、SVM各自的准确率—Jason niu

热门文章

  1. HTML5开发移动web应用——Sencha Touch篇(8)
  2. 利用机器学习进行DNS隐蔽通道检测——数据收集,利用iodine进行DNS隐蔽通道样本收集
  3. BZOJ 4321 DP
  4. 继承TabActivity后不执行onBackPressed()里的方法
  5. Kafka.net使用编程入门
  6. Chosen:Select 选择框的华丽变身
  7. Java基础——环境变量(PATH)和类变量(CLASSPATH)
  8. 什么时候使用try-catch
  9. &lt;Android Framework 之路&gt;Android5.1 Camera Framework(一)
  10. 安卓input框获取焦点时,底部按钮会顶上去的解决方法