mysql知识汇总

转自(https://www.cnblogs.com/xiaofei-bai/p/8029395.html

##MySQL数据库基础知识

1.数据库系统(database system)

        数据库系统是计算机系统中一种专门管理数组资源的系统,数据库存储的是一组或多组经过处理后的数据,管理这个数据库的软件成为数据库管理系统。

        组成:

            数据库(database)   存数据的

            数据库管理系统(database managment system)  管理数据库

     

    MySQL数据库作用:

    ​   1) 持久保存

     

    ​   2) 方便查询并提取满足条件的数据, 数据访问速度快

     

    ​   3) 处理并发访问

     

    ​   4) 权限管理

2.数据库系统分类:

        关系型数据库 : MySQL、SQLServer、oracle、db2、informix、sysbase

        非关系型数据库:redis、 MogoDB

3.开发中常用的数据库

        IBM:DB2

        甲骨文:Oracle  MySQL

        Microsoft:SQL Server Access等等

4.数据库在动态网站中有什么地位?

        1、动态网站是对数据进行操作。浏览网站的时候会发现网页内容变化,页面的布局主体没有变化。

        2、WEB系统的开发基本都离不开数据库,所谓的动态网站是基于数据库开发的系统,最主要的是围绕数据库来写程序(业务逻辑)。

5.MySQL和mysql有什么区别:

        MySQL指的是完整的数据库系统。

        mysql指的是一个叫mysql的客户端程序。

6.MySQL数据库的结构:

        数据库->数据表->字段(多个字段组成了一行数据)

        数据库:存放信息的文件夹

        数据库里面有一个一个的excel文件(数据表)

        数据表里面的数据是有数据行和数据列构成

        所看到的一行一行的数据是由一个或者多个字段组成的

7.SQL:为了和MySQL进行交互,需要使用一种叫SQL(结构化查询语言)的语言来进行交互。SQL是当今的标准的数据库语言,很多数据库都使用SQL作为交互语言:SQL Server、Oracle

         

        数据定义语言(DDL):定义和管理数据对象,比如建立数据库、数据表

        数据操作语言(DML):用于操作数据库对象中包含的数据。

        数据库查询语言(DQL):用于查询数据库对象中包含的数据,能够对表进行一个查询。

        数据控制语言(DCL):管理数据库的语言

8.连接数据库的步骤

        1、连接MySQL服务器

        2、选择数据库

        3、对数据表进行增删改查。

        4、关闭数据库

9.连接数据库

        mysql

        -u 用户名 root

        -p 密码

        -h 主机名

        -P 端口号 3306

         

    数据库语法的特点:

            mysql>

            1、每个SQL命令都要使用分号来完成。

            2->表示MySQL需要你继续输入命令。

            3、如果说有一条比较长的命令我就可以拆分成多行来执行。

            4、'>表示等待下一行,等待以单引号开始的字符串的结束

            5、">表示等待下一行,等待以双引号开始的字符串的结束。

            6、查询的命令不区分大小写,通常使用大写字母来写出SQL关键字和函数名,用小写字母写出数据库、数据表和数据列的名字

10.退出MySQL

        quit

        exit

        \q

    常见操作

            \c 取消命令输入

            \g 代替结束符;

            \s 查看服务器端信息

            \h 查看帮助

11.创建数据库

    格式:

        create database if not exists 数据库名 default charset utf8;

        注意:

              1、数据库是唯一的

              2if not exists先判断是否存在这个数据库,存在不创建,不存在就创建。

              3、创建数据库,并设定编码集为utf8

             

12.显示当前数据库服务器下所有的数据库名

    show databases;

        use 数据库名    选择数据库

        注意:

            windows下面数据库名是不区分大小写的,在Linux下面严格区分。

13.删除数据库

    drop database 数据库名

     

    查看已经选择的数据库

       select database();

    查看当前的数据库的版本号

        select version();

14.数据表的操作

    show tables 查看数据库中的数据表。

    创建数据表

        格式:

            create table 表名(列的一些信息);

        例子:

            create table t1(id int(12), name varchar(100));

            create table `test t1`(id int(10), name varchar(50));

         

       desc 表名 查看表的结构.

       show create table 表名 查看建表的语句

             \G 格式化输出(文本式,竖立显示)

       drop table 数据表名

       drop table [if exists] 数据表名  尝试性的删除表。

15.记录操作  增、删、改、查

    (1)插入数据

        格式:

            insert into 表名(字段1,字段2,字段3) values(值1,值2,值3);

     

    insert into 表名(字段1,字段2,字段3) values(a值1,a值2,a值3);

     

    (2)查询表数据

        格式:

            select * from 表名;

     

    select 字段1,字段2,字段3 from 表名;

    select * from 表名 where 字段=某个值;

    (3)修改表数据

        格式:

            update 表名 set 字段=某个值 where 条件;

     

    update 表名 set 字段1=1,字段2=2 where 条件;

     

    update 表名 set 字段=字段+值 where 条件;

     

    (4)删除数据

        格式:

            delete from 表名 where 字段=某个值;

    delete from 表名; (慎重使用)

    delete from 表名 where 字段 = 值;

         

    清空表数据

            truncate table 表名;

16.修改用户密码

        在退出mysql服务的情况下 输入

        1、mysqladmin -u 用户名 -p password 新密码

        输入旧密码:

     

        2、登录到mysql的时候使用set password for '用户名'@'登录主机'=password('新密码');

17.修改表的字段信息

    修改表的字符集

        alter table 表名 charset utf8

    修改字段的类型

        alter table 表名 modify 字段名 字段类型

    修改字段的名字并同时修改字段类型

        alter table 表名 change 旧字段名 新字段名 字段类型

    修改字段的字符集

        alter table 表名 modify 字段名 类型 charset utf8

    添加新字段

        alter table 表名 add 字段名 类型

    删除字段

        alter table 表名 drop 字段名

    修改表名

        alter table 旧表名 rename as 新表名

18.删除默认匿名的账户

    为什么我直接输入mysql也能进入数据库中。是匿名用户,MySQL默认创建的。他有test和information_schema这两个库的权限。我们可以把他删掉

        删除匿名用户:drop user ''@'localhost';

19.MySQL数据库的数据类型:

    MySQL的数据类型分为四大类:数值类型、字串类型、日期类型、NULL。

     

    1 数值类型:

        *tinyint(1字节) 0~255  -128~127

        smallint(2字节)

        mediumint(3字节)

        *int(4字节)

        bigint(8字节)

        *float(4字节)      float(6,2)   float(m,d)

        *double(8字节)   double (m,d)

        decimal(自定义)字串形数值  decimal(m,d) 

                    m精度    d标度

         

     2 字串类型

        普通字串

        *char  定长字串      char(8

        *varchar 可变字串       varchar(8)

         

        二进制类型

        tinyblob

        blob

        mediumblob

        longblob

         

        文本类型

        tinytext

        *text      常用于<textarea></textarea>

        mediumtext

        longtext

         

        *enum枚举 enum('男','女') default '男';

        set集合

         

    3 时间和日期类型:

        date  年月日

        time  时分秒

        datetime 年月日时分秒

        timestamp 时间戳

        year 年

     

    4 NULL值

        NULL意味着“没有值”或“未知值”

        可以测试某个值是否为NULL

        不能对NULL值进行算术计算

        对NULL值进行算术运算,其结果还是NULL

        0或NULL都意味着假,其余值都意味着真

    MySQL的运算符:

        算术运算符:+ - * / %

        比较运算符:= > < >= <= <> !=

        数据库特有的比较:innot inis null,is not null,like, between and

        逻辑运算符:and or not

     

        like: 支持特殊符号%和_ ; 其中 %表示任意数量的任意字符,_表示任意一位字符。

     

    表的字段约束:

        unsigned    无符号(正数)

        zerofill    前导零填充

        default     默认值

        not null    非空

        auto_increment  自增 在产生一个唯一的标识或顺序值的时候,可以利用这个约束条件。<br>         这个约束条件只能用于整数类型,值一般从1开始。每行加1,插入一个null到一个auto_increment列时,MySQL将插入一个比出现过的最大值+1的值。<br>         一个表中只能有一个auto_increment列,并且必须定义为primary key或unique才能够使用

        primary key  主键索引 (非null并不重复)

        unique   唯一索引   (可以为null但不重复)

        index    常规索引

19.建表语句格式:

     create table 表名(

       字段名 类型 [字段约束],

       字段名 类型 [字段约束],

       字段名 类型 [字段约束]

       ...

      );

    实例:

        mysql> create table stu(

        -id int unsigned not null auto_increment primary key,

        -> name varchar(8not null unique,

        -> age tinyint unsigned,

        -> sex enum('m','w'not null default 'm',

        -> classid char(6)

        -> );

20.插入数据

    1 插入指定字段

        insert into t1(字段1,字段2,字段3...) values ('值1','值2','值3',....);

    2 插入所有的字段

        insert into t1 values ('值1','值2','值3',....);

    3 插入多条数据

        insert into t1(字段1,字段2,字段3...) values ('值1','值2'),('值1','值2')....;

    4 插入结果

        insert into t1(字段1,字段2,字段3...) select 字段1,字段2,字段3... from t1;

        insert into t1() select * from t1;

    5 插入单条数据

        insert into t1 set 字段1=1,字段2=2....;

21.查询数据

    格式:

        select [字段列表]|* from 表名

        [where 搜索条件]

        [group by 分组字段 [having 子条件]]

        [order by 排序 asc|desc]

        [limit 分页参数]

    mysql>select * from stu;

    +----+----------+-----+-----+---------+

    id | name     | age | sex | classid |

    +----+----------+-----+-----+---------+

    |  1 | zhangsan |  20 | m   | lamp138  |

    |  2 | lisi     |  20 | m   | lamp138  |

    |  3 | wangwu   |  21 | w   | lamp138  |

    |  4 | zhaoliu  |  25 | w   | lamp94  |

    |  5 | uu01     |  26 | m   | lamp94  |

    |  6 | uu02     |  28 | w   | lamp92  |

    |  7 | qq02     |  24 | m   | lamp92  |

    |  8 | uu03     |  32 | m   | lamp138  |

    |  9 | qq03     |  23 | w   | lamp94  |

    10 | aa       |  19 | m   | lamp138  |

    11 | sad      |  35 | m   | lamp94  |

    12 | tt       |  25 | m   | lamp92  |

    13 | wer      |  25 | w   | lamp94  |

    14 | xx       |  25 | m   | lamp92  |

    15 | kk       |   0 | w   | lamp94  |

    +----+----------+-----+-----+---------+

    ##where条件查询

    1. 查询班级为lamp138期的学生信息

    mysql> select * from stu where classid='lamp138';

     

    2. 查询lamp138期的男生信息(sex为m)

    mysql> select * from stu where classid='lamp138' and sex='m';

     

    3. 查询id号值在10以上的学生信息

    mysql> select * from  stu where id>10;

     

    4. 查询年龄在2025岁的学生信息

    mysql> select * from stu where age>=20 and age<=25;

    mysql> select * from stu where age between 20 and 25;

     

    5. 查询年龄不在2025岁的学生信息

    mysql> select * from stu where age not between 20 and 25;

    mysql> select * from stu where age<20 or age>25;

     

    6. 查询id值为1,8,4,10,14的学生信息

    select * from stu where id in(1,8,4,10,14);

    mysql> select * from stu where id=1 or id=8 or id=4 or id=10 or id=14;

     

    7. 查询lamp138和lamp94期的女生信息

    mysql> select * from stu where classid in('lamp138','lamp94'and sex='w';

    mysql> select * from stu where (classid='lamp138' or classid='lamp94'and sex='w

    ##LIKE 子句

    这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。

    LIKE 子句中使用百分号%字符来表示任意字符,类似于UNIX或正则表达式中的星号*

     

    如果没有使用百分号%, LIKE 子句与等号=的效果是一样的。

     

    LIKE 通常与 % 一同使用,类似于一个元字符的搜索。

    你可以使用 AND 或者 OR 指定一个或多个条件。

    你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。

    可以使用regexp正则来代替 like

    1.查询name字段值是以zh开头的所有信息

    mysql> select * from stu where name like "zh%";

    mysql> select * from stu where name regexp  "^zh"--正则写法

    +----+----------+------+-----+---------+

    id | name     | age  | sex | classid |

    +----+----------+------+-----+---------+

    14 | zhangle  |   29 | m   |       5 |

    |  1 | zhangsan |   20 | w   |       1 |

    |  4 | zhaoliu  |   21 | m   |       4 |

    +----+----------+------+-----+---------+

    2.查询姓名name中含有ang子串的所有信息

    mysql> select * from stu where name like "%ang%";

    mysql> select * from stu where name regexp  "ang";

    +----+-----------+------+-----+---------+

    id | name      | age  | sex | classid |

    +----+-----------+------+-----+---------+

    |  1 | zhangsan  |   20 | w   |       1 |

    |  3 | wangwu    |   22 | w   |       5 |

    10 | xiaozhang |   19 | w   |       1 |

    13 | wangwen   |   27 | w   |       2 |

    14 | zhangle   |   29 | m   |       5 |

    +----+-----------+------+-----+---------+

    3.查询姓名是任意四位字符构成的信息。

    mysql> select * from stu where name like "____";

    mysql> select * from stu where name regexp "^[a-z0-9]{4}$";

    +----+------+------+-----+---------+

    id | name | age  | sex | classid |

    +----+------+------+-----+---------+

    |  2 | lisi |   25 | m   |       2 |

    |  5 | uu01 |   27 | w   |       1 |

    |  6 | uu02 |   25 | m   |       2 |

    |  7 | uu03 |   28 | w   |       2 |

    |  8 | uu05 |   22 | m   |       4 |

    +----+------+------+-----+---------+

    创建一个表结构和另一个表一样的结构

    create table t3 like t1;

    那么现在t3表的结构和t1表的结构是一样的,但是要注意数据是没有的

    MySQL的统计函数(聚合函数):max() min() count() sum() avg()

    1.获取学生表中最大、最小以及平均年龄是多少?

    mysql> select max(age),min(age),avg(age) from stu;

    2.获取学生表中男生m的数量

    mysql> select count(*from stu where sex='m';

    GROUP BY 语句 分组

    GROUP BY 语句根据一个或多个列对结果集进行分组。

    统计班级信息,按性别分组,并统计每组人数;

    mysql> select sex,count(*from stu  group by sex;

     

    1.统计每个班级的人数

    nysql> select classid,count(*from stu  group by classid;

     

    2.统计每个班级的,男生和女生各多少人数。

    mysql> select classid,sex,count(*from stu  group by classid,sex;

    ORDER BY 排序 -- asc 默认升序 desc 降序

    我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。

    如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的ORDER BY子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

    你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。

    你可以设定多个字段来排序。

    你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。

    你可以添加 WHERE...LIKE 子句来设置条件。

    1.按年龄升序排序查询学生信息

    mysql> select * from stu order by age;

    mysql> select * from stu order by age asc;  --默认asc升序 可省略

    2.年龄降序排序

    mysql> select * from stu order by age desc;

    3.查询学生信息,按班级做升序排序,相同班级按年龄降序排序

    mysql> select * from stu order by classid asc,age desc;

    ##LIMIT 关键字 查询部分数据

    -- 例如: .... limit m; 查询数据只显示前m条

    -- 例如: .... limit m,n; 排除前m条,然后再查询出前n条

     

    1.查询前5条信息

    mysql> select * from stu limit 5;

    2.排除前2条后再获取4条信息

    mysql> select * from stu limit 2,4;

22.修改数据

     格式:update 表名 set 字段1=1,字段2=2,字段n=值n... where 条件

         

        -- id11的age改为35,sex改为m值

        mysql> update stu set age=35,sex='m' where id=11;

        

        -- id值为1214的数据值sex改为m,classid改为lamp92

        mysql> update stu set sex='m',classid='lamp92' where id=12 or id=14 --等价于下面

        mysql> update stu set sex='m',classid='lamp92' where id in(12,14);

       

         

23.删除操作

    格式:delete from 表名 [where 条件]

         -- 删除stu表中id值为100的数据

        mysql> delete from stu where id=100;

        -- 删除stu表中id值为2030的数据

        mysql> delete from stu where id>=20 and id<=30;

        

        -- 删除stu表中id值为2030的数据(等级于上面写法)

        mysql> delete from stu where id between 20 and 30;

        

        -- 删除stu表中id值大于200的数据

        mysql> delete from stu where id>200;

24.导入和导出

    注意: 在操作导入和导出数据的时候 不要登录到mysql服务中,要退出mysql服务进行操作

    -- 将lamp138数据库里面的所有的表导出

    C:\>mysqldump -u root -p lamp138 > C:\lamp138.sql

    Enter password:

    ---- 将lamp138数据库中的stu表导出

    C:\>mysqldump -u root -p lamp138 stu > C:\lamp138_stu.sql

    Enter password:

    -- 将lamp138库中的所有表导入

        

    C:\>mysql -u root -p lamp138 < C:\lamp138.sql

    Enter password:

    -- 将lamp138库中stu表导入

    C:\>mysql -u root -p lamp138 < C:\lamp138_stu.sql

    Enter password:

    *********************

    -- 将所有的数据库进行导出

    mysqldump -uroot -p密码  --all-databases  --events > /tmp/bak.sql       所有数据库备份

25.MySQL的权限管理

    格式:

        grant 权限 on 数据库.数据表 to '用户名'@'登录主机'  identified  by '密码'

         

    刷新权限

    flush privileges;<br>

    举例:

        grant select,insert,update,delete on *.* to  'wjs'@'%' identified by '12345';       <br>

        安全的做法

        grant select,insert,update,delete on pass.* to 'root'@'localhost'  identified by '12345';  

        只针对localhost主机里面的  pass数据库里面的数据表进行增删该查

        localhosthost == 127.0.0.1   

    删除用户

    drop user 'xxoo'@'%' 

26.索引的作用:

    索引是数据库中用来提高搜索性能的。我们通常在做数据库优化的时候通常先做索引的优化,数据量少的时候没效果,数据越多效果越明显。

    查看表中都有哪些索引

    show index from 表名\G

索引的分类:

1.常规索引(index)

    最基本的索引,没有任何限制

     

    添加表字段的常规索引

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

        alter table 表名 add index 索引名(字段名)   

    在创建表的时候也可以进行添加

        create table t2(

                id int(10) unsigned auto_increment primary key,

                name varchar(255), index  索引名(字段名)

            );

    删除表字段常规索引**

        drop index 索引名 on 表名

        alter table 表名 drop index 索引名

2.唯一索引(unique)

    唯一索引是可以给每个字段进行添加的,添加完了之后字段里面的值就不可以重复了,主键索引和唯一索引类似,

    但是数据表里的主键索引只能加在一个字段里(一般都加在id上),id是自增的,索引不会有重复的时候出现

     

    添加表字段的唯一索引

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

        alter table 表名 add unique 索引名(字段名)

    在创建表的时候也可以进行添加

        create table t2(

                id int(10) unsigned auto_increment primary key,

                name varchar(255), unique  索引名(字段名)

            );

    删除唯一索引

        drop index 索引名 on 表名

3.主键索引(primary key)

    主键索引是关系数据库中最常见的索引类型,主要作用是确定数据表里一条特定的数据记录的位置。

    我们可以在字段后添加PRIMARY KEY来对字段设置为主键索引。

    注意:

        1.最好为每张表指定一个主键,但不是必须指定。

        2.一个表只能指定一个主键,而且主键的值不能为空

        3.主键可以有多个候选索引(例如NOT NULL,AUTO_INCREMENT)

    添加表字段的主键索引

        alter table 表名 add  primary key (字段名)

    添加自增

        alter table 表名 modify id int(4) auto_increment

    删除主键索引

        如果字段有了auto_increment 和 primary key的时候,需要删除主键的话,

        先删除自增,然后再删除主键   

        删除自增

        alter table 表名 change 字段名  字段名 类名

        删除主键

        alter table 表名 drop primary key

4.全文索引(fulltext)

     

    全文索引在MySQL中是一个FULLTEXT类型索引,但FULLTEXT索引只能用于MyISAM表,

    并且只可以在CHAR、VARCHAR或TEXT类型的列上创建,也允许创建在一个或多个数据列上。

    添加表字段的全文索引

        alter table 表名 add fulltext 索引名(字段名)

    删除全文索引

        drop index (索引名) on 表名

        alter table 表名 drop index 索引名

  注意:如果在创建索引的时候,不添加索引名的话 默认会把字段名当做索引名

27.表的存储引擎

    存储引擎: 是MySQL的一个特性之一,用户可以根据应用的需要选择如何存储

    MySQL支持MyISAM、InnoDB、HEAP、BOB、ARCHIVE、CSV、MEMORY等多种数据表引擎,在创建一个新MySQL数据表时,可以为它设置一个引擎类型。

        MyISAM和InnoDB两种表类型最为重要:

     

        1.MyISAM数据表类型的特点是成熟、稳定和易于管理。

        2.MyISAM表类型会产生碎片空间,要经常使用OPTIMIZE TABLE命令去清理表空间

        3.MyISAM不支持事务处理,InnoDB支持

        4.MyISAM不支持外键,InnoDB支持

        5.MyISAM表类型的数据表效率更高

        6.MyISAM表类型的数据表会产生三个文件

                ---.frm (表结构)

                ---.myd (表数据)

                ---.myi (表索引)

          InnoDB表类型表默认只会产生两个文件

                ---.frm (表结构)

                ---.ibd (表数据+表索引)

    7.MyISAM表,其优势就是访问的速度快。对事务没有完整性的要求或以select、insert为主的通常使用MyISAM表

        8.InnoDB表:会占用更多的磁盘空间

        锁机制:MyISAM  表锁:开销小,加锁快,发生冲突的概率高。

            InnoDB  行锁:开销大,加锁慢,发生冲突的概率低。

     

    9.默认是InnoDB引擎

        数据存储在 innodb_data_home_dir选项所选的文件名的目录里

     

    查看默认的引擎

     

        show variables like 'default_storage_engine';

    查看支持的引擎

     

        show engines

    查看当前库里面所有的表引擎

     

        show table status from 库名

     

    修改表引擎

         <br>            alter table 表名 engine = 新的表引擎

    ubuntu下

    //mysql配置文件

    sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

    //重启

    sudo /etc/init.d/mysqld restart

28.表的结构要满足三范式

    1NF 原子性  字段不可再分,否则就不是关系数据库;

        即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只要数据库是关系型数据库(mysql/oracle/db2/informix/sysbase/sql server),就自动的满足1NF。数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。如果实体中的某个属性有多个值时,必须拆分为不同的属性 。通俗理解即一个字段只存储一项信息。

    2NF 唯一性

        要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要我们设计一个主键来实现(这里的主键不包含业务逻辑)。

    3NF 无冗余性   

        要求一个数据库表中不包含已在其它表中已包含的非主键字段。就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放(能尽量外键join就用外键join)。很多时候,我们为了满足第三范式往往会把一张表分成多张表。

29.left join、right join、inner join的区别

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

    right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

    inner join(等值连接) 只返回两个表中联结字段相等的行

    举例:

    left join

        select * from p1 left join p2 on p1.id = p2.id;

    right join

        select * from p1 right join p2 on p1.id = p2.id;

    inner join

        select * from p1 inner join p2 on p1.id = p2.id;

    =======================================================

    多表查询

    select a.name,b.bname from t1 as a,t2 as b where a.id = b.pid;

30.子查询

    1、单行子查询

        select name,age,score

        from user

        where age=(select age from stu where id = 1);

    2、多行子查询

      

        select name,age,class

        from user

        where age in (select age from stu where id 10);

        select name,age.class

        from user

        where age in (select age from stu where name like '王%');

31.分组 group by

     

    1 查询各个班级中年龄大于20,性别为男的人数、姓名和班级 (数据表: stu)

     为了防止班级里面有重名的现象发生(例如 两个男生都是20岁 以上的)  所以会有count(*)

      select count(*),classid,name  from t1 where sex='男' group by classid,age having age > 20;

    2 学校评选先进学生,要求平均成绩大于等于90分的学生,并且语文课必须在95分以上,请列出有资格的学生  (数据表: score)

      select classid,name from sc where (yw+sx+en)/3 >= 90 and yw>=95 group by classid,name;

          

       select classid,group_concat(name) from sc where (yw+sx+en)/3>=90 and yw>=95 group by classid;

    3 用一条sql语句查询出每门课都大于80分的学生姓名 (数据表: courseinfo)

       select name from courseinfo group by name having min(score) > 80;

      select DISTINCT  name from courseinfo where name not in (select distinct name from courseinfo where score < 80);

     

32.创建视图

    视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

    如果你想创建视图的话 首先你的数据库要有创建视图的权限,不然的话是创建不成功的

        create view v1 as select * from t1 where id 1;

    创建v1的视图  把查询t1表里面的符合条件的数据放到v1里面

    注意:如果主表不存在 那么视图表失效

    删除视图表

        drop view v1;

33.mysql内置函数

    字符串链接   concat('name','id');

    最大值 max('price')

    最小值 min('price')

    平均值  avg('price')

    定义变量  set @a = 10

    获取变量的值  select @a

    计算  select @a + @b;   select 10 + 20

    字符串转换成大写和小写     select ucase('name')     select lcase('NAME')

    计算字符串的长度  select length('namesss') as len;

            select * from user where length(name) > 5;  名字大于5的长度找出来

    去除两侧的空白  select trim('   pass   ');

            select length(trim('  over '));

    随机数 从0-1之间的随机数  select rand();

    获取0-10之间的随机整数向上取整   select ceil(rand()*10)

    获取时间戳 select unix_timestamp();

34.mysql预处理

    **设置一个占位符

    prepare 名字 from "select * from t2 where id > ?";

    设置变量

    set @id = 2;

    执行

    execute 名字 using @id;

    **设置多个占位符

    prepare 名字 from "select * from t2 where id > ? and id < ?";

    设置变量

    set @id = 2;

    set @id1 = 5;

    执行

    execute 名字 using @id,$id1;

35.mysql存储过程

    简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能

    MySQL存储过程的创建

         

    创建的格式:CREATE PROCEDURE 过程名 ([过程参数[,...]])

    [特性 ...]过程体

     

    举个例子:

      **修改结束符

        mysql-> delimiter //

          **创建

        mysql-> create procedure proc() 

         -> begin

         -> select * from user; 

         ->end//

        **使用

        mysql-> call proc()//

        **修改结束符

         mysql-> delimiter ;

注意:

1)这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。

    格式:

    \d //  把结束符的分号改成 //结束本条sql语句

     

      \d  和 delimiter 是一样的 都可以修改mysql的结束符

2)过程体的开始与结束使用BEGIN与END进行标识

3)存储过程根据需要可能会有输入输出参数,输入参数x 类型int型 ,输出参数num 类型是int型,如果有多个参数用","分割开。

    create procedure lamp172(in int,out num int)

      -> begin

      -set num = + 20;

      -> end//

    调用

     call lamp172(10,@s)//

    select @s as num//

    使用循环插入数据

    create procedure total(num int(10))

     ->begin

     ->set @i = 0;

     ->while @i<num do

     ->insesrt into t1 values (null,'www',20);

     ->set @i = @i+1;

     ->end while;

     ->end//

注意 : 写存储过程名字的时候 不要使用关键字 和 数字

     

    例如:

        create procedure 111()   数字错误

        create procedure  add()   关键字错误

    删除存储名

    drop procedure if exists 存储名;

36.mysql触发器 trigger

在t2表插入数据的同时使用trigger 修改其他表的信息

    格式:     create trigger 名字 after/before  insert/update/delete on 表名 for each row

            begin

            语句

            end

    例如:

    create trigger tg_1 before insert on t2 for each row

    begin

    insert into t3(name) values (new.name);

    end//

    插入数据

    insert into t3(name) values ('wwww')//

    create trigger tg_2 after update on t1 for each row

    begin

    update t2 set t2.name= new.name where t2.id = old.id;

    end//

     

    update t1 set name = 'xxoo' where id = 2//

    create trigger tg_3 after delete on t1 for each row

    begin

    delete from t2 where id = old.gid;          // old.gid 这里面的gid是t1表与t2表相关的id

    end//

    delete from t1 where gid = 2//    gid=2   ====> old.gid

    //查看触发器

    show triggers;

    //删除触发器

    drop trigger 名字;

37.mysql 读写锁

读锁: 所有的终端都可以读取数据  但是不能操作数据(增 删 改)

     

    lock table t2 read

   解锁

     

    unlock tables;

写锁: 当前的终端对表进行写锁之后,代表本终端可以进行读写操作,但别的终端不可以进行读写操作

     

    lock table t2 write;

  解锁

     

    unlock tables;

38.mysql表数据的备份与恢复操作

  使用SQL语句备份和恢复

  你可以使用SELECT INTO OUTFILE语句备份数据,并用LOAD DATA INFILE语句恢复数据。

  这种方法只能导出数据的内容,不包括表的结构,如果表的结构文件损坏,你必须要先恢复原来的表的结构。

  格式:

    

    备份操作

    SELECT * INTO {OUTFILE | DUMPFILE} 'file_name' FROM tbl_name

    恢复操作

    LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name

    举例:

    导出

    select * from t2 into outfile '../lamp185.txt';  //相对于mysql.exe文件的路径 

    清空

    truncate table t2;

    导入

    load data infile '../lamp185.txt' into table t2;

39.增量备份

     

    一种mysql操作记录的备份

    1)操作

        修改配置文件my.ini

        [mysqld]

        log-bin=c:/mysql/mysql-log    #(这里是备份文件存放的位置) 文件夹要存在才行

        expire_logs_days=7     # binlog过期清理时间   单位为天

        binlog_format = MIXED    #binlog日志格式

    2)查看

        可以使用mysql的命令进行查看增量备份中的内容

        mysqlbinlog c:/mysql/mysql-log.000001

    3)数据恢复

        通过时间: mysqlbinlog --stop-datetime="2016-10-10 10:20:30"  c:/mysql/mysql-log.000001 | mysql -uroot  -p

        通过位置: mysqlbinlog --stop-position="150" c:/mysql/mysql-log.000001 | mysql -uroot  -p

        #171208 15:50:06 server id 1  end_log_pos 2227 CRC32 0x7ff79ffa

        这里面的171208 15:50:06 时间是上面的datetime的时间

        这里面的end_log_pos 2227 是上面 position="150"

             

    4)重新记录增量备份

         reset master      在mysql命令行中进行输入

40.查询处理

    语句分析 explain指令

    格式:

        explain  select  *  from  user

    type 类型

    快慢顺序

        system> const >eq_ref > ref > fulltext >ref_or_null >index_merge > unique_subquery > index_subquery > range>index > all

    const:表中满足条件的记录最多一条,通常会出现在主键和unique索引中

        explain  select  *  from  test  where id=1

        explain  select  *  from test_2 where name = 'zhangsan'

    eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是unique或primary key

        explain  select type.name,typechild.childname  from  type,typechild where type.id = typechild.pid;

    ref:使用普通索引进行查询

        explain select *  from test where  name = 'abc';

    ref_or_null:通过普通索引检索,并且会检索null值

        explain  select  *  from  test_2  where  nickname  = 'zhangsan' or nickname = null;

    range :当查询范围的时候

        explain  select *  from test  where id 3;

         

         explain  select *  from test  where id in (1,2,3);

        

        explain  select *  from test  where id between 1 and 3;

         

    index:跟all一样,不过只会扫描索引

        explain  select  id  from test;

    all:全表扫描

        explain  select  *  from test

    注意:查询一定或者尽量不要出现all类型(全表扫描,速度是最慢的)

    key(代表的是搜索时使用到的索引名)

         

41.开启慢查询记录

    需要进行配置  在mysql中的my.ini中进行设置

    slow-query-log = 1    # 开启慢查询操作

    slow-query-log-file = slow.log      # 文件默认存放在mysql的data目录下 (文件名自定义)

    long-query-time = 1     # 超时时间定为1秒  如果执行的sql语句超过1秒钟就把语句存放到slow.log文件中 (不能使用小数)

猜你喜欢

转载自blog.csdn.net/weixin_42575273/article/details/82285061
今日推荐