数据库 MySQL

一;Mysql 
    1,DDL(数据定义语言)
           creat/drop 表  
           alter table 表名 +rename/change/modify/add/drop


    2,DML(数据库操纵语言)  
            insert into 表名 values
            update 表名 set 
            delete from 表名
            select * from 表名


    3,DQL( 数据库查询语言) 
            select distinct 列名 from 表名
            select * from 表名 where name like '_ or %'
            select * from 表名 order by 列名1,列名2 desc;
            select count/sum /max/min/avg  from table
    
       分组查询
     select ...from ...( where ...)/(group by... having  ... )+ order by 
      
       5,DCL(数据库控制语言)


二,
1,数据库的备份和恢复


备份与备份的都是数据库中的每一个表,如果该数据不存在需要先建立数据库


备份:在登录之前,该语句后不需要分号


 mysqldump -u用户名 -p密码 数据库名>目标文件(绝对路径,文件后缀名为.sql)


恢复:在登录之前,该语句不需要分号


 mysqldump -u用户名 -p密码 数据库<目标文件


      登录之后的恢复语句:


 source 备份文件路径


一次性备份和恢复所有数据库,无需登录


 备份:mysqldump -uroot -p --all-databases>sqlfile.sql   (无分号)


恢复:source 文件路径; (有分号)


2,主键约束


主键约束的列特点:a 非空:列中的值不能为null
                  b 唯一:这一列中的值不能重复
                  c 被引用:可以通过主键的方式,引用改行的数据(主键代表这一行)    
添加主键的两种方式:


  create table 表名(列名1 列类型1 primary key ,列名2 列类型2 );


  create table 表名(列名1 列类型1 ,列名2 列类型2,primary key(列名1));


删除主键:


      alter table 表名 drop primary key ;


创表后,为某一列设置主键约束


       alter table 表名 add primary key (列名)


注:主键在一张表中最多存在一个,但是可以将多个列一起设为主键,所以说主键并不一定就
    表示一列。


设置多个列为主键


       alter table 表名 add primary key (列名 1,列名2 ,列名3);
 
  但是如果已经设置过主键,再设置主键的话就会报错提示主键重复定义


如果建表的时候主键没有设置自增长,在建表后,想要将主键设置为自增长:


       alter table 表名 modify column 列名 int(11) not null auto_increment


2,主键自增长约束    auto_increment


注:关键字auto_increment不能单独使用,必须与主键一同使用


若不指定主键的值,自增长会生效


若删去了id为3的这一行数据,再添加数据时,id会从4开始,不会再使用3


若id已经使用到4了,这时候添加一个数据,指定id为7,再次添加数据id为null时,id会从8开始使用


3,非空约束   not null


  create table 表名 (id int primary key auto_increment, name char(50) not null);


4,唯一约束 union


   create table 表名(id int primary key,name char(50)unique);


注:即使设置某一列为非空,唯一,也不能在其他表中将该表作为外键引用


二,外键约束


1,多对一或一对多关系 (多的为从表,一的为主表)


   当表1与表2有关联时,如果表1是从表,表2是主表,可以通过外键约束,在表1中引用表2的主键


    当表1引用表2的主键时,表1该列下的数据必须是表2主键列中已存在的数据


注:表1引用表2添加约束时的列名与表2的主键列名不是一定要一致


指定外键的两种方式:


  如果表1想指定表2的主键为外键,需先存在表2


  create table 表2(表2id int primary key auto_increment,表2 name varchar(50));


方式一:在创表时指定外键


    fk_表2id是约束的名字,fk表示:foreign key 也是外键


  create table 表名(id int primary key auto_increment,name varchar(50),dd int,
constraint fk_表2id foreign key(dd) references 表2(表2id));




方式二:在创建表以后,通过修改ddl语句来添加外键约束


    alter table 表名 add constraint fk_表2id foreign key(dd) references 表2(表2id);


2,一对一关系
 
 给表1的主键,加上表2的约束。这样表1的主键(一般为id)与表2的主键(一般为id)就会被约束,结果就是表1中有的id在表2中一定有,表2中没有的id,是不能添加进表1中的


3,多对多关系


   多对多关系需要使用到中间表,有几张表,就要在中间表建立几个外键


三,多表查询


1,合并结果集


   结果集,就是通过select....from...查询出来的数据,查出来的数据实际也是一张表,
所以结果集就是一张表。


   两个select语句中间可以通过关键字:union连接即可


   select a,b from 表1 union  (all:如果在这里加上all就不会去重) select c,d from
表2;


2,连接查询


   在多表查询的时候,都会去掉笛卡尔积。去除方法就是在多表查询时加上一个条件:
   从表.外键列=主表.主键列


1)内连接:


mysql的方言:select * from 表名1 别名1 , 表名2 别名2 where 别名1.xx=别名2.yy;


         如果表1为从表,则xx为外键约束的列名,yy为主键列名


mysql标准写法:select * from 表1名 别名1 inner join 表2名 别名2 om 别名1.xx=别名2.yy
 
自然连接:自然连接会自动找到两表中列名相同的比较(也就是说外键列名一定要与主键列名一样了),一般很少用 ,可读性比较低。


   select * from 表名1 别名1 natural join  表名2 别名2;


  
注:内连接不会取出不符合条件的数据,比如表1中某一行外键约束下的内容为null的话,则该行不会满足条件,内连接就不会取出它,如果想取出,请使用外链接。


2)外连接:分为左外和右外


左外,就是不管左面表的数据是否满足条件(就是on后面的条件),都查出来
右外,同理


左外:select * from 表名1 别名1 left outer join  表名2 别名2 on 别名1.xx=别名2.yy


右外:select * from 表名1 别名1 right outer join 表名2 别名2 om 别名1.xx=别名2.yy


如果左右都想要,可以将上面的两个语句用union连接,合并结果集的方式实现


3)子查询


在一条SQL语句中有多个select的就是子查询,子查询的本质就是,先查询出一个表(结果集),再在这张表上进行后续的查询操作


标准中的写法有两种:


写在from后面(当成目标表来查询)


写在where后面(当成判断条件来查询)


如果查询出来的是单行单列的结果集,那么可以直接把该结果集作为判断条件。如id=1会确定一行数据,age确定一列,所以查出来的是单行单列的数据,可以用这种方式作为where后面的判断条件


select * from 表名1 where 列名1>(select age from 表名1 where id =1);


如果查询出来的结果是多行多列的结果集,那么就可以将该结果集当成目标表来查询


select * from (select name ,age from 表名2);


如果查询的是多行多列的结果集,那么可以将该结果集看成集合,
这时候需要用到关键字all:表示大于集合中所有的数据
select * from 表名1 where age >=all(select age from 表名1);




in表示在集合存在即可


如果查询出来的结果是单行多列的结果集,那么可以将该结果集看成一个对象(仅仅是看成


,可以看成一个对象的多个属性)。如:子查询可以查询名字为张三这一行的列1,列2的数
据,然后查询表名1中所有列1列2数据与张三的结果集相同的数据


  select * from 表名1 where (列1,列2) in (select 列1,列2 from 表名1 where name


='zhangSan');












     
        



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值