十九、Mysql数据库运维实战--SQL1

一、SQL语言分类

        SQL(Structured Query Language 即结构化查询语言)

        SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。

        分类

                DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE  DROP ALTER        DDL(data definition language):

                DML(data manipulation language)语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE

                DQL语句 数据库查询语言: 查询数据SELECT        DQL(Data Query Language  )数据查询语言 SELECT

                DCL(Data Control Language):)语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE

二、名词解释

        1.数据库服务器

                运行着数据库应用程序的设备 DELL R760+CENTOS+Mysql

                硬件+系统软件+MYSQL软件

        2.数据库

              默认数据库 

                mysql>show   databases ;

                information_schema: 虚拟库,主要存储了系统中的一些数据库对象的信息,例如用户表信息、列信息、权限信息、字符信息等

                performance_schema: 主要存储数据库服务器的性能参数

                        1.提供进程等待的详细信息,包括锁、互斥变量、文件信息;

                         2.保存历史的事件汇总信息,为提供MySQL服务器性能做出详细的判断;

                         3.对于新增和删除监控事件点都非常容易,并可以随意改变mysql服务器的监控周期

                mysql: 授权库,主要存储系统用户的权限信息

                sys: 主要存储数据库服务器的性能参数

                SYS database中,可以获取mem page、io 、latch/mutex/lock等各种性能数据,方便做peformance turning 和 troubleshooting。比如可以方便获取2个sql发生 lock block,用户占用的资源等信息。

              表(EXCEL)的管理单元

      3. 表 --记录的管理单元

                信息的载体,字段的管理单元

                张三,男,23,云计算工程师,月薪25K

      4.字段(列)

                字段名,字段类型(长度),字段约束组成(可选)

                姓名,文字,不能为空

                张三

      5.类型

                字符,数字,日期

      6.约束

                唯一,不能为空,自动增长

      7.图示

           

 三、DDL

        1.DDL-库

                 定义库

                        创建业务数据库

                                语法

                                CREATE DATABASE 数据库名;

                                CREATE DATABASE discuz;

                                数据库名要求

                                区分大小写

                                唯一性

                                不能使用关键字如 create select

                                不能单独使用数字和特殊符号“如-"

                                正常的:用拼音或单词即可。

                        查看所有数据库

                                SHOW DATABASES;

              选择/进入数据库

                        USE 数据库名

                        SELECT database();
                        调用函数,查询当前库

              删除数据库

                DROP DATABASE 数据库名;

              系统中的位置

                /var/lib/mysql/

                清理         备份

        2.数据类型

                数据类型

                        1.数值类型:

                                    整数类型          INT   

                                                            TINYINT   SMALLINT   MEDIUMINT   BIGINT    

                                    浮点数类型     FLOAT DOUBLE

                                    定点数类型        DEC

                                    位类型         BIT

                        2.字符串类型:

                                        CHAR系列      CHAR  VARCHAR

                                        TEXT系列        TEXT  TINYTEXT  MEDIUMTEXT LONGTEXT

                                        BLOB 系列        BLOB         特殊符号

                                        BINARY系列     BINARY VARBINARY 

                                        枚举类型:    ENUM        65536个元素

                                        集合类型:   SET         64个元素

                        3.时间和日期类型:

                                DATE     TIME     DATETIME         TIMESTAMP     YEAR 

                类型测试

                        ===整数类型测试:tinyint,int

                        作用:用于存储用户的年龄、游戏的Level、经验值等。

                        LAB1:(int,tinyint的最大值)

                                前言         TINYINT有符号型最大127

                                                INT有符号型最大2147483647

                                1 创建一个表

                                        mysql> create table test1( 
                                             tinyint_test tinyint,
                                           int_test int
                                          ); 注意TINYINT类型

                                2 查询表结构

                                        mysql> desc test1;
                                        +--------------+------------+------+-----+---------+-------+
                                        | Field        | Type       | Null | Key | Default | Extra |
                                        +--------------+------------+------+-----+---------+-------+
                                        | tinyint_test | tinyint(4) | YES  |     | NULL    |       | 
                                        | int_test     | int(11)    | YES  |     | NULL    |       | 
                                        +--------------+------------+------+-----+---------+-------+
                                        2 rows in set (0.01 sec)

                                        Field字段名称(列名)
                                        TYPE字段类型(字?数?日?)
                                        NULL KEY DEFAULT EXTRA 略

                                3 插入数值

                                        1 插入合法数值

                                                mysql> insert into test1 values (111,111);
                                                Query OK, 1 row affected (0.09 sec)

                                                查询表内容        select * from test1

                                        2 插入非法数值

                                        错误的示例:
                                        mysql> insert into test1(tinyint_test) values(128);
                                        ERROR 1264 (22003): Out of range value for column 'tinyint_test' at row 1
                                        正确的示例:
                                        mysql> insert into test1(tinyint_test) values(127);

                                        3 插入合法数值

                                        mysql> insert into test1(int_test) values(2147483647);
                                        Query OK, 1 row affected (0.05 sec)

                                        4 插入非法数值

                                        mysql> insert into test1(int_test) values(2147483648);
                                        ERROR 1264 (22003): Out of range value for column 'int_test' at row 1

                                        INT有符号型最大2147483647

                     LAB2:(无符号unsigned)

                                前言        数值无符号,就只能输入正值,不能输入负值

                                1 创建一个表

                                        mysql> create table test2(
                                         tinyint_test tinyint unsigned,              
                                        int_test int unsigned
                                      );
                                        Query OK, 0 rows affected (0.00 sec)

                                  //约束条件unsigned限定只能存正值(无符号)

                                2 查询表结构

                                mysql> desc test2;
                                +--------------+---------------------+------+-----+---------+-------+
                                | Field        | Type                | Null | Key | Default | Extra |
                                +--------------+---------------------+------+-----+---------+-------+
                                | tinyint_test | tinyint(3) unsigned | YES  |     | NULL    |       | 
                                | int_test     | int(10) unsigned    | YES  |     | NULL    |       | 
                                +--------------+---------------------+------+-----+---------+-------+
                                2 rows in set (0.00 sec)

                                3 插入数据

                                        1 插入合法数据

                                        mysql> insert into test2(tinyint_test) values(255);
                                        Query OK, 1 row affected (0.06 sec)

                                        2 插入合法数据

                                        mysql> insert into test2(int_test) values(2147483648);
                                        Query OK, 1 row affected (1.87 sec)

                                        3 插入非法数据

                                        mysql> insert into test2 values(-20,-20);
                                        ERROR 1264 (22003): Out of range value for column 'tinyint_test' at row 1

                                        mysql和mariadb不同。
                                        mysql提示输入错误
                                        mariadb会输入0到表中。
                                        但结果是肯定的,无符号只能输入正值

                     LAB3:(整数型,长度可变)

                                        前言        插入大于INT宽度限制的值,仍然可以存储。但不能超过上限2147483647

                                        INT整形的宽度仅为显示宽度,不是限制。因此建议整形无须指定宽度。
字符型需要使用宽度

                                        1 创建一个表

                                        mysql> create table t1 (
                                         id1 int,id2 int(6)
                                         );

                                        2 查询表结构

                                        mysql> desc t1;
                                        +-------+---------+------+-----+---------+-------+
                                        | Field | Type    | Null | Key | Default | Extra |
                                        +-------+---------+------+-----+---------+-------+
                                        | id1   | int(11) | YES  |     | NULL    |       |
                                        | id2   | int(6)  | YES  |     | NULL    |       |
                                        +-------+---------+------+-----+---------+-------+

                                        3 插入数据

                                        mysql> insert into t1 values(22,22222222);
                                        Query OK, 1 row affected (0.01 sec)

                                        4 查询数据

                                        mysql> select * from t1;

                                        插入大于INT宽度限制的值,仍然可以存储。
但不能超过上限2147483647

                                        

                     LAB4:(零填充zerofill)

                                前言         zerofill 自动填充0

                                1 创建一个表

                                zerofill

                                mysql> create table t2 (
                                 id1 int zerofill,
                                id2 int(6) zerofill
                              );
                                Query OK, 0 rows affected (0.05 sec)

                                2 查询表结构

                                mysql> desc t2;
                                +-------+---------------------------+------+-----+---------+-------+
                                | Field | Type                      | Null | Key | Default | Extra |
                                +-------+---------------------------+------+-----+---------+-------+
                                | id1   | int(10) unsigned zerofill | YES  |     | NULL    |       |
                                | id2   | int(6) unsigned zerofill  | YES  |     | NULL    |       |
                                +-------+---------------------------+------+-----+---------+-------+
                                2 rows in set (0.00 sec)

                                3 插入数据

                                mysql> insert into t2 values(2,2);
                                Query OK, 1 row affected (0.01 sec)

                                4 查询表内容

                                mysql> select * from t2;
                                +------------+--------+
                                | id1        | id2    |
                                +------------+--------+
                                | 0000000002 | 000002 |
                                +------------+--------+
                                1 row in set (0.00 sec)

                        ===浮点数类型测试:float

                                作用:用于存储用户的身高、体重、薪水等

                                浮点数和定点数都可以用类型名称后加(M,D)的方式来表示,
(M,D)表示一共显示M位数字(总数位+小数位),
其中D位于小数点后面,M和D又称为精度和标度。

                                LAB1:(浮点数float)

                                        浮点数float类型测试

                                        1 创建一个表

                                        mysql> create table test4(float_test float(5,2));//一共5位,小数占2位,整数3位
                                        Query OK, 0 rows affected (0.00 sec)

                                        2 查询表结构

                                        mysql> desc test4;
                                        +------------+------------+------+-----+---------+-------+
                                        | Field      | Type       | Null | Key | Default | Extra |
                                        +------------+------------+------+-----+---------+-------+
                                        | float_test | float(5,2) | YES  |     | NULL    |       | 
                                        +------------+------------+------+-----+---------+-------+
                                        1 row in set (0.00 sec)

                                        float(5,2)
                                        5是整数加小数的总长
,                                       2是小数长度。
                                        整数意味只有3位长度。

                                        3 插入合法数据,非法数据

                                        mysql> insert into test4 values (10.2), (70.243), (70.246);
                                        Query OK, 3 rows affected (0.00 sec)
                                        Records: 3  Duplicates: 0  Warnings: 0

                                        4 查询表内容

                                        mysql> select * from test4;
                                        +------------+
                                        | float_test |
                                        +------------+
                                        |      10.20 | 
                                        |      70.24 | 
                                        |      70.25 | 
                                        +------------+
                                        3 rows in set (0.00 sec)

                                        5 插入非法数据

                                        mysql> insert into test4 values (1111.2);
                                        ERROR 1264 (22003): Out of range value for column 'float_test' at row 1

                                LAB2:(精准小数decimal)

                                        定点数decimal类型测试:

                                        定点数在MySQL内部以字符串形式存储,比浮点数更精确,
适合用来表示货币等精度高的数据。
decimal在不指定精度时,默认的整数位为10,默认的小数位为0

                                        1 创建一个表

                                        mysql>  create table test5(decimal_test decimal(5,2));

                                        2 插入数据

                                        mysql> insert into test5 values (70.245);
                                        Query OK, 1 row affected, 1 warning (0.05 sec)

                                         注意有警告        超长部分不记录。会四舍五入

                                        mysql>  select * from test5;

                                        3 请思考如何创建整数9位,小数5位的数据类型

                                        

                                区别

                                         三者的区别介绍

                                        float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位,小数点占一位)

                                        double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位)

                                        decimal:数字型,128bit,常用于银行帐目计算。(28个有效位)

                        ===时间和日期类型测试:year、date、time、datetime、timestamp

                                作用:用于存储用户的注册时间,文章的发布时间,文章的更新时间,员工的入职时间等

                                LAB1:(日期,时间)

                                        

                                LAB2:(当前时间)(了解)

                                        

                                LAB3:(年)        年YEAR类型测试

                                

                        ===字符串类型测试:CHAR、VARCHAR

                                LAB1:(字符、变长字符)

                                        作用 :用于存储用户的姓名、爱好、发布的文章等

                                        注意        CHAR        列的长度固定为创建表时声明的长度: 0 ~ 255

                                                       VARCHAR  列中的值为可变长字符串,长度: 0 ~ 65535

                                                CHAR的长度是固定的
                                                VARCHAR长度是可以变化的
                                                固定与可变是针对存储介质(硬盘)来说的
                                                假如:
                                                CHAR和VARCHAR的默认长度都设为10,两个字段都分别写入  “abc”
                                                CHAR       损耗了硬盘10字节 = “abc”长度 + 7个空字符
                                                VARCHAR损耗了硬盘 3字节 = “abc”长度
                                                设定默认值n(假如是 10 ) 则该字段内能写入的字符串长度最大只能为 10

                                                在检索的时候,CHAR列删除了尾部的空格,而VARCHAR则保留这些空格

                                        1 创建表

                                                create table vc (
                                                v varchar(4),
                                                 c char(4));

                                        2 查看表结构

                                                mysql> desc vc;
                                               +-------+------------+------+-----+---------+-------+
                                                | Field | Type       | Null | Key | Default | Extra |
                                                +-------+------------+------+-----+---------+-------+
                                                | v     | varchar(4) | YES  |     | NULL    |       |
                                                | c     | char(4)    | YES  |     | NULL    |       |
                                                +-------+------------+------+-----+---------+-------+
                                                 2 rows in set (0.00 sec)

                                        3 插入数据

                                                mysql> insert into vc values('a','a');
                                                Query OK, 1 row affected, 1 warning (0.00 sec)

                                                mysql> insert into vc values('ab  ','ab ');
                                                Query OK, 1 row affected, 1 warning (0.00 sec)

                                        4 查询表内容

                                                mysql> select * from vc;
                                                +------+------+
                                                | v    | c    |
                                                +------+------+
                                                | a   | a   |
                                                | ab   | ab   |
                                                +------+------+
                                                1 row in set (0.00 sec)

                                         5 调动函数

                                                

                                LAB2:(了解)(二进制字符)

                                        前言        

二进制字符串 类型包括:binary、varbinary、blob,主要是处理图像、视频、音频等文件,与字符集无关。

这类文件一般是放在服务器硬盘里,而不是数据库里,如果要放在数据库,就一定不能指定字符集类型,否则会把二进制字段转换成相应的非二进制字符,图像和视频就不能正常显示了

                                        关于非二进制字符串

               非二进制字符串类型:包括:char、varchar、text,主要用于处理文本格式的文件

 字符集就是一堆字符的集合,字符集的编码格式主要有以下几种:

1、utf-8:基于unicode编码(万国码),国际标准化组织制定的一套包含了世界上所有编码类型的字符,如果一个网页上想同时显示简体、繁体以及其他地区的一些字符,就可以使用utf8编码。每个字符的长度是1-3个字节,比如说【a】是一个字节,【盾】是3个字节。

2、gb2312:简体字,包含6700多个汉字,每个汉字相当于2个字节,每个英文单词相当于1个字节。

3、gbk:简体字和繁体字,包含21000多个汉字,由中国内地编写的编码库,每个汉字相当于2个字节,每个英文单词相当于1个字节。

4、big5:繁体字,包含13000多个汉字,也叫大五码,每个汉字相当于2个字节,每个英文单词相当于1个字节。

字符串类型测试:BINARY、VARBINARY
BINARY 和 VARBINARY类似于CHAR 和 VARCHAR,
不同的是它们包含二进制字符,而不包含非二进制字符串

mysql> create table binary_t (c binary(3));
Query OK, 0 rows affected (0.03 sec)

mysql> desc      binary_t;
+-------+-----------+------+-----+---------+-------+
| Field | Type      | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| c     | binary(3) | YES  |     | NULL    |       |
+-------+-----------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into binary_t set c='aaa';
Query OK, 1 row affected (0.00 sec)

mysql> select *,hex(c) from binary_t;
+------+--------+
| c    | hex(c) |
+------+--------+
| aaa  | 616161 |
+------+--------+
1 row in set (0.00 sec)

set解释

在标准的SQL语句中,一次插入一条记录的INSERT语句只有一种形式。
INSERT INTO tablename(列名…) VALUES(列值);

而在MySQL中还有另外一种形式。
INSERT INTO tablename SET column_name1 = value1, column_name2 = value2,…;
 

第一种方法将列名和列值分开了,在使用时,列名必须和列值的数一致。如下面的语句向users表中插入了一条记录:

INSERT INTO users(id, name, age) VALUES(123, '姚明', 25);

第二种方法允许列名和列值成对出现和使用,如下面的语句将产生中样的效果。

INSERT INTO users SET id = 123, name = '姚明', age = 25;

616161解释        a是字符的话,对应ascII码是97,则二进制为01100001,转成16进制为61

                        ===枚举类型、集合类型:ENUM类型,SET测试

                        LAB1:(单选、多选)

                        作用        字段的值只能在给定范围中选择

                                        enum  单选      只能在给定的范围内选一个值,如性别 sex 男male/女female

                                        set         多选    在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)

                        目标

                        

                        1 创建表

                         use school
                         create table student3(
                         name varchar(50),
                         sex enum('m','f'),
                         hobby set('music','book','game','disc') );

                        2 查看表结构

                         

                        3 插入数据

                        mysql> insert into student3 values  ('tom','m','book,game');
Query OK, 1 row affected (0.00 sec)

                        4 查询数据

                        

                 5 插入非法数据

                        mysql>  insert into student3 values ('jack','m','film');
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1

        3.DDL-表

                创表目的

                        表是数据库存储数据的基本单位,

                        表由若干个字段(列)组成,

                        主要用来存储数据记录(行)。

              操作数据库实例1

                        创建1列的表格-序号

                        创库        create    database    haha;

                        使用库        use    haha;

                        创表1        创建  表格  表名t1  (列名id   类型int );

                                         CREATE  TABLE    t1    (id int);

                        查看所有表名        show   tables;

                        插入数据        插入  到   表名t1   值  (1);

                                              INSERT   INTO    t1  VALUES   (1);

                        查询所有数据        查询  所有列   从   表名t1

                                                      SELECT  *  FROM  t1;

                        删除表                drop   table  t1;

                操作数据库实例2

                     创两列的表格-序号和姓名

                        创建  表格  表名t2  (第一列名id   数字类型,  第二列名name   字符类型(长度))

                        create   table        t2            (id           int,           name             varchar(20));

                        查看表结构

                        描述  表t2

                        desc t2;

                        总结

                        mysql> show tables;        查看表名

                        mysql> select * from t2;        后续讲解。看表中的内容

                        mysql> desc  t2;                查看表结构

                        

                     插入数据

                        插入  到  表t2    值  (第一列信息,第二列信息);

                        INSERT     INTO      t2   VALUES (1,"zhangsan");

                        注意

                        数字不能加引号

                        字符必须加引号(转义符)

                

                    查询所有数据

                        select   *   from   t2;

操作数据库实例3

                1.创建表

                

                2.查看表名

                

                3.表中插入内容

                

                4.查看表内容

                mysql> select * from student1;        查询表中所有字段的值

                5.查看表结构

                

                        

          


版权声明:本文为qq_39462824原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。