mysql 基础4

来源:互联网 发布:淘宝快递面单打印 编辑:程序博客网 时间:2024/05/19 01:30
 

1 Mysql命令的分类
  a) DQL
      query
  b) DDL
      create drop truncate alter(修改)
  c) DML
      insert delete update
  d) TCL  
      set autocommit = 0 (msyql) commit rollback 

  
--------------------------------------------
    create database if not exists 名字
 create table table_name(
   column_name int primary key,
   column_name int not null,
   column_name int unique,
   constraint xxx check(age>=0 and age<=150),
   constraint xxx foreign key column_name references table_name(column_name)
 );

 2大类
   1)  primary key not null unique
          id
  
      2)  check  foreign key 
  
   foreign key 
   前提 多张表
  
   emp 子表
     empno ename  deptno (外键列)
       1    suns   10
    2    liyi   20
    3    lyc    30
               
   dept 父表 
     deptno dname
    10    trainng
    20    dev
    30    game 
  
    
   2 约束 可以为一列加入多个 
   3 通过一个查询创建一张表
     create table table_name
  as select * from a_table_name;

-----------------------------------------
        drop database
     drop table suns ;
        drop table if exists suns ;  
  
     truncate 截取
  truncate table t_nn;
  清空表中数据 ,表中数据所占空间(硬盘)存在
  
-----------------------------------------
   alter table 表名 (修改) 
   前提 table 已经被创建了
   
   create table t_a(
     id int primary key,
  name varchar(12),
  password varchar(12) --- passwd
   ); 
  
   1 增加一列
     alter table t_a add sex varchar(12);
   2 删除一列
     alter table t_a drop sex;
   3 修改列的名字          原始名字  现名
     alter table t_a change password passwd varchar(12);
   4 修改列的类型
     alter table t_a change name name int;
  
--------------------------------------------------
DML
  前提:存在表

  insert
     insert into table_name (column_name,column_name,...)
  values (value1,value2,...);
 
     create table t_insert(
    id int primary key,
    name varchar(12),
    password varchar(12),
    birthday date
  );
 
  标准
  insert into t_insert (id,name,password,birthday)
  values(1,'suns','12345',str_to_date('2011-10-01','%Y-%m-%d'));
 
  insert into t_insert (id,name,password,birthday)
  values(2,'suns','12345','2011-10-01');
 
  特殊情况
    1 如果 你所插入数据 针对于全表所有的列
      insert into t_insert values (3,'suns2','12345','2000-10-11');
    2 Mysql 主键自动增长的机制
         auto_increment

         drop table if exists t_insert;  
         create table t_insert(
        id int auto_increment primary key,
        name varchar(12),
        password varchar(12),
        birthday date
      );  
       
  insert into t_insert(name,password,birthday)
  values ('suns','1234','2000-10-11');
  
  
 update  修改表中数据
 a) 全表更新
    update t_name set column_name='xxx',column_name='xxx',column_name='xxx'; 

 b) 特定更新
 update t_insert
 set name='suns4',password='4444',birthday='2004-04-04'
 where id in (3,4)
 
 
 delete 删除表的内容
 delete from t_name ;

 delete from t_insert;
 
 truncation  删除表的内容 空间留着
 delete      删除表的内容 空间删除
 
 delete from t_insert where id = 8;
 delete from t_insert where name='suns' and password='123456';
 delete from t_insert where name like '%a%';
--------------------------------------------------
1 范式 
     指导用户数据库建表的一种规范      
  1) 第一范式 : 概念 用户在创建表时 表中所存储的数据 具有原子性
 
     t_user 
       id   name  password 
        1    suns  123456  
        2    liyi  888888 

     t_user_favorite 
       user_id  favorite 
         1        java
   1         c++
         1        javascript
      2         java
   2         c
      2         javascript 
  统计 suns 爱好
       liyi
 
  
  

      统计suns用户多少种爱好
          liyi增加爱好   
 
  2) 第二范式: 用户所创建的表
               中存储的数据不能
      部分依赖
 
     t_student_course 
    pk (student_id,course_id)
    student_id ---> student_name
    coures_id --->  course_name
   
    部分依赖 :表中非主键列的数据
               依赖部分主键内容
   
  student_id  course_id  student_name course_name  score
     001         001      suns           corejava   10  
     002         001      liyi           corejava   10
        001         002      suns           mysql       5
  002         002      liyi           mysql       5      
      
      为什么? 
       t_s_c 
         student_id  cource_id score    
        
   001        002      5
   002        002      5

    t_s
        student_id student_name  
            001      suns
   002      liyi

       t_c
        course_id  course_name 
          
            002       mysql     
 
  3) 第三范式
       在建表中 一个列的值 不能出现 传导(递)性依赖

      emp
    empno ename sal     deptno 
         1    suns  1000    001    
   2    liyi  2000    002    
         3    zzq   2000    001    
         4    czh  2000     002   
 
      dept
         dpetno dname
          001    training
          002    dev   
  
  
  不好

 

      总结
     1  列中存储的数据 原子数据
        2  列中存储的数据 不能部分依赖
        3  列中存储的数据 不能传递性依赖

        注意: 1  往往 性能  放弃范式
         2  范式会导致执行效率变差
     
2 ER图 ---->  power designer 
  创建表提供思路
  1 单表
  2 多表 
     建立多表时 以表中所
  存储的数据关系来建立表
    
    1 : *
 dept   :  emp 
   1        *
  
  
  
  
 emp   * 外键(1主键)
     empno ename    sal  deptno 
   001   suns    100   001
   002   xiaohei 200   002
  
   drop table if exists emp;

   dept  1  
  deptno dname     loc
   001   training   bj
   002   dev        sh
  
  
  
 computer
     cid  computer_name  型号 价格    sid
   1     lenove       y470  6000    1
      2     dell         p555  5000    1
      3     tinkpad      x201  7000    2
 shop
     sid  name  boss  
   1   黑心  suns
   2   没肺  liyi
  
 
 1 :1
 Person  Passport
 
 t_person 
    person_id  name birthday  p_id (unique)
     1         suns 1900       1
  2         liyi 1800       2
  
 t_passport
       passport_id  expiry  national   
      1             10    china
   2             10    china 
 
 * :*
 Student   Course 

    t_student
   student_id  name  age   
    1          suns  30     
    2          liyi  32      
   
    t_s_c
    s_id  c_id
     1     1
  1     2
  2     1
        2     2    
   
   
 t_course
      course_id  name      score 
    1           corejava   10   
    2           spring     12    

   
 
   1     : *
 preson    jiguan
      1   :   *  
 User      Order 
 
---------------------------------------------
锁   多用户访问的情况下
     把数据 锁住
  1) 表锁
     set autocommit = 0;
     select * from t_account for update;
 
     commit 解锁

     2)行锁 
   set autocommit = 0;
      update t_account set balance = 200 where accountname = 'suns';
   insert
   delete
  
   commit 解锁
  
  锁超时 
 
----------------------------------------
  事务
  commit  数据提交的数据库中 
  rollback 从上一次commit开始 所执行
            insert delete update
   回滚
 
   从上一次commit开始
  
     
   到本次rollback commit 位置