• 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 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;回滚所做的改动。假设在操作时出错。应该从新開始一个事务。




    设置事物隔离级别
    在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;
    

  • 相关阅读:
    GC
    java基石-JVM
    golang 结构体指针及赋值
    golang 记一次map中struct的管道造成死锁的解决方式
    golang 封装"执行shell管理redis(string,集合等)"成api
    golang panic及处理
    Python简直无所不能!在电脑上如何调用手机摄像头?教你轻松搞定!
    2021最新版Python爬取抖音小姐姐短视频,无水印,超级详细!(附视频/源码)
    自从学会Python爬虫后,爬视频我只爬小姐姐!教你批量下载某短视频网站视频!
    突然不知道听什么歌了,但是排行榜的准没错,于是用Python全部都爬下来了!
  • 原文地址:https://www.cnblogs.com/llguanli/p/8438382.html
Copyright © 2020-2023  润新知