Java基础--MySQL数据库下

1.数据约束

a.默认值约束

默认值(default)

 CREATE TABLE test(

     NAME VARCHAR(20),

     gender VARCHAR(2) DEFAULT '男'

    )

注:当前没有插入默认值字段的时候,默认值才会起作用

b.非空约束

非空(not null)

  CREATE TABLE test(

      NAME VARCHAR(20) NOT NULL,

      gender VARCHAR(2)

     )

 注:不能不插入值,不能插入null

c.唯一约束

唯一(unique)

CREATE TABLE test(

     idINT UNIQUE,

     NAMEVARCHAR(20)

)

注:不能插入重复的值,唯一约束不能约束null(可以插入多个null)

d.主键约束

唯一+非空(primary key)

CREATE TABLE test(

     idINT PRIMARY KEY,

     NAMEVARCHAR(20)

)

e.自增长约束

CREATE TABLE test(

     idINT PRIMARY KEY AUTO_INCREMENT,

     NAMEVARCHAR(20)

   )

  注:初始值为0,每次递增1

f.外键约束

外键作用:约束两种表的数据

-- 部门表

CREATE TABLE dept(

     idINT PRIMARY KEY AUTO_INCREMENT,

     NAMEVARCHAR(20)

 )

-- 雇员表

CREATE TABLE employee(

     idINT PRIMARY KEY AUTO_INCREMENT,

     NAMEVARCHAR(20),

     deptIdINT,

     CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCESdept(id)

     --                       外键名称                                         外键字段  参考         

 )

注:有了外键约束之后,当往副表中插入,修改主表不存在的数据时外键就会起作用,当删除与副表  有关的主表数据时,外键起作用。当插入和修改数据时,应先向主表中添加;当删除数据时应该先删除    副表中的数据。

2.级联

介绍:当有了外键的时候,我们希望修改或删除数据的时候,修改或删除了主表的数据,同时能够影响 副表的数据,这时就可以使用级联。

CREATE TABLE employee(

     idINT PRIMARY KEY AUTO_INCREMENT,

     NAMEVARCHAR(20),

     deptIdINT,

     --添加级联修改: ON UPDATE CASCADE

     --添加级联删除: ON DELETE CASCADE

     CONSTRAINTemployee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE       CASCADE ON DELETE CASCADE

     --                             外键名称                     外键字段  参考         

      )

3.数据库设计的三大范式

第一范式:要求表的每个字段必须独立的不可分割的单元。

第二范式:在第一范式的基础上,要求表的除主键以外的字段都和主键有依赖关系的。

第三范式:在第二范式基础上,要求表的除主键外的字段都只能和主键有直接决定的依赖关系。

4.多表查询

a.交叉连接查询(笛卡尔乘积: 4*3=12,产生笛卡尔积的原因是没有足够的连接条件)

 SELECT employee.name,dept.name FROMemployee,dept;

b.内连接查询

  效果:只有满足连接条件的数据才会显示出来

  SELECT e.name,d.name

     FROMemployee e,dept d

     WHEREe.deptId=d.id;

 -- 另一种表达

  SELECT e.name,d.name

     FROMemployee e

     INNERJOIN dept d

     ON e.deptId=d.id;

c.左外连接查询

  介绍: 右表(部门表)的数据全部显示,左表(员工)的数据当满足连接条件的时候,就显示满足        条件的数据,但是如果不满足连接条件,则显示null

  SELECT d.name,e.name

     FROMdept d

     LEFTOUTER JOIN employee e

     ON d.id=e.deptId;

d.自连接查询

    SELECT e.name AS '员工',b.name AS '上司'

     FROMemployee e

     LEFTOUTER JOIN employee b

        ON e.bossId=b.id;

  --  查询员工姓名及其上司姓名(没有上司的员工也显示

4.MySQL存储过程

a.特点:

   ①.存储过程保存到数据库服务器端,通过数据库客户端工具调用存储过程

 ②.存储过程的效率会非常高,因为存储过程是在数据库服务器端执行。

    ③.存储过程的移植性非常差的

b.存储过程语法

  创建存储过程

  -- 定义结束符号

  DELIMITER 结束符号

  CREATE PROCEDURE 存储过程名称 (形式参数列表)

  BEGIN

       多个sql语句

  END 结束符号

  -- 调用存储过程

  CALL 存储过程名称(实际参数列表);

参数类型:

 IN: 输入参数,可以携带数据到存储过程中

 OUT: 输出参数,可以携带数据到存储过程外面。

    INOUT: 输入输出参数。

c.几种常见存储过程

 ①. 带有输入参数的存储过程

    --  传入员工id查询对应的员工

    DELIMITER $

    CREATE PROCEDURE pro_testByIn(IN eidINT)  -- 参数类型(IN) 参数名称 数据类型(int)

    BEGIN

          SELECT* FROM employee WHERE id=eid;

    END $

    -- 调用

    CALL pro_testByIn(2);



②.带有输出参数的存储过程

    DELIMITER $

    CREATE PROCEDURE pro_testByOut(OUT nVARCHAR(20))

    BEGIN

        --修改变量n

        SETn = '输出参数';

    END $

③.带有输入输出参数的存储过程

   DELIMITER $

   CREATE PROCEDURE pro_testByInOut(INOUT nVARCHAR(20))

   BEGIN

        --查看n变量

         SELECTn;

        --修改n变量

        SETn = '500';

   END $

   -- 定义会话变量调用存储过程

   SET @n='100';

   CALL pro_testByInOut(@n);

   -- 查看n

       SELECT @n;

④.带有判断条件的存储过程

    -- 输入一个num整数,num=1 ,输出‘星期一’,num=2,输出‘星期二’,num=3,输出‘星期   

    -- 三’,否则,输出‘错误参数’

   DELIMITER $

   CREATE PROCEDURE pro_testByIf(IN numINT,OUT str VARCHAR(20))

   BEGIN

          IFnum=1 THEN

                 SETstr = '星期一';

          ELSEIFnum= 2 THEN

                 SETstr ='星期二';

          ELSEIFnum=3 THEN

                 SETstr = '星期三';

          ELSE

                 SETstr = '错误参数';

        ENDIF;

  END $

  CALL pro_testByIf(5,@str);

  SELECT @str;

⑤.带有循环条件的存储过程

   --  输入一个num,计算从1到num的总和。

  DELIMITER $

  CREATE PROCEDURE pro_testByWhile(IN numINT,OUT score INT)

  BEGIN

          -- 定义局部变量

         DECLARE i INT DEFAULT 1;

         DECLAREresult INT DEFAULT 0;

         WHILEi<=num DO

                  SETresult = result + i;

                  SETi = i+1;

         ENDWHILE;

         SETscore = result;

 END $

 CALL pro_testByWhile(200,@score);

    SELECT @score;

⑥.携带数据库的数据给输出参数(INTO)

  -- 需求: 传入员工id,查询对应的员工,输出员工姓名

 DELIMITER $

 CREATE PROCEDURE pro_testByData(IN eidINT,OUT sname VARCHAR(20))

 BEGIN

          SELECTNAME INTO sname FROM employee WHERE id=eid;

 END $



 CALL pro_testByData(2,@sname);

    SELECT @sname;

d.mysql数据库三种变量:

     ①.全局变量。mysql内置的变量,mysql程序关闭的时候全局变量才会失效。

                      show variables:查看全局变量

                      character_set_client: mysql接收的客户端的数据编码

                      character_set_results: mysql使用什么编码输出给客户端数据

                    查看某个全局变量:select @@变量名

                    修改某个全局变量:set @@变量名=值

     ②.会话变量。变量只在某次登录的会话中有效!退出连接,会话变量数据失效。  

                    查看某个会话变量: select @变量名

                    修改/定义某个会话变量: set @变量名=值

     ③. 局部变量:在存储过程中定义的变量。存储过程结束局部变量失效。

                     查看某个局部变量: select 变量名

                      修改某个局部变量: set 变量名=值

5.触发器

定义:当往员工表插入/修改/删除一条数据的时候,同时往日志表记录下来,这时就要使用触发器完       成。

触发器语法



    -- 当往员工表插入一条数据时,往员工日志插入一条记录。

    -- 员工日志表

    CREATE TABLE emp_log(

             idINT PRIMARY KEY AUTO_INCREMENT,

    contentVARCHAR(20)

    )



    -- 创建增加触发器

    CREATE TRIGGER tri_empAdd AFTER INSERT ONemployee FOR EACH ROW

             INSERTINTO emp_log(content) VALUES('员工被插入了一条记录');

    -- 创建修改触发器

    CREATE TRIGGER tri_empUpd AFTER UPDATE ONemployee FOR EACH ROW

             INSERTINTO emp_log(content) VALUES('员工被修改了一条记录');

    -- 创建删除触发器

    CREATE TRIGGER tri_empDel AFTER DELETE ONemployee FOR EACH ROW

             INSERTINTO emp_log(content) VALUES('员工被删除了一条记录'); 

    DROP TRIGGER tri_empAdd;

    SELECT * FROM employee;

    SELECT * FROM emp_log; 

    INSERT INTO employee(NAME,deptId,bossId)VALUES('李四',5,1);

    UPDATE employee SET NAME='张三' WHERE id=10;

        DELETE FROM employee WHERE id=10;

6.mysql权限问题

     root用户: 超级管理员。    权限:增删改查(数据库,表,数据)

     给mysql数据库分配不同权限的不同用户

    mysql数据库:存放mysql配置信息,包括用户信息

    USE mysql;

    -- 用户表

    SELECT * FROM USER;

    -- 加密函数(md5算法--单向加密)

    SELECT PASSWORD('root');

    -- 修改用户密码

    UPDATE USER SET PASSWORD=PASSWORD('123456')WHERE USER='root';

    -- 分配权限给不同的用户

    -- 分配查询day15数据库的employee表的权限给eric用户,密码为‘123456’

    GRANT SELECT ON day15.employee TO'eric'@'localhost' IDENTIFIED BY '123456';

    GRANT DELETE ON day15.employee TO'eric'@'localhost' IDENTIFIED BY '123456';

    SHOW TABLES;
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值