Mysql高级查询,约束,索引

1、高级查询

              (1)总结

                        3、select ... 聚合函数   from  表名

                        1、where ...

                        2、group  by ... 

                        4、having ...

                        5、order  by ...

                        6、limit ...; 



            (2)order   by:给查询结果排序

                     order  by  字段名  ASC(升序,是默认的)/DESC(降序)

                     

            (3)limit (永远放在SQL命令的最后写)

                       显示查询记录的条数

                       用法:

                            limit n;  --->显示 n  条记录

                            limit    m,n;  ----->从第m + 1条记录开始显示n条记录

                            limit   2,3; 显示第3,4,5三条记录

           (4)分页

                     每页显示5条记录,显示第4页的内容

                      第1页:limit  (1-1)*5,5   # 1  2  3  4  5

                      第2页:limit  (2-1)*5,5    #6   7   8  9  10

                      第3页:limit  (3-1)*5,5    #11  12  13  14  15

                      ...

                      第m页:limit  (m-1)*n,n  

         (5)聚合函数

                分类

             avg(字段名)  :   求该字段的平均值

             sum(字段名)  :   求和

             max(字段名)  :   求最大值

             min(字段名)  :    求最小值

             count(字段名)  :   统计该段记录的个数  



        (6)group  by:给查询的结果进行分组

              计算每个国家的平均攻击力:

                select country,avg(gongji) from sanguo group by country;

                   先分组      再聚合        再去重

         注意: 

               select 之后的字段名如果没有在group  by  之后出现,则必须要对该字段进行聚合(聚合函数)                 


          (7)、having语句

                   作用:对查询结果进行进一步的帅选

                   练习:找出平均攻击力大于105的国家的前2名,显示国家名和平均攻击力

                         mysql> select country,avg(gongji) from sanguo group by country

                         -> having avg(gongji)>105

                         -> order by avg(gongji) DESC

                         -> limit 2;


              注意:

                     1、having语句通常和group  by  语句联合使用,过滤由group  by 语句返回的记录集

                     2、where只能操作表中实际存在字段,having语句可操作由聚合函数生成的显示列
                
         (8)distinct:不显示字段的重复值

                  语法:select distinct  字段1,字段2   from 表名

                  select count(distinct country) as n from sanguo;

                  注意:distinct和from之间的所有字段值都相同才会去重

         (9)查询表记录时可以做数学运算

                运算符:+    -     *    /     % 

                示例: select id,name,gongji*2 from sanguo;

       2、约束:
              (1)、作用:保证数据的一致性、有效性 

              (2)、约束分类:

                  ①默认约束(default)

                    插入记录时,不给该字段赋值,则使用默认值

                    sex   enum("M","F","S") default  "S"

                  ②非空约束(not  null)

                    不允许该字段的值为NULL

                    id  int  not  NULL

                    id  int  not  NULL default 0 
      3、索引:
             对数据库中的一列或多列的值进行排序的一种结构(BTree)

         (1)普通索引(index)

                        使用规则: 

                                      ① 可设置多个字段,字段值无约束

                                      ②把经常用来查询的字段设置为索引字段

                                      ③KEY标志:MUL

                        普通索引的创建:

                                     ①创建表时创建

                                        create table t1(

                                          ...,

                                          ...,

                                         index(name),

                                         index(id);

                                     ②已有表中创建:

                                               create index 索引名 on 表名(字段名);

                        查看索引:

                                   ①desc  表名;

                                   ②show  index from 表名\G;

                        删除普通索引:

                                 drop  index   索引名  on  表名;      

                          

              (2)唯一索引(unique)

                         ①使用规则:

                                     可以设置多个字段

                                     约束:字段值允许重复,但可以为NULL

                                     KEY标志:UNI

                       ②创建:

                                    创建表时创建

                                              unique(phnumber),

                                              unique(cardnumber)

                                     已有表创建:

                                            create unique  index  索引名  on  表名

                       ③查看、删除同普通索引

              (3)主键索引(primary key)

                        ① 使用规则:

                               一个表中只能有一个字段为主键字段

                            约束:

                               字段值不允许重复,也不能为NULL

                                KEY标志:PRI

                                通常设置记录编号字段为id,能够唯一锁定一条记录

                        ② 创建:

                              创建表时:

                                   方法1: id int  primary  key auto_increment,

                                                name varchar(20) not null

                                                )auto_increment=10000,charset=utf8,engine=InnoDB;

                                **InnoDB,MyISAM 
                                 两种类型有什么区别:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。 
                                                    MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而                                                        InnoDB提供事务支持,外键等高级数据库功能。

                                                    MyISAM类型的二进制数据文件可以在不同操作系统中迁移。也就是可以直接从Windows系统拷贝                                                        到linux系统中使用。  

                                             alter table 表名 auto_increment=10000;

                                                                 

                                  方法2 :id int auto_increment,

                                             name varchar(20),

                                             primary  key(id,name) #复合主键

                              已有表:

                                    alter table 表名 add primary_key(id);

                       ③删除主键

                                   先删除自增长属性(modify)

                                   alter table 表名  modify  id  int 

                                   删除主键:

                                     alter  table  表名  drop  primary key;       


              (4)外键(foreign key)                    

          定义:让当前表的字段值在另一张表的范围内去选择
         语法格式:
           foreign key(参考字段名)
           references  主表(被参考字段名)
           on   delete   级联动作 
           on  update   级联动作;

         使用规则:

          1)主表、从表字段数据类型要一致

           2)主表:被参考字段是主键

     删除外键:
      alter  table   表名  drop   foreign  key 外键名;
      外键名查看:show create  table  表名 

   已有表添加外键:

        alter table  表名  add

        foreign key(stu_id) references  jftab(id)

       on  delete  级联动作

       on  update  级联动作;

 级联动作:

        1、cascade  : 数据级联删除,级联更新(参考字段)
        2、restrict(默认)
         从表中有相关记录,不允许主表操作
       3、set  null
          主表删除、更新,从表相关联记录字段值为NULL

2、嵌套查询(子查询)

   1、定义:把内层的查询结果作为外层的查询条件

   2、语法:

                 select  ...  from  表名  where  字段名  运算符(select ... form 表名 where 条件);

   3、练习:
         select name,gongji from sanguo where gongji<(select avg(gongji) from sanguo);
         找出每个国家攻击力最高的英雄的名字和攻击值
         select name,gongji, from sanguo
         where
        (country,gongji) in(select country,max(gongji) from sanguo group by country);

3、多表查询

    1、  笛卡儿积:不加where条件
      select ... from 表1,表2;
    
        1) 记录多的表的每一条记录,去匹配另一张表的所有记录

        2) 2张表记录条数相同,则后表的每条数据去匹配前表的每条记录

    2、加where条件
       select  ... from  表1,表2 where   条件;
      select sheng.s_name,city.c_name from sheng,city
        -> where 
        -> sheng.s_id=city.cfather_id;
       
         select sheng.s_name,city.c_name,xian.x_name from sheng,city,xian
        -> where
         -> sheng.s_id=city.cfather_id and city.c_id=xian.xfather_id;

4、连接查询

   1、内连接(inner join)

            语法格式:select 字段名列表  from  表1 

            inner  join 表2   on  条件

                             inner  join 表3   on  条件;

          select sheng.s_name,city.c_name,xian.x_name from sheng
         -> inner join city
         -> on sheng.s_id=city.cfather_id
         -> inner join xian
         -> on city.c_id=xian.xfather_id;

   2、外连接

       1)左连接(left join)
              以左表为主,显示查询结果
              语法格式:
                         select 字段名列表   from  表1
                         left join  表2  on  条件
                         left  join   表3  on  条件;
                select sheng.s_name,city.c_name from sheng left join city on            sheng.s_id=city.cfather_id;

                > select sheng.s_name,city.c_name,xian.x_name from sheng
                -> left join city on sheng.s_id=city.cfather_id
                 -> left join xian on city.c_id= xian.xfather_id;

       2)右连接(right join)

             以右表为主显示查询结果,用法同左连接

***5

  1、锁

        目的:解决客户端并发访问的冲突问题

        锁分类:

               1)读锁(共享锁)

                       查询(select):加读锁之后,别人不能更改表记录,但可以进行查询

               2)写锁(互斥锁,排他锁)

                        更新(update):加写锁之后别人不能查,不能改

     

     锁粒度来分:

            1)行级锁:Innodb

                  select:加读锁,锁一行

                 update:加写锁,锁一行

            2)表级锁:MyISAM

                 select:加读锁,锁一张表

                 update:加写锁,锁一张表

 2、存储引擎(engine:处理表的处理器)

   基本操作密令:

        1)查看所有的存储引擎

               show engines;

        2)查看已有表的存储引擎

                show create table  表名;

        3)创建表制定存储引擎

             create table  表名(...)engine=myisam;

        4)已有表中更改存储引擎

            alter table  表名  engine = myisam;

  常用存储引擎的特点:

        1)InnoDB特点:

                  支持事务,外键,行级锁

                  共享表空间

        2)MyISAM特点:

                支持表级锁

                独享表空间

                          表名.frm:存放表结构

                          表名.MYD(mydate) :存放表记录

                          表名.MYI (myindex) :存放索引信息

       3)Memory存储引擎

              数据存储在内存中,速度快

              服务器重启、Mysql服务重启后表记录消失

       4)如何决定使用那个存储引擎

                 执行查询操作多的表使用MyISAM(若使用InnoDB浪费资源)

                 执行写操作多的表使用InnoDB

3、MySQL用户账户管理

         1)开启MySQL远程连接(改配置文件)

                  sudo  -i

                  cd  /etc/mysql.conf.d/

                  cp mysql.cnf mysql.cnf.bak2

                  vi mysql.cnf

                        #bind-address=127.0.0.1

                        把前面的#去掉,保存退出
                  
                         vi mysql.cnf

                          按a ->改内容->按ESC->按shift + :->wq
                 /etc/init.d/mysql restart                     

         2)用root用户添加授权用户

                 用root用户登录mysql :   mysql -uroot  -p123456

                  授权:grant  权限列表  on 库名.表名  

                                     to  "用户名"@"%"   identifed by "密码" with  grant option;              

                   权限列表:all  privileges,  select ,update

                  库名.表名:db4.*,  *.*(所有库的所有列表)

             示例:
             添加授权用户tiger,密码123,对所有库的所有列表有所有权限,可以从任何IP 去连接
                                 grant all privileges on *.* to 'tiger'@'%' identified by '123'
                                  -> with grant option;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值