zoukankan      html  css  js  c++  java
  • mysql 详解

    1. 数据库介绍

    什么是数据库?

    数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,
    每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
    我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
    所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
    RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
    1.数据以表格的形式出现
    2.每行为各种记录名称
    3.每列为记录名称所对应的数据域
    4.许多的行和列组成一张表单
    5.若干的表单组成database

    RDBMS 术语 

    在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:

    • 数据库: 数据库是一些关联表的集合。.
    • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
    • 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
    • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
    • 冗余:存储两倍数据,冗余可以使系统速度更快。(表的规范化程度越高,表与表之间的关系就越多;查询时可能经常需要在多个表之间进行连接查询;而进行连接操作会降低查询速度。例如,学生的信息存储在student表中,院系信息存储在department表中。通过student表中的dept_id字段与department表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中查找学生所在院系的编号(dept_id),然后根据这个编号去department查找系的名称。如果经常需要进行这个操作时,连接查询会浪费很多的时间。因此可以在student表中增加一个冗余字段dept_name,该字段用来存储学生所在院系的名称。这样就不用每次都进行连接操作了。)
    • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
    • 外键:外键用于关联两个表。
    • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
    • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
    • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

    Mysql数据库

    Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

    • Mysql是开源的,所以你不需要支付额外的费用。
    • Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
    • MySQL使用标准的SQL数据语言形式。
    • Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
    • Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言。
    • MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
    • Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。

    2. MYSQ数据库的安装使用

    Linux/UNIX上安装Mysql

    Linux平台上推荐使用RPM包来安装Mysql,MySQL AB提供了以下RPM包的下载地址:

    • MySQL - MySQL服务器。你需要该选项,除非你只想连接运行在另一台机器上的MySQL服务器。
    • MySQL-client - MySQL 客户端程序,用于连接并操作Mysql服务器。
    • MySQL-devel - 库和包含文件,如果你想要编译其它MySQL客户端,例如Perl模块,则需要安装该RPM包。
    • MySQL-shared - 该软件包包含某些语言和应用程序需要动态装载的共享库(libmysqlclient.so*),使用MySQL。
    • MySQL-bench - MySQL数据库服务器的基准和性能测试工具。

    以下安装Mysql RMP的实例是在SuSE Linux系统上进行,当然该安装步骤也适合应用于其他支持RPM的Linux系统,如:Centos。

    安装步骤如下:

    使用root用户登陆你的Linux系统。

    Window上安装Mysql

    Window上安装Mysql相对来说会较为简单,你只需要载 MySQL 下载中下载window版本的mysql安装包,并解压安装包。

    双击 setup.exe 文件,接下来你只需要安装默认的配置点击"next"即可,默认情况下安装信息会在C:mysql目录中。

    接下来你可以通过"开始" =》在搜索框中输入 " cmd" 命令 =》 在命令提示符上切换到 C:mysqlin 目录,并输入一下命令

    mysqld.exe --console

    如果安装成功以上命令将输出一些mysql启动及InnoDB信息。

    验证Mysql安装

    在成功安装Mysql后,一些基础表会表初始化,在服务器启动后,你可以通过简单的测试来验证Mysql是否工作正常。

    使用 mysqladmin 工具来获取服务器状态:

    使用 mysqladmin 命令俩检查服务器的版本,在linux上该二进制文件位于 /usr/bin on linux ,在window上该二进制文件位于C:mysqlin 。

    [root@host]# mysqladmin --version

    使用 MySQL Client(Mysql客户端) 执行简单的SQL命令

    你可以在 MySQL Client(Mysql客户端) 使用 mysql 命令连接到Mysql服务器上,默认情况下Mysql服务器的密码为空,所以本实例不需要输入密码。

    命令如下:

    [root@host]# mysql

    以上命令执行后会输出 mysql>提示符,这说明你已经成功连接到Mysql服务器上,你可以在 mysql> 提示符执行SQL命令:

    mysql> SHOW DATABASES;
    +----------+
    | Database |
    +----------+
    | mysql    |
    | test     |
    +----------+
    2 rows in set (0.13 sec)

    Mysql安装后需要做的

    Mysql安装成功后,默认的root用户密码为空,你可以使用以下命令来创建root用户的密码:

    [root@host]# mysqladmin -u root password "new_password";

    现在你可以通过以下命令来连接到Mysql服务器:

    [root@host]# mysql -u root -p
    Enter password:*******

    注意:在输入密码时,密码是不会显示了,你正确输入即可。

    Linux系统启动时启动 MySQL

    如果你需要在Linux系统启动时启动 MySQL 服务器,你需要在 /etc/rc.local 文件中添加以下命令:

    /etc/init.d/mysqld start

     查看user表

    use mysql;
    desc user;

    mysql字段  no null 代表这个字段不能为空 必须有数值 

    查看数据表数据

    select * from userG

    新添加一个新用户

    GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    
    # 授权所有
    grant all on *.* to 'alex'@'%' identified by '123456'; 

    查看对用户授权的命令

    mysql> show grants  for alex;
    +--------------------------------------------------------------------------------------------------------------+
    | Grants for alex@%                                                                                            |
    +--------------------------------------------------------------------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'alex'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
    +--------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    管理MySQL的命令

    以下列出了使用Mysql数据库过程中常用的命令:

    • USE 数据库名 :选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。

    • SHOW DATABASES: 列出 MySQL 数据库管理系统的数据库列表。

    • SHOW TABLES: #显示指定数据库的所有表,使用该命令前需要使用 use命令来选择要操作的数据库。

    • SHOW COLUMNS FROM 数据表: #显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。

    • create database testdb charset "utf8"; #创建一个叫testdb的数据库,且让其支持中文 

    • drop database testdb; #删除数据库

    • SHOW INDEX FROM 数据表:显示数据表的详细索引信息,包括PRIMARY KEY(主键)。

    默认数据库 不支持中文 支持中文 create database minger charset utf8;

    mysql> show create database minger ;
    +----------+-----------------------------------------------------------------+
    | Database | Create Database                                                 |
    +----------+-----------------------------------------------------------------+
    | minger   | CREATE DATABASE `minger` /*!40100 DEFAULT CHARACTER SET utf8 */ |
    +----------+-----------------------------------------------------------------+
    1 row in set (0.00 sec)

    4. MySQL 数据类型

    MySQL中定义数据字段的类型对你数据库的优化是非常重要的。

    MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

    数值类型

    MySQL支持所有标准SQL数值数据类型。

    这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

    关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

    BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

    作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

    类型

    大小

    范围(有符号)

    范围(无符号)

    用途

    TINYINT

    1 字节

    (-128,127)

    (0,255)

    小整数值

    SMALLINT

    2 字节

    (-32 768,32 767)

    (0,65 535)

    大整数值

    MEDIUMINT

    3 字节

    (-8 388 608,8 388 607)

    (0,16 777 215)

    大整数值

    INT或INTEGER

    4 字节

    (-2 147 483 648,2 147 483 647)

    (0,4 294 967 295)

    大整数值

    BIGINT

    8 字节

    (-9 233 372 036 854 775 808,9 223 372 036 854 775 807)

    (0,18 446 744 073 709 551 615)

    极大整数值

    FLOAT

    4 字节

    (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)

    0,(1.175 494 351 E-38,3.402 823 466 E+38)

    单精度
    浮点数值

    DOUBLE

    8 字节

    (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

    0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

    双精度
    浮点数值

    DECIMAL

    对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2

    依赖于M和D的值

    依赖于M和D的值

    小数值

    日期和时间类型

    表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

    每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

    TIMESTAMP类型有专有的自动更新特性,将在后面描述。

    类型大小
    (字节)
    范围格式用途
    DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
    TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
    YEAR 1 1901/2155 YYYY 年份值
    DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
    TIMESTAMP 4 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

      

    字符串类型

    字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

    类型大小用途
    CHAR 0-255字节 定长字符串
    VARCHAR 0-65535 字节 变长字符串
    TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
    TINYTEXT 0-255字节 短文本字符串
    BLOB 0-65 535字节 二进制形式的长文本数据
    TEXT 0-65 535字节 长文本数据
    MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
    MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
    LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
    LONGTEXT 0-4 294 967 295字节 极大文本数据

    CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

    BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

    BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

    有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

    5. mysql 常用命令

    MySQL 创建数据表

    语法

    CREATE TABLE table_name (column_name column_type);

    创建一个student表

    create table student(
       stu_id INT NOT NULL AUTO_INCREMENT, # int 不为空 自动调增
       name CHAR(32) NOT NULL, # 32字节 不为空
       age  INT NOT NULL, # int 不为空
       register_date DATE, 
       PRIMARY KEY ( stu_id )  # 设置stu_id 为主键
    );

    实例解析:

    • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
    • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
    • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。

    查看表结构

    desc student;

    MySQL 插入数据

    语法

    INSERT INTO table_name ( field1, field2,...fieldN )
                           VALUES
                           ( value1, value2,...valueN );

    插入数据

    mysql> insert into student (name,age,register_date) values ("liming",22,"2016-03-4")
        -> ;
    mysql> select * from student;

    MySQL 查询数据

    语法

    SELECT column_name,column_name
    FROM table_name
    [WHERE Clause]
    [OFFSET M ][LIMIT N]
    • 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
    • SELECT 命令可以读取一条或者多条记录。
    • 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
    • 你可以使用 WHERE 语句来包含任何条件。
    • 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
    • 你可以使用 LIMIT 属性来设定返回的记录数。

    offset 要与  limit 一起用  limit在前面 offset在后面

    mysql> select * from student limit 2 offset 1;
    +----+------+-----+---------------+
    | id | name | age | register_date |
    +----+------+-----+---------------+
    |  2 | abc  |  22 | 2017-03-04    |
    |  3 | abc  |  22 | 2017-03-04    |
    +----+------+-----+---------------+
    2 rows in set (0.00 sec)

    MySQL where 子句

    mysql> select * from student where id > 2 ;
    +----+------+-----+---------------+
    | id | name | age | register_date |
    +----+------+-----+---------------+
    |  3 | abc  |  22 | 2017-03-04    |
    |  4 | ming |  22 | 2017-03-04    |
    +----+------+-----+---------------+
    2 rows in set (0.00 sec)

    下表中实例假定 A为10 B为20

    操作符描述实例
    = 等号,检测两个值是否相等,如果相等返回true (A = B) 返回false。
    <>, != 不等于,检测两个值是否相等,如果不相等返回true (A != B) 返回 true。
    > 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true (A > B) 返回false。
    < 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true (A < B) 返回 true。
    >= 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true (A >= B) 返回false。
    <= 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true (A <= B) 返回 true。

      

    使用主键来作为 WHERE 子句的条件查询是非常快速的。

    mysql> select * from student where id > 2 and age < 20 ;
    +----+------+-----+---------------+
    | id | name | age | register_date |
    +----+------+-----+---------------+
    |  7 | ben  |  10 | 2017-03-04    |
    +----+------+-----+---------------+
    1 row in set (0.00 sec)
    mysql> select * from student where register_date like "2017-03%" ;
    +----+------+-----+---------------+
    | id | name | age | register_date |
    +----+------+-----+---------------+
    |  1 | ming |  22 | 2017-03-04    |
    |  2 | abc  |  22 | 2017-03-04    |
    |  3 | abc  |  22 | 2017-03-04    |
    |  4 | ming |  22 | 2017-03-04    |
    |  5 | ming |  40 | 2017-03-04    |
    |  6 | mike |  40 | 2017-03-04    |
    |  7 | ben  |  10 | 2017-03-04    |
    +----+------+-----+---------------+
    7 rows in set, 1 warning (0.00 sec)

    MySQL UPDATE 修改

    mysql> update student set name="xiaoming",age=50 where id=2;
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from student ;
    +----+----------+-----+---------------+
    | id | name     | age | register_date |
    +----+----------+-----+---------------+
    |  1 | ming     |  22 | 2017-03-04    |
    |  2 | xiaoming |  50 | 2017-03-04    |
    |  3 | abc      |  22 | 2017-03-04    |
    |  4 | ming     |  22 | 2017-03-04    |
    |  5 | ming     |  40 | 2017-03-04    |
    |  6 | mike     |  40 | 2017-03-04    |
    |  7 | ben      |  10 | 2017-03-04    |
    |  8 | jen      |  10 | 2017-05-04    |
    +----+----------+-----+---------------+
    8 rows in set (0.00 sec)

    MySQL DELETE 语句

    mysql> delete from student where name="ming" ; 
    Query OK, 3 rows affected (0.01 sec)
    
    mysql> 
    mysql> select * from student ;
    +----+----------+-----+---------------+
    | id | name     | age | register_date |
    +----+----------+-----+---------------+
    |  2 | xiaoming |  50 | 2017-03-04    |
    |  3 | abc      |  22 | 2017-03-04    |
    |  6 | mike     |  40 | 2017-03-04    |
    |  7 | ben      |  10 | 2017-03-04    |
    |  8 | jen      |  10 | 2017-05-04    |
    +----+----------+-----+---------------+
    5 rows in set (0.00 sec)

    MySQL 排序

    SELECT field1, field2,...fieldN table_name1, table_name2...
    ORDER BY field1, [field2...] [ASC [DESC]]
    使用 ASCDESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
    select *from student where name like binary "%Li" order by stu_id desc;
    mysql> select * from student order by id ;
    +----+----------+-----+---------------+
    | id | name     | age | register_date |
    +----+----------+-----+---------------+
    |  2 | xiaoming |  50 | 2017-03-04    |
    |  3 | abc      |  22 | 2017-03-04    |
    |  6 | mike     |  40 | 2017-03-04    |
    |  7 | ben      |  10 | 2017-03-04    |
    |  8 | jen      |  10 | 2017-05-04    |
    +----+----------+-----+---------------+
    5 rows in set (0.00 sec)
    
    mysql> select * from student order by id desc ;
    +----+----------+-----+---------------+
    | id | name     | age | register_date |
    +----+----------+-----+---------------+
    |  8 | jen      |  10 | 2017-05-04    |
    |  7 | ben      |  10 | 2017-03-04    |
    |  6 | mike     |  40 | 2017-03-04    |
    |  3 | abc      |  22 | 2017-03-04    |
    |  2 | xiaoming |  50 | 2017-03-04    |
    +----+----------+-----+---------------+
    5 rows in set (0.00 sec)

    MySQL GROUP BY 语句

    SELECT column_name, function(column_name)
    FROM table_name
    WHERE column_name operator value
    GROUP BY column_name;

    类似excel 分类分组统计

    mysql> select * from student ;
    +----+-----------+-----+---------------+
    | id | name      | age | register_date |
    +----+-----------+-----+---------------+
    |  2 | xiaoming  |  50 | 2017-03-04    |
    |  3 | abc       |  22 | 2017-03-04    |
    |  6 | mike      |  40 | 2017-03-04    |
    |  7 | ben       |  10 | 2017-03-04    |
    |  8 | jen       |  10 | 2017-05-04    |
    |  9 | huangshan |  10 | 2017-06-04    |
    | 10 | huangshan |  22 | 2017-07-04    |
    | 11 | xiaoming  |  10 | 2017-06-04    |
    | 12 | xiaoming  |  15 | 2017-06-04    |
    | 13 | 小红      |  10 | 2017-06-04    |
    | 14 | 小红      |  15 | 2017-07-04    |
    | 15 | 小红      |  20 | 2017-07-05    |
    +----+-----------+-----+---------------+
    12 rows in set (0.00 sec)

    接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:

    mysql> select name,count(*) from student group by name ;
    +-----------+----------+
    | name      | count(*) |
    +-----------+----------+
    | abc       |        1 |
    | ben       |        1 |
    | huangshan |        2 |
    | jen       |        1 |
    | mike      |        1 |
    | xiaoming  |        3 |
    | 小红      |        3 |
    +-----------+----------+
    7 rows in set (0.00 sec)
    将数据表按日期进行分组,并统计每个人有多少条记录:
    mysql> select register_date,count(*) from student group by register_date; +---------------+----------+ | register_date | count(*) | +---------------+----------+ | 2017-03-04 | 4 | | 2017-05-04 | 1 | | 2017-06-04 | 4 | | 2017-07-04 | 2 | | 2017-07-05 | 1 | +---------------+----------+ 5 rows in set (0.00 sec)

    mysql> select register_date,count(*) as stu_num from student group by register_date; +---------------+---------+ | register_date | stu_num | +---------------+---------+ | 2017-03-04 | 4 | | 2017-05-04 | 1 | | 2017-06-04 | 4 | | 2017-07-04 | 2 | | 2017-07-05 | 1 | +---------------+---------+ 5 rows in set (0.00 sec)

    统计

    分组 统计每组每个人的年龄总共加起来多少

    mysql> select name,sum(age) from student group by name ;
    +-----------+----------+
    | name      | sum(age) |
    +-----------+----------+
    | abc       |       22 |
    | ben       |       10 |
    | huangshan |       32 |
    | jen       |       10 |
    | mike      |       40 |
    | xiaoming  |       75 |
    | 小红      |       45 |
    +-----------+----------+
    7 rows in set (0.19 sec)

    加上总数totail值

    其中记录 NULL 表示所有人的登录次数。<br>
    我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法
    mysql> select coalesce(name, "Total age") , sum(age) from student group by name with rollup ;
    +-----------------------------+----------+
    | coalesce(name, "Total age") | sum(age) |
    +-----------------------------+----------+
    | abc                         |       22 |
    | ben                         |       10 |
    | huangshan                   |       32 |
    | jen                         |       10 |
    | mike                        |       40 |
    | xiaoming                    |       75 |
    | 小红                        |       45 |
    | Total age                   |      234 |
    +-----------------------------+----------+
    8 rows in set (0.07 sec)

    MySQL ALTER命令 

    我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令

    删除,添加或修改表字段

    alter table student drop register_date; #从student表删除register_date   字段alter table student add phone int(11) not null; #添加phone字段

    添加sex性别字段

    mysql> alter table student add sex    enum("M","F")   ;
    Query OK, 12 rows affected (0.07 sec)
    Records: 12  Duplicates: 0  Warnings: 0
    
    mysql> 
    mysql> 
    mysql> select * from student ;
    +----+-----------+-----+---------------+------+
    | id | name      | age | register_date | sex  |
    +----+-----------+-----+---------------+------+
    |  2 | xiaoming  |  50 | 2017-03-04    | NULL |
    |  3 | abc       |  22 | 2017-03-04    | NULL |
    |  6 | mike      |  40 | 2017-03-04    | NULL |
    |  7 | ben       |  10 | 2017-03-04    | NULL |
    |  8 | jen       |  10 | 2017-05-04    | NULL |
    |  9 | huangshan |  10 | 2017-06-04    | NULL |
    | 10 | huangshan |  22 | 2017-07-04    | NULL |
    | 11 | xiaoming  |  10 | 2017-06-04    | NULL |
    | 12 | xiaoming  |  15 | 2017-06-04    | NULL |
    | 13 | 小红      |  10 | 2017-06-04    | NULL |
    | 14 | 小红      |  15 | 2017-07-04    | NULL |
    | 15 | 小红      |  20 | 2017-07-05    | NULL |
    +----+-----------+-----+---------------+------+
    12 rows in set (0.00 sec)
    mysql> insert into student(name,age,register_date,sex) values("小黑",25,"2015-10-22","M");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> 
    mysql> select * from student ;
    +----+-----------+-----+---------------+------+
    | id | name      | age | register_date | sex  |
    +----+-----------+-----+---------------+------+
    |  2 | xiaoming  |  50 | 2017-03-04    | NULL |
    |  3 | abc       |  22 | 2017-03-04    | NULL |
    |  6 | mike      |  40 | 2017-03-04    | NULL |
    |  7 | ben       |  10 | 2017-03-04    | NULL |
    |  8 | jen       |  10 | 2017-05-04    | NULL |
    |  9 | huangshan |  10 | 2017-06-04    | NULL |
    | 10 | huangshan |  22 | 2017-07-04    | NULL |
    | 11 | xiaoming  |  10 | 2017-06-04    | NULL |
    | 12 | xiaoming  |  15 | 2017-06-04    | NULL |
    | 13 | 小红      |  10 | 2017-06-04    | NULL |
    | 14 | 小红      |  15 | 2017-07-04    | NULL |
    | 15 | 小红      |  20 | 2017-07-05    | NULL |
    | 16 | 小黑      |  25 | 2015-10-22    |      |
    | 17 | 小黑      |  25 | 2015-10-22    | M    |
    +----+-----------+-----+---------------+------+
    14 rows in set (0.00 sec)

    修改字段类型及名称

    如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

    修改数据类型 sex 为 not null

    mysql> alter table student modify sex    enum("M","F") not null  ;
    Query OK, 14 rows affected, 14 warnings (0.10 sec)
    Records: 14  Duplicates: 0  Warnings: 14
    
    mysql> 
    mysql> 
    mysql> desc student ;
    +---------------+---------------+------+-----+---------+----------------+
    | Field         | Type          | Null | Key | Default | Extra          |
    +---------------+---------------+------+-----+---------+----------------+
    | id            | int(11)       | NO   | PRI | NULL    | auto_increment |
    | name          | char(32)      | NO   |     | NULL    |                |
    | age           | int(11)       | NO   |     | NULL    |                |
    | register_date | date          | YES  |     | NULL    |                |
    | sex           | enum('M','F') | NO   |     | NULL    |                |
    +---------------+---------------+------+-----+---------+----------------+
    5 rows in set (0.00 sec)

    删除sex字段

    mysql> alter table student drop sex ;
    Query OK, 14 rows affected (0.02 sec)
    Records: 14  Duplicates: 0  Warnings: 0
    
    mysql> 
    mysql> 
    mysql> select * from student ;
    +----+-----------+-----+---------------+
    | id | name      | age | register_date |
    +----+-----------+-----+---------------+
    |  2 | xiaoming  |  50 | 2017-03-04    |
    |  3 | abc       |  22 | 2017-03-04    |
    |  6 | mike      |  40 | 2017-03-04    |
    |  7 | ben       |  10 | 2017-03-04    |
    |  8 | jen       |  10 | 2017-05-04    |
    |  9 | huangshan |  10 | 2017-06-04    |
    | 10 | huangshan |  22 | 2017-07-04    |
    | 11 | xiaoming  |  10 | 2017-06-04    |
    | 12 | xiaoming  |  15 | 2017-06-04    |
    | 13 | 小红      |  10 | 2017-06-04    |
    | 14 | 小红      |  15 | 2017-07-04    |
    | 15 | 小红      |  20 | 2017-07-05    |
    | 16 | 小黑      |  25 | 2015-10-22    |
    | 17 | 小黑      |  25 | 2015-10-22    |
    +----+-----------+-----+---------------+
    14 rows in set (0.00 sec)

    关于主键

    外键,一个特殊的索引,用于关键2个表,只能是指定内容

    stu_id 与另外一张表的 id 关联

    create table `study_record` (  
    `id` int(11) NOT null , 
    `day` int not null, 
    `status` char(32) not null, 
    `stu_id` int(11) not null , 
    primary key (`id`), 
    key `fk_student_key` (`stu_id`), 
    constraint `fk_student_key` foreign key (`stu_id`) references `student` (`id`)) ;
    mysql> desc study_record ;
    +--------+----------+------+-----+---------+-------+
    | Field  | Type     | Null | Key | Default | Extra |
    +--------+----------+------+-----+---------+-------+
    | id     | int(11)  | NO   | PRI | NULL    |       |
    | day    | int(11)  | NO   |     | NULL    |       |
    | status | char(32) | NO   |     | NULL    |       |
    | stu_id | int(11)  | NO   | MUL | NULL    |       |
    +--------+----------+------+-----+---------+-------+
    4 rows in set (0.00 sec)
    mysql> show create table study_recordG
    *************************** 1. row ***************************
           Table: study_record
    Create Table: CREATE TABLE `study_record` (
      `id` int(11) NOT NULL,
      `day` int(11) NOT NULL,
      `status` char(32) NOT NULL,
      `stu_id` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `fk_student_key` (`stu_id`),
      CONSTRAINT `fk_student_key` FOREIGN KEY (`stu_id`) REFERENCES `student` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.05 sec)
    mysql> select * from student ;
    +----+-----------+-----+---------------+-----+
    | id | name      | age | register_date | sex |
    +----+-----------+-----+---------------+-----+
    |  1 | xiaobai   |  25 | 2015-10-22    | M   |
    |  2 | xiaoming  |  50 | 2017-03-04    |     |
    |  3 | abc       |  22 | 2017-03-04    |     |
    |  4 | liyang    |  25 | 2015-10-22    | M   |
    |  6 | mike      |  40 | 2017-03-04    |     |
    |  7 | ben       |  10 | 2017-03-04    |     |
    |  8 | jen       |  10 | 2017-05-04    |     |
    |  9 | huangshan |  10 | 2017-06-04    |     |
    | 10 | huangshan |  22 | 2017-07-04    |     |
    | 11 | xiaoming  |  10 | 2017-06-04    |     |
    | 12 | xiaoming  |  15 | 2017-06-04    |     |
    | 13 | 小红      |  10 | 2017-06-04    |     |
    | 14 | 小红      |  15 | 2017-07-04    |     |
    | 15 | 小红      |  20 | 2017-07-05    |     |
    | 16 | 小黑      |  25 | 2015-10-22    |     |
    | 17 | 小黑      |  25 | 2015-10-22    |     |
    +----+-----------+-----+---------------+-----+
    16 rows in set (0.00 sec)
    
    
    mysql> insert into study_record (day,status,stu_id) values (1,'Yes',1);
    Query OK, 1 row affected, 1 warning (0.01 sec)
    mysql> select * from study_record ;
    +----+-----+--------+--------+
    | id | day | status | stu_id |
    +----+-----+--------+--------+
    |  0 |   1 | Yes    |      1 |
    +----+-----+--------+--------+
    1 row in set (0.00 sec)

    因为 之前创建study_record 表 id 没有添加自增ID 修改 id 数据类型加上 自增字段

    mysql> alter table study_record modify id int auto_increment;
    Query OK, 1 row affected (0.02 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    mysql> 
    mysql> 
    mysql> select * from study_record ;
    +----+-----+--------+--------+
    | id | day | status | stu_id |
    +----+-----+--------+--------+
    |  1 |   1 | Yes    |      1 |
    +----+-----+--------+--------+
    1 row in set (0.00 sec)
    
    
    
    mysql> insert into study_record (day,status,stu_id) values (1,'Yes',2);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> 
    mysql> 
    mysql> insert into study_record (day,status,stu_id) values (1,'NO',3);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> 
    mysql> select * from study_record ;
    +----+-----+--------+--------+
    | id | day | status | stu_id |
    +----+-----+--------+--------+
    |  1 |   1 | Yes    |      1 |
    |  2 |   1 | Yes    |      2 |
    |  3 |   1 | NO     |      3 |
    +----+-----+--------+--------+
    3 rows in set (0.00 sec)

    根据数据库完整性 外键的表没有20这个字段  不能添加

    mysql> insert into study_record (day,status,stu_id) values (1,'NO',20);
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`minger`.`study_record`, CONSTRAINT `fk_student_key` FOREIGN KEY (`stu_id`) REFERENCES `student` (`id`))

    不能删除是因为 ‘1’ 已经被  study_record 表 调用 

    mysql> delete from student where id='1';
    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`minger`.`study_record`, CONSTRAINT `fk_student_key` FOREIGN KEY (`stu_id`) REFERENCES `student` (`id`))

    MySQL NULL 值处理  

    我们已经知道MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。
    为了处理这种情况,MySQL提供了三大运算符:
    IS NULL: 当列的值是NULL,此运算符返回true。
    IS NOT NULL: 当列的值不为NULL, 运算符返回true。
    <=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true。
    关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
    在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。
    MySQL中处理NULL使用IS NULL和IS NOT NULL运算符。

    6. 事务

    MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

    • 在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
    • 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
    • 事务用来管理insert,update,delete语句

    一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

    • 1、事务的原子性:一组事务,要么成功;要么撤回。
    • 2、稳定性 : 有非法数据(外键约束之类),事务撤回。
    • 3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
    • 4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里
    mysql> select * from student ;
    +----+-----------+-----+---------------+-----+
    | id | name      | age | register_date | sex |
    +----+-----------+-----+---------------+-----+
    |  1 | xiaobai   |  25 | 2015-10-22    | M   |
    |  2 | xiaoming  |  50 | 2017-03-04    |     |
    |  3 | abc       |  22 | 2017-03-04    |     |
    |  4 | liyang    |  25 | 2015-10-22    | M   |
    |  6 | mike      |  40 | 2017-03-04    |     |
    |  7 | ben       |  10 | 2017-03-04    |     |
    |  8 | jen       |  10 | 2017-05-04    |     |
    |  9 | huangshan |  10 | 2017-06-04    |     |
    | 10 | huangshan |  22 | 2017-07-04    |     |
    | 11 | xiaoming  |  10 | 2017-06-04    |     |
    | 12 | xiaoming  |  15 | 2017-06-04    |     |
    | 13 | 小红      |  10 | 2017-06-04    |     |
    | 14 | 小红      |  15 | 2017-07-04    |     |
    | 15 | 小红      |  20 | 2017-07-05    |     |
    | 16 | 小黑      |  25 | 2015-10-22    |     |
    | 17 | 小黑      |  25 | 2015-10-22    |     |
    +----+-----------+-----+---------------+-----+
    16 rows in set (0.01 sec)
    
    
    
    mysql> begin; #开始一个事务
    
    mysql> insert into student(name,age,register_date) values("yaoming",25,"2015-10-22");
    Query OK, 1 row affected (0.00 sec)
    
    mysql> 
    mysql> insert into student(name,age,register_date) values("jack",65,"2016-10-22");
    Query OK, 1 row affected (0.00 sec)
    
    
    ---+-----------+-----+---------------+-----+
    | id | name      | age | register_date | sex |
    +----+-----------+-----+---------------+-----+
    |  1 | xiaobai   |  25 | 2015-10-22    | M   |
    |  2 | xiaoming  |  50 | 2017-03-04    |     |
    |  3 | abc       |  22 | 2017-03-04    |     |
    |  4 | liyang    |  25 | 2015-10-22    | M   |
    |  6 | mike      |  40 | 2017-03-04    |     |
    |  7 | ben       |  10 | 2017-03-04    |     |
    |  8 | jen       |  10 | 2017-05-04    |     |
    |  9 | huangshan |  10 | 2017-06-04    |     |
    | 10 | huangshan |  22 | 2017-07-04    |     |
    | 11 | xiaoming  |  10 | 2017-06-04    |     |
    | 12 | xiaoming  |  15 | 2017-06-04    |     |
    | 13 | 小红      |  10 | 2017-06-04    |     |
    | 14 | 小红      |  15 | 2017-07-04    |     |
    | 15 | 小红      |  20 | 2017-07-05    |     |
    | 16 | 小黑      |  25 | 2015-10-22    |     |
    | 17 | 小黑      |  25 | 2015-10-22    |     |
    | 18 | yaoming   |  25 | 2015-10-22    | M   |
    | 19 | jack      |  65 | 2016-10-22    | M 
    
    
    mysql>rollback; 回滚 , 这样数据是不会写入的
    
    
    mysql> select * from student ;
    +----+-----------+-----+---------------+-----+
    | id | name      | age | register_date | sex |
    +----+-----------+-----+---------------+-----+
    |  1 | xiaobai   |  25 | 2015-10-22    | M   |
    |  2 | xiaoming  |  50 | 2017-03-04    |     |
    |  3 | abc       |  22 | 2017-03-04    |     |
    |  4 | liyang    |  25 | 2015-10-22    | M   |
    |  6 | mike      |  40 | 2017-03-04    |     |
    |  7 | ben       |  10 | 2017-03-04    |     |
    |  8 | jen       |  10 | 2017-05-04    |     |
    |  9 | huangshan |  10 | 2017-06-04    |     |
    | 10 | huangshan |  22 | 2017-07-04    |     |
    | 11 | xiaoming  |  10 | 2017-06-04    |     |
    | 12 | xiaoming  |  15 | 2017-06-04    |     |
    | 13 | 小红      |  10 | 2017-06-04    |     |
    | 14 | 小红      |  15 | 2017-07-04    |     |
    | 15 | 小红      |  20 | 2017-07-05    |     |
    | 16 | 小黑      |  25 | 2015-10-22    |     |
    | 17 | 小黑      |  25 | 2015-10-22    |     |
    +----+-----------+-----+---------------+-----+
    16 rows in set (0.00 sec)

    回滚数据 但是id还是会递增

    当然如果上面的数据没问题,就输入commit提交命令就行

    7.索引  

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

    打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

    索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

    创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。 

    实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

    上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

    普通索引

    创建索引

    这是最基本的索引,它没有任何限制。它有以下几种创建方式

    CREATE INDEX indexName ON mytable(username(length)); 

    如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

    修改表结构

    ALTER mytable ADD INDEX [indexName] ON (username(length))

    创建表的时候直接指定

    CREATE TABLE mytable( 
      
    ID INT NOT NULL,  
      
    username VARCHAR(16) NOT NULL, 
      
    INDEX [indexName] (username(length)) 
      
    ); 

    删除索引的语法

    DROP INDEX [indexName] ON mytable;
  • 相关阅读:
    poj 3321 Apple Tree
    hdu 1520 Anniversary party
    Light OJ 1089 Points in Segments (II)
    Timus 1018 Binary Apple Tree
    zoj 3299 Fall the Brick
    HFUT 1287 法默尔的农场
    Codeforces 159C String Manipulation 1.0
    GraphQL + React Apollo + React Hook 大型项目实战(32 个视频)
    使用 TypeScript & mocha & chai 写测试代码实战(17 个视频)
    GraphQL + React Apollo + React Hook + Express + Mongodb 大型前后端分离项目实战之后端(19 个视频)
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/7670517.html
Copyright © 2011-2022 走看看