mySQL

  1. </pre><pre name="code" class="sql"><pre name="code" class="sql">1 数据库概述  
  2.     简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在的Oracle、SQLServer、MySQL等诸多优秀的数据库。  
  3.       
  4.     详解内容:  
  5.         数据存储方式  
  6.         数据库在开发中的作用  
  7.         数据库访问技术  
  8.         MySQL数据库的介绍  
  9.         数据库泛型  
  10.         SQL语言  
  11.         常见数据库系统  
  12.         如果学习数据库  
  13.       
  14.     1.1 数据库理论基础  
  15.         数据库能够将数据按照特定的规律组织起来。那么,数据是如何存储的、数据库要遵守什么规则、数据库在什么地方使用,这些都是首先要了解的问题。  
  16.           
  17.         1.1.1 数据存储方式  
  18.             如今数据库已经无处不在了。  
  19.             一个网站需要有数据库来存储数据。  
  20.             一个学校需要用数据库来存储学生和教师的信息。  
  21.             一个公司需要用数据库来存储员工的信息和公司的资料。  
  22.               
  23.             要学习数据库,必须先了解数据库是如何存储数据的。  
  24.   
  25.             数据发展分为三个阶段:  
  26.                 1. 人工管理阶段  
  27.                 2. 文件系统阶段  
  28.                 3. 数据库系统阶段  
  29.         1.1.2 数据库泛型  
  30.               
  31.             数据库泛型就是数据库应该遵循的规则。数据库泛型也称为范式。目前关系数据库最常用的四种范式分别是:  
  32.                     第一范式(1NF)  
  33.                     第二范式(2NF)  
  34.                     第三范式(3NF)  
  35.                     BCN范式(BCNF)  
  36.   
  37.             在设计数据库时,数据库需要满足的最低要求的范式是第一范式。第一范式的要求表中不能有重复字段,并且每个字段不能再拆分。如果有一个数据库连第一范式都不满足的话,那就不能称之为关系型数据库了。只有满足了第一范式的要求,才可能在这个关系数据库中创建表。  
  38.   
  39.             在满足第一范式的基础上,可以将数据库中进行一步的细化。细化后可以使数据库满足第二范式的要求。依次进行细化,可以得到第三范式、BCN范式。  
  40.         1.1.3 数据库在开发中作用  
  41.             现在大部分的管理系统和软件都需要使用数据库来存储数据。在开发过程中,数据库已经成为必不可少的一部分。本小节将为读者简单介绍一下数据库在开发中的作用。  
  42.   
  43.             在软件开发过程中,经常需要使用数据库来存储数据。比如,一个学校的学生管理系统就需要数据库来存储学生的学籍信息、考试信息、教师的信息、课程信息等。再比如,银行的管理系统也需要数据库来存储信息。用户的银行帐户、存款量、存款和取款的记录等信息都是存储在数据库中的。当用户向自己的帐户里存款时,管理系统会在数据库中更新该用户的存款量。  
  44.               
  45.       
  46.     1.2 数据库系统  
  47.         1.2.1 数据库系统  
  48.             很多读者认为数据库就是数据库系统(DataBase System, 简称为DBS)。其实,数据库系统的范围比数据库大很多。数据库系统不是一个单纯的数据库,而是由数据库、数据库管理系统、应用开发工具构成。很多时候,数据库管理员和用户可以当成数据库系统的一份子。  
  49.   
  50.             数据库就是存储数据的地方。  
  51.             数据库管理系统(DataBase Management System, 简称为DBMS)是用来定义数据、管理和维护数据的软件。它是数据库系统的一个重要组成部分。应用系统是需要使用数据库的软件。比如学员管理系统就是一个应用系统,这个应用系统需要数据库管理它的数据。应用开发工具就是用来开发应用系统的。  
  52.   
  53.         1.2.2 SQL语言  
  54.             SQL(Structured Query Language)语言的全称是结构化查询语言。数据库管理系统通过SQL语言来管理数据库中的数据。  
  55.               
  56.             SQL语言分为三个部分:  
  57.                 数据定义语言(Data Definition Language, 简称为DDL)  
  58.                 数据操作语言(Data Manipulation Language, 简称为DML)  
  59.                 数据控制语言(Data Control Language, 简称为DCL)  
  60.           
  61.         1.2.3 数据库访问技术  
  62.             应用程序中,程序语言需要使用数据库访问技术来访问数据库。只有使用了数据库访问技术,程序中嵌入的SQL语句才会起作用。不同程序语言访问数据库的方式是不一样的。  
  63.   
  64.             JDBC是一种用于执行SQL语句的Java API。通过JDBC可以访问多种关系数据库。JDBC由一组用Java语言编写的类和接口组成。使用JDBC时,必须要安装驱动程序Connector/J。  
  65.   
  66.             PHP中为程序员提供了MySQL功能模块,PHP5以后开始提供mysqli接口。PHP可以通过MySQL功能模块和mysqli接口来访问MySQL数据库。  
  67.       
  68.     1.3 常见数据库  
  69.         1.3.1 常见数据库系统  
  70.             如今已经在很多优秀的商业数据库  
  71.             如甲骨文(Oracle)公司的Oracle数据库  
  72.             IBM公司的DB2数据库  
  73.             微软公司的SQL Server数据库和Access数据库。  
  74.             还有很多优秀的开源数据库,如MySQL数据库、PostgreSQL数据库等。  
  75.   
  76.             1. 甲骨文的Oracle  
  77.             2. IBM的DB2  
  78.             3. 微软的Access和SQL Server  
  79.             4. 开源PostgreSQL  
  80.             6. 开源MySQL  
  81.           
  82.         1.3.2 为什么要使用MySQL  
  83.             如今很多大型网站已经选择MySQL数据库来存储数据。那么,MySQL到底有什么优势呢?MySQL数据库的使用非常广泛,尤其是在Web应用方面。由于MySQL数据库发展势头迅猛,SUN公司于2008年收购了MySQL数据库。这笔交易的收购价格高达10亿美元。这中以说明MySQL数据库价值。  
  84.                 MySQL数据库的优势:  
  85.                     1. 开源代码  
  86.                     2. 跨平台性  
  87.                     3. 价格优势  
  88.                     4. 功能强大且使用方便  
  89.         1.3.3 MySQL版本和获取  
  90.             MySQL数据库可以在Windows、UNIX、Linux和Mac OS等操作系统上运行。因此,MySQL有不同操作系统的版本。而且,根据发布的先后顺序,现在已经在开发MySQL的6.0版了。  
  91.               
  92.             根据MySQL的开发情况,可以将MySQL分为Alpha、Beta、Gamma和Generally Available(GA)等版本。  
  93.                 - Alpha(开发过程中)  
  94.                 - Beta(测试版)  
  95.                 - Gamma(比Beta版更高级)  
  96.                 - Generally Available(GA)(稳定版)  
  97.       
  98.     1.4 如果学习数据库  
  99.         数据库已经成为软件系统的一部分,那么学好数据库将是软件开发的一个必要条件。如何才能学好数据库,这个问题没有确切的答案。  
  100.             学好数据库的方法:  
  101.                 1. 多上机实践  
  102.                 2. 多编写SQL语句  
  103.                 3. 通过Java或PHP程序语言操作数据库  
  104.                 4. 数据库理论知识不能丢  
  105.       
  106.     1.5 常见问题及解答  
  107.         1. 如何选择数据库?  
  108.         2. 如何选择MySQL版本?  
  109.   
  110.     1.6 本章习题  
  111.         1. 数据存储的发展过程经历了哪几个阶段?  
  112.         2. 常用数据库系统有哪些?  
  113.         3. MySQL数据库如何分类?  
  114.   
  115. 2 Windows平台下安装与配置MySQL  
  116.     在Windows系列的操作系统下,MySQL数据库的安装包分为图形化界面安装和免安装(noinstall)这两种安装包。这两种安装包的安装方式不同,而且配置方式也不同。图形化界面安装包有完整的安装向导,安装和配置很方便。免安装的安装包直接解压即可使用,但是配置起来很不方便。  
  117.         安装MySQL数据库  
  118.         配置MySQL数据库  
  119.         常用图形管理工具介绍  
  120.         配置和使用免安装的MySQL数据库  
  121.       
  122.     2.1 安装与配置MySQL  
  123.         2.1.1 安装MySQL  
  124.             MySQL图形化安装包有一个完整的安装向导,根据安装向导可以很方便的安装MySQL数据库。在Windows操作系统下,有两种MySQL图形化安装包。这两种安装包分别是"Windows Essentials""Windows MSI Installer"。前者包含了MySQL中最主要和最常用的功能,但是不包含一些不常用的功能。后者包含了MySQL全部功能,包括不常用的功能。  
  125.                 http://dev.mysql.com/downloads/mysql/#downloads  
  126.                 选择Microsoft Windows选项  
  127.   
  128.                 mysql-5.1.40-win32.msi(图形界面安装)  
  129.                 mysql-essential-5.1.40-win32.msi (图形界面安装)  
  130.                 mysql-noinstall-5.1.40-wind32.zip (免安装)  
  131.                   
  132.                 安装步骤:  
  133.                     1. Next  
  134.                     2. Typical Complete Custom(O)  
  135.                     3. MySQL Server  
  136.                        Client Programs  
  137.                        C Includes Files / Lib Files(X)  
  138.                        Change: ?????  
  139.                     4. Install  
  140.                         Setup Type: Custom  
  141.                         Destination Folder(程序安装路径):   
  142.                         Data Folder(数据存储的路径):  
  143.                     5. Next->Next->  
  144.                         (O)Configure the MySQL Serer now  
  145.                         (O)Register the MySQL Server now  
  146.   
  147.                     6. Finish  
  148.         2.1.2 配置MySQL  
  149.             安装完成时,选上了Configure the MySQL Server now选项,图形化安装向导将进入MySQL配置欢迎界面。通过配置向导,可以设置MySQL数据库的各种参数。     
  150.               
  151.             1. Next  
  152.             2. (O)Detailed Configuration  
  153.                            (X)Standard Configuration  
  154.             3. (O)Developer Machine(开发者)  
  155.                Server Machine(服务器)  
  156.                Dedicated MySQL Server Machine(专用的数据库服务器)  
  157.             4. (O)Multifunctional Database(多功能型数据库)  
  158.                Transactional Database Only(事务型的数据库, InnoDB)  
  159.                Non-Transactional Database Only(只支持MyISaM类型数据库,非事务)  
  160.             5. InnoDB Tablespace Settings (配置表空间)  
  161.             6. 设置服务器的连接数  
  162.                 Decision Support(DSS) / OLAP  
  163.                 Online Transaction Processing(OLTP)  
  164.                 (O)Manual Setting  
  165.                     Concurrent Connections: 10  
  166.             7. MySQL服务的端口号:  
  167.                 (O)Add firewall exception for this port(允许防火墙)  
  168.                 (X)Enable Strict Mode(是区分大写)          
  169.             8. 设置字符集  
  170.                 Standard Character Set  
  171.                 Best Support for Multilingualism  
  172.                 (O)Manual Selected Default Character Set / Collation  
  173.                     utf-8  
  174.             9. Install As Windws Service 服务选项  
  175.                 Service Name: MySQL  
  176.                 (O)Lanch the MySQL Server automatically(服务是否自动启动)  
  177.                 (O)Include Bin Directory in Windows PATH(添加到path路径当中)  
  178.             10. Modify Security Setting:  
  179.                 New root password:   
  180.                 confirm:  
  181.                 (X)Enable root access from remote machines(不否远程访问root)  
  182.                   
  183.             11. Execute  
  184.             12. Finish  
  185.     2.2 启动服务并登录MySQL数据库  
  186.         MySQL数据库分为服务器端(Server)和客户端(Client)两部分。只有服务器端的服务开户以后,才可以通过客户端来登录到MySQL数据库。  
  187.           
  188.         2.2.1 启动MySQL服务  
  189.                   
  190.             开始->设置->控制面板->管理工具->服务  
  191.           
  192.         2.2.2 登录MySQL服务器  
  193.             1. 开始->运行->cmd  
  194.                       
  195.                 mysql -h localhost -u root -p  
  196.                 mysql>  
  197.   
  198.             2. 开始->运行->mysql -h 127.0.0.1 -u root -p  
  199.           
  200.         2.2.3 配置path变量  
  201.             如果MySQL的应用程序的目录没有添加到Windows系统的path环境变量中,可以手工的将MySQL的目录添加到path中。  
  202.                   
  203.   
  204.             将MySQL的应用程序的目录添加到Windows系统的path环境变量中,可以使以后的操作更加方便。例如,可以直接从运行对话框输入MySQL数据库命令。而且,以后在编程时也会更加方便。配置path路径很简单,只要将MySQL的应用程序的目录添加到系统的path环境变量中就可以了。  
  205.                 1. 右击【我的电脑】->【属性】  
  206.                 2. 在系统环境变量中选中path变量,然后单击编辑按钮进入编辑环境变量的对话框。  
  207.                 3. 把MySQL应用程序的目录添加到path环境变量名值的后面。已经存在的目录用分号隔开。  
  208.     2.3 更改MySQL的配置  
  209.         MySQL数据库安装好了以后,可能根据实际情况更改MySQL的某些配置。一般可以通过两种方式来更改。一种是通过配置向导来更改配置,另一种是手工来更改配置。  
  210.           
  211.         2.3.1 通过配置向导来更改配置  
  212.             MySQL Server Instance Config Wizard与初始配置时  
  213.             1.Reconfigure Instance (修改配置信息)  
  214.               Remove Instance (删除配置信息)  
  215.             2.Detailed Configuration  
  216.             ......  
  217.             .....  
  218.   
  219.         2.3.2 手工更改配置  
  220.             用户可以通过修改MySQL配置文件方式来进行配置。这种配置方式更加灵活,但是相对初学者来说比较困难。  
  221.   
  222.             在进行手工配置之前,需要对MySQL的文件有所了解。MySQL的文件安装在?????  
  223.             数据库的数据文件安装在?????  
  224.   
  225.             bin 可执行目录  
  226.             data    数据目录  
  227.             scripts   
  228.             share   字符集目录  
  229.               
  230.             mysql.ini       基本配置文件  
  231.             my-huge.ini     配置大型数据库  
  232.             my-large.ini        ..  
  233.             my-innodb-heavy-4g  配置innodb  
  234.             my-medium.ini       中型数据库配置文件  
  235.             my-small.ini        小型数据库配置文件  
  236.             my-template.ini     配置文件模板  
  237.   
  238.   
  239.             mysql.ini:  
  240.                 port = 3306         # 端口号  
  241.                 default-character-set = gbk # 默认的字符集  
  242.                 basedir = ....          # 安装文件夹  
  243.                 datadir = .....                 # 数据库文件夹  
  244.                 default-storage-engine = INNODB # 默认的存储引擎  
  245.                   
  246.     2.4 MySQL常用图形管理工具  
  247.         MySQL图形管理工具可以在图形界面上操作MySQL数据库。在命令行中操作MySQL数据库时,需要使用很多的命令。而图形管理工具则只是使用鼠标点即可,这使MySQL数据库的操作更加简单。  
  248.   
  249.         MySQL的图形管理工具很多。常用的有MySQL GUI Toools、phpMyAdmin、Navicat等。通过这些图像管理工具,可以使MySQL的管理更加方便。每种图形管理工具各有特点。  
  250.               
  251.             1. MySQL GUI Tools  
  252.             2. phpMyAdmin  
  253.             3. Navicat  
  254.             4. SQLyog  
  255.             5. MySQLDumper  
  256.             6. MySQL ODBC/Connector  
  257.               
  258.     2.5 使用免安装MySQL  
  259.         Windows操作系统下有免安装的MySQL软件包。用户直接解压这个软件包,进行简单的配置就可以使用了。免安装包省略了安装过程,使用起来也很方便。  
  260.               
  261.         1. 解压软件包  
  262.         2. 创建my.ini文件  
  263.         3. 修改my.ini文件  
  264.             [mysqld]  
  265.             socket ....  
  266.   
  267.             basedir = "c:/mysql/"  
  268.             datadir = "c:/mysql/data"  
  269.               
  270.             [WindowsMySQLServer]  
  271.             Server = "c:/mysql/bin/mysqld.exe"  
  272.             * my.ini文件复制到C:/WINDOWS文件夹  
  273.         4. 设置MySQL服务  
  274.             c:/mysql/bing/mysqld.exe --install  
  275.         5. 配置系统Path变量  
  276.         6. 启动和关闭服务  
  277.             运行服务:运行-> net start mysql 启动服务  
  278.                      net stop mysql  停止服务  
  279.     2.6 上机操作  
  280.         1. 通过图形化方式安装MySQL数据库  
  281.         2. 配置免安装的MySQL  
  282.     2.7 常见问题及解答  
  283.         1. 如何选择字符集?  
  284.         2. 如何删除MySQL数据库?  
  285.     2.8 习题  
  286.         1. 练习使用图形化安装MySQL数据库。  
  287.         2. 练习使用配置向导配置MySQL数据库。  
  288.         3. 练习使用免安装的MySQL软件包安装。  
  289.         4. 练习通过手工修改my.ini文件的方式更改配置。  
  290.   
  291. 3.Linux平台下安装与配置MySQL  
  292.     在Linux系列的操作系统下,一般都使用命令来安装MySQL数据库。因为Linux操作系统的发行版比较多,所以相应的MySQL版本也比较多。相同Linux发行版也有不同的MySQL软件包。根据自己的操作系统的版本来下载和安装不同的MySQL版本。  
  293.       
  294.     - Linux操作系统下的MySQL版本介绍  
  295.     - 安装和配置MySQL的RPM包  
  296.     - 安装和配置MYSQL的二进制包  
  297.     - 安装和配置MySQL的源码包  
  298.       
  299.     3.1 Linux操作系统下的MySQL版本介绍  
  300.         Linux操作系统的发行版很多,不同Linux发行版的MySQL版本是不同的。MySQL数据库主要支持Linux版本是Red Hat Enterprise Linux和SUSE Linux Enterprise Server。这两个版本下也有不同的安装包。  
  301.   
  302.         Linux操作系统的MySQL软件包一般分为三类,分别是RPM软件包,二进制软件包和源码包。  
  303.             RPM软件包:  
  304.             二进制包:  
  305.             源码包:  
  306.   
  307.             1. Red Hat Enterprise Linux发行版  
  308.             2. SUSE LInux Enterprise Server发行版  
  309.   
  310.             Linux版本         推荐安装的MySQL版本  
  311.             Red Hat Enterprise Linux    RPM软件包  
  312.             SUSE Linux Enterprise Server    RPM软件包  
  313.             Fedora              RPM软件包  
  314.             Ubuntu              源码包  
  315.             CentOS              RPM软件包  
  316.     3.2 安装和配置MySQL的RPM包  
  317.         大部分Linux版本的MySQL软件是以RPM包的形式发布的。RPM包的安装和卸载都很方便,通过简单的命令就可以实现RPM包的安装与卸载。可能通过手工修改配置文件的方式来进行配置。  
  318.   
  319.         MySQL官方网站下载RPM包,http://dev/mysql.com/downloads/mysql/5.1.html。在该网站上有很多种类的RPM安装包,根据自己的操作系统和处理器类型来选择。  
  320.         Red Hat Enterprise Linux 5 RPM(x86)  
  321.     3.3 安装和配置MySQL的二进制包  
  322.         Linux操作系统下有以二进制形式发布的MySQL软件包。这些二进制的MySqL软件包比RPM包要灵活,但是安装没有RPM包那么容易。  
  323.         http://dev/mysql.com/downloads/mysql/5.1.html。    
  324.         单击Linux(non RPM packages)链接,就可跳转到下载二进制包的位置。  
  325.     3.4 安装和配置MySQL的源码包  
  326.         Linux操作系统下有以源码的形式发布的MySQL软件包。这样软件包中是MySQL的源代码,需要用户自己进行编译。这种MySQL软件包的灵活性最高,用户可以根据自己的需要进行控制。而且, 感兴趣的用户可以查看MySQL的源代码。但是编译代码耗费的时候比较长。  
  327.         http://dev.mysql.com/downloads/mysql/5.1.html  
  328.         单击Source链接,就可以跳转到下载源码包的位置。  
  329.     3.5 上机实践  
  330.         1. 在Linux操作系统下用RPM包来安装MySQL数据库  
  331.         2. 在Linux操作每户下用二进制包安装MySQL数据库  
  332.         3. 在Linux操作系统下用源码包来安装MySQL数据库  
  333.     3.6 常见问题及解答  
  334.         1. 如何选择Linux操作系统下的MySQL数据库?  
  335.         2. Linux下如何卸载MySQL数据库?  
  336.     3.7 本意习题  
  337.         1. 练习使用RPM软件包安装MySQL数据库。  
  338.         2. 练习使用二进制软件包安装MySQL数据库。  
  339.         3. 练习使用源码包安装MySQL数据库。  
  340.         4. 练习手动配置MySQL的配置文件。  
  341.   
  342. 4. MySQL数据类型  
  343.     数据类型是数据的一种属性,其可以决定数据存储格式、有效范围和相应的限制。MySQL的数据类型包括整数类型、浮点数类型、定点数类型、日期和时间类型、字符串类型和二进制类型。  
  344.         - 整数类型、浮点数类型和定点数类型  
  345.         - 日期与时间类型  
  346.         - 字符串类型  
  347.         - 二进制类型  
  348.         - 如何选择数据类型  
  349.   
  350.     4.1 MySQL数据类型介绍  
  351.         MySQL数据库提供了多种数据类型。不同的类型有各自的特点,使用范围不相同。而且,存储方式也不一样。  
  352.   
  353.         4.1.1 整数类型  
  354.             整数类型是数据库中最基本的数据类型。标准SQL中支持INTEGERSMALLINT这两种整数类型。MySQL数据库除了支持这两种类型外,还扩展支持了TINYINT、MEDIUMINT和BIGInT。  
  355.                 各种整数类型的取值范围、存储的字节数、特点。  
  356.   
  357.             整数类型    字节数 无符号数的取值范围   有符号数的取值范围  
  358.             TINYINT     1   0~255           -128~127  
  359.             SMALLINT    2   0~65535         -32768~12767  
  360.             MEDIUMINT   3   0~16777215      -8388608~8388607  
  361.             INT     4   0~4294967295        -2147483648~2147483647  
  362.             INTEGER     4   0~4294967295        -2147483648~2147483647    
  363.             BIGINT      8   0~18446744073709551615  -9223372036954775808~9223372036854775807  
  364.   
  365.             MySQL命令不区分大小写,通常使用大写表示MySQL关键字,使用小写表示用户定义的值。  
  366.   
  367.             例如:  
  368.                 mysql -h localhost -u root -p  
  369.                 USE `databasename`;  
  370.                 DESC `tablename`;  
  371.   
  372.                 MySQ整数类型默认长度  
  373.                     1. tinyint(4)  
  374.                     2. smallint(6)  
  375.                     3. mediumint(9)  
  376.                     4. int(11)  
  377.                     5. bigint(20)  
  378.   
  379.                 Mysql注释支持以下几种:  
  380.                     1、#  
  381.                     2、--  
  382.                     3、/* */  
  383.                   
  384.                 实例一:  
  385.                     # 如果数据库中不存在test数据库,则创建test数据库。  
  386.                     CREATE DATABASE IF NOT EXISTS `test`;  
  387.   
  388.                     -- 选择数据库  
  389.                     USE `test`;  
  390.                       
  391.                     /* 如果test数据库中不存在int_tbl_1表,则创建int_tbl_1表 */  
  392.                     CREATE TABLE  IF NOT EXISTS `test`.`int_tbl_1` (  
  393.                         `a` TINYINT,  
  394.                         `b` SMALLINT,  
  395.                         `c` MEDIUMINT,  
  396.                         `d` INT,  
  397.                         `e` BIGINT  
  398.                     );  
  399.                     INSERT INTO `test`.`int_tbl_1` VALUES(1,1,1,1,1);  
  400.                     INSERT INTO `test`.`int_tbl_1` VALUES(2,2,2,2,2);  
  401.                     INSERT INTO `test`.`int_tbl_1` VALUES(3,3,3,3,3);  
  402.                     INSERT INTO `test`.`int_tbl_1` VALUES(4,4,4,4,4);  
  403.                     INSERT INTO `test`.`int_tbl_1` VALUES(5,5,5,5,5);  
  404.                     SELECT * FROM `int_tbl_1`;  
  405.                 实例二:  
  406.                     CREATE TABLE  IF NOT EXISTS `test`.`int_tbl_2` (  
  407.                         `a` TINYINT UNSIGNED ZEROFILL NOT NULL ,  
  408.                         `b` SMALLINT UNSIGNED ZEROFILL NOT NULL ,  
  409.                         `c` MEDIUMINT UNSIGNED ZEROFILL NOT NULL ,  
  410.                         `d` INT UNSIGNED ZEROFILL NOT NULL ,  
  411.                         `e` BIGINT UNSIGNED ZEROFILL NOT NULL  
  412.                     );  
  413.   
  414.                     INSERT INTO `test`.`int_tbl_2` VALUES(1,1,1,1,1);  
  415.                     INSERT INTO `test`.`int_tbl_2` VALUES(2,2,2,2,2);  
  416.                     INSERT INTO `test`.`int_tbl_2` VALUES(3,3,3,3,3);  
  417.                     INSERT INTO `test`.`int_tbl_2` VALUES(4,4,4,4,4);  
  418.                     INSERT INTO `test`.`int_tbl_2` VALUES(5,5,5,5,5);         
  419.                     SELECT * FROM `int_tbl_2`;  
  420.   
  421.                     使用UNSIGNED或UNSIGNED ZEROFILL之后MySQ整数类型默认长度:  
  422.                         1. tinyint(3)  
  423.                         2. smallint(5)  
  424.                         3. mediumint(8)  
  425.                         4. int(10)  
  426.                         5. bigint(19)  
  427.                 实例三:                      
  428.                     CREATE TABLE  IF NOT EXISTS `test`.`int_tbl_3` (  
  429.                         `a` INT(4) NOT NULL ,  
  430.                         `b` INT(11) NOT NULL  
  431.                     ) ENGINE = INNODB;  
  432.                     INSERT INTO `test`.`int_tbl_3` VALUES(111111,22222222);  
  433.                     SELECT * FROM `int_tbl_3`;  
  434.                     -- 数据111111成功插入到字段a中,不管字段a长度是设置了多少。因为INT类型的默认最大长度为11,因此即使插入的数据超出了指定长度的范围,也会插入到数据表中。  
  435.             如何为字段选择整数类型?  
  436.                 1. TINYINT : 如果字段的最大值不超过255,那选择TINYINT类型就足够了。  
  437.                 2. INT: 如果需要范围比较大的值,使用INT类型即可。如会员表中的编号字段等。  
  438.           
  439.         4.1.2 浮点数类型和定点数类型  
  440.             MySQL使用浮点数类型和定点数类型来表示小数。浮点数类型包括单精度浮点数(FLOAT类型)和双精度浮点数(DOUBLE类型)。定点数类型就是DECIMAL型。  
  441.               
  442.             FLOAT型、DOUBLE型、DECIMAL型的取值范围、存储的字节数、特点。  
  443.               
  444.             小数类型    字节数 负数取值范围          无符号取值范围  
  445.             FLOAT       4   -3.402823466E+38~       0和1.175494351E-38~  
  446.                         -1.175494351E-38        3.402823466E+38  
  447.               
  448.             DOUBLE      8   1.7976931348623157E+308~    0和2.2250738585072014E~  
  449.                         -2.2250738585072014E-308    1.7976931348623157E+308  
  450.             DECIMAL(M,D)    M+2 DOUBLE型         同DOUBLE型  
  451.             或DEC(M,D)     
  452.               
  453.             M:最大长度(包括小数部分,但不包括小数点)  
  454.             D:小数点后保留长度   
  455.             FLOAT(6,2)表示数据长度为6个,小数点保留2位。1234.56符合要求。  
  456.   
  457.             如果插入值的精度高于实际定义的精度,系统会自动进行四舍五入处理,使值的精度达到要求。不同的是,FLOAT型和DOUBLE型在四舍五入时不会报错,而DECIMAL型会警告。     
  458.             实例一:  
  459.                 CREATE TABLE  IF NOT EXISTS `test`.`decimal_tbl_1` (  
  460.                     `a` FLOAT(6,2),  
  461.                     `b` DOUBLE(6,2),  
  462.                     `c` DECIMAL(6,2)  
  463.                 ) ENGINE = MyISAM;  
  464.   
  465.                 INSERT INTO `test`.`decimal_tbl_1` VALUES(3.143, 3.145, 3.1434);      
  466.                 SHOW WARNINGS;  -- 查看警告  
  467.                 # DECIMAL型有警告  
  468.                 SELECT * FROM `decimal_tbl_1`;  
  469.               
  470.             如果不指定精度,浮点数和定点数有其默认的精度。FLOAT型和DOUBLE型默认会保存实际精度,但这与操作系统和硬件的精度有关。DECIMAL型默认整数位为10,小位位为0,即默认为整数。  
  471.             实例二:  
  472.                 CREATE TABLE  IF NOT EXISTS `test`.`decimal_tbl_2` (  
  473.                     `a` FLOAT,  
  474.                     `b` DOUBLE,  
  475.                     `c` DECIMAL  
  476.                 ) ENGINE = MyISAM;  
  477.   
  478.                 INSERT INTO `test`.`decimal_tbl_2` VALUES(3.143, 3.145, 3.1434);      
  479.                 SHOW WARNINGS;  -- 查看警告  
  480.                 SELECT * FROM `decimal_tbl_2`;        
  481.               
  482.             在MySQL中,定点数以字符串形式存储。因此,其精度比浮点数要高。而且,浮点数会出现误差,这是浮点数一起存在的缺陷。如果要对数据的精度要求比较高,还是选择定点数(DECIMAL)比较安全。    
  483.           
  484.         4.1.3 日期和时间类型  
  485.             日期和时间类型是为了方便在数据库中存储日期和时间而设计的。MySQL中有多种表示日期和时间的数据类型。其中,YEAR类型表示年份;DATE类型表示日期;TIME类型表示时间;DATETIME和TIMESTAMP表示日期和时间。  
  486.               
  487.             日期和时间类型的存储字节数、取值范围和特点   
  488.               
  489.             1. YEAR类型  
  490.             2. TIME类型  
  491.             3. DATE类型  
  492.             4. DATETIME类型  
  493.             5. TIMESTAMP类型  
  494.   
  495.             4.1.3.1 YEAR类型  
  496.                   
  497.                 (1) 使用4位字符串或数字表示。  
  498.                     使用字节    取值范围    输入格式        超出范围  
  499.                     1       1901~2155   YYYY | 'YYYY' | "YYYY"  0000  
  500.                     实例一:  
  501.                         CREATE TABLE  IF NOT EXISTS `test`.`year_tbl_1`(`a` YEAR);  
  502.                         INSERT INTO `test`.`year_tbl_1` VALUES(1997),('1998'),("1990"),(2200);    
  503.                         SELECT * FROM `year_tbl_1`;  
  504.                   
  505.                 (2) 使用2位整数或字符串表示。'00'"69"转换为2000到2069,'70'"99"转换为1970到1999。例如输入'35'YEAR值会转换为2035;输入'90'YEAR值会转换为1990。  
  506.                     '0'"00"的效果是一样的。  
  507.                     实例二:  
  508.                         INSERT INTO `test`.`year_tbl_1` VALUES('24'),("86"),("0"),('00');     
  509.                         SELECT * FROM `year_tbl_1`;  
  510.                         INSERT INTO `test`.`year_tbl_1` VALUES(50),(0);  
  511.                       
  512.                     注意:插入0,转换后的YEAR值不是2000,而是0000。  
  513.                     因为YEAR类型只占一个字节。如果只需要记录年份,选择YEAR类型可以节约空间。  
  514.             4.1.3.2 TIME类型  
  515.                 类型  字节  表示形式    取值范围  
  516.                 TIME    3   HH:MM:SS    '-839:59:59''838:59:59'  
  517.                         HH:时  
  518.                         MM:分(0~59)  
  519.                         SS:秒(0~59)   
  520.                 (1)'D HH:MM:SS' 格式的字符串表示。其中,D表示天数,取值范围是0~34。保存时,小时的值等于(D*24+HH)。例如,输入'2 11:30:50',TIME类型会转换为59:30:50。当然输入时可以不严格按照这个格式,也可以是"HH:MM:SS""HH:MM""D HH:MM""D HH"或者"SS"等形式。例如,输入'30'TIME类型会转化为00:00:30。  
  521.                     实例一:  
  522.                         向表中插入"2 23:50:50"'22:22:22''11:11''2 20:20''2 20' 和 '30'  
  523.   
  524.                         CREATE TABLE  IF NOT EXISTS `test`.`time_tbl_1`(`a` TIME);  
  525.                         INSERT INTO `test`.`time_tbl_1` VALUES ("2 23:50:50"), ('22:22:22'), ('11:11'), ('2 20:20'), ('2 20'), ('30');    
  526.                         SELECT * FROM `time_tbl_1`;  
  527.                 (2) 'HHMMSS'格式的字符串或者HHMMSS格式的数值表示。例如,输入'345454'TIME类型会转化为34:54:54,TIME类型会转化为34:54:54。如果输入0和'0',那么TIME类型会转化为0000:00:00。  
  528.                     实例二:  
  529.                         INSERT INTO `test`.`time_tbl_1` VALUES (121212), ('131313'), ('0'),(0);  
  530.                         SELECT * FROM `time_tbl_1`;               
  531.                 (3) 使用CURRENT_TIME或者NOW()输入当前系统时间。  
  532.                     实例三:  
  533.                         INSERT INTO `test`.`time_tbl_1` VALUES (CURRENT_TIME),(NOW());  
  534.                         SELECT * FROM `time_tbl_1`;  
  535.                 TIME类型专门用来存储时间数据,而且只占3个字节。如果只需要记录时间,选择TIME类型是最合适的。  
  536.                   
  537.             4.1.3.3 DATE类型  
  538.                 类型  字节数     显示形式    取值范围    赋值方式  
  539.                 DATE    4       YYYY-MM-DD  '1000-01-01'    'YYYY-MM-DD'或  
  540.                                     到'9999-12-31'   'YYYYMMDD'  
  541.                 (1) MySQL中支持一些不严格的语法格式,任何标点都可以用来做间隔符。如'YYYY/MM/DD''YYYY@MM@DD''YYYY.MM.DD'等分隔形式。  
  542.                 实例一:      
  543.                     CREATE TABLE  IF NOT EXISTS `test`.`date_tbl_1`(`a` DATE);  
  544.                     INSERT INTO `test`.`date_tbl_1`   
  545.                     VALUES ('1949-10-01'), ('1950#2#3'),('1951@3@4'),('19520101');    
  546.                     SELECT * FROM `date_tbl_1`;   
  547.                 (2) 'YY-MM-DD'或者'YYMMDD'格式的字符串表示。其中'YY'的取值,'00''69'转换为2000到2069,'70''99'转换为1970到1999.与YEAR类型类似,例如,输入'35-01-02',DATE类型将转换为2035-01-02;输入'800102',DATE类型将转换为1980-01-02。  
  548.                 MySQL也支持一些不严格的语法格式,如'YY/MM/DD''YY@MM@DD''YY.MM.DD'等分隔形式。例如,输入'89@3@8'DATE类型转换为1989-03-08。  
  549.                 实例二:  
  550.                     INSERT INTO `test`.`date_tbl_1`   
  551.                     VALUES ('53-01-01'), ('78@1@1'),('540101'),('790101');  
  552.                     SELECT * FROM `date_tbl_1`;                   
  553.                  (3) YYYYMMDD或YYMMDD格式的数字表示。其中'YY'的取值,'00''69'转换为2000到2069.'70''99'转换为1970到1999。例如,输入20080808,DATE类型转换为2008-08-08;输入790808,DATE类型将转换为1979-08-08。如果输入的值为0,那么DATE类型会转换为0000-00-00  
  554.                 实例三:  
  555.                     INSERT INTO `test`.`date_tbl_1`   
  556.                     VALUES (20080808), (800101), (090101), (0);  
  557.                     SELECT * FROM `date_tbl_1`;   
  558.                  (4) 使用CURRENT_DATE或者NOW()来输入函数系统日期。  
  559.                     INSERT INTO `test`.`date_tbl_1`   
  560.                     VALUES (CURRENT_DATE),(NOW());  
  561.                     SELECT * FROM `date_tbl_1`;   
  562.             4.1.3.4 DATETIME类型  
  563.                 类型      字节  显示形式        取值范围  
  564.                 DATETIME    8   YYYY-MM-DD HH:MM:SS '1000-01-01 00:00:00'到  
  565.                                         '9999-12-31 23:59:59'  
  566.                 (1) 'YYYY-MM-DD HH:MM:SS'或者'YYYYMMDDHHMMSS'格式的字符串表示  
  567.                 这种方式可以表达的范围是'1000-01-01 00:00:00''9999-12-31 23:59:59'。例如,输入'2008-08-08 08:08:08',DATETIME类型转换为2008-08-08 08:08:08;输入’20080808080808‘, 同样转换为2008-08-08 08:08:08。  
  568.                 MySQL支持一些不严格的语法格式,任何标点都可以用来做间隔符。情况与DATE类型相同。而且,时间部分也可以使用任意分隔符隔开,这与TIME类型不同。TIME类型只能使用':'隔开。例如:输入'2008@08@08@ 08*08*08', 同样转换为2008-08-08 08:08:08。  
  569.                 实例一:  
  570.                     CREATE TABLE  IF NOT EXISTS `test`.`datetime_tbl_1`(`a` DATETIME);  
  571.                     INSERT INTO `test`.`datetime_tbl_1`   
  572.                     VALUES ('1949-10-01 11:11:11'),('1950#2#2 11+11+11'), ('19510101121212');     
  573.                     SELECT * FROM `datetime_tbl_1`;       
  574.                 (2) 'YY-MM-DD HH:MM:SS'或者'YYMMDDHHMMSS'格式的字符串表示。其中'YY'的取值,'00''69'转换为2000到2069,'70''99'转换为1970到1999。与YEAR型和DATE型相同。  
  575.                 实例二:  
  576.                     INSERT INTO `test`.`datetime_tbl_1`   
  577.                     VALUES ('52-01-01 11:11:11'),('53@1@1 11*11*'), ('790101121212');     
  578.                     SELECT * FROM `datetime_tbl_1`;   
  579.                 (3)YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字表示。例如,输入20080808080808,DATETIME类型转换为2008-08-08 08-08-08;输入080808080808,同样转换为2008-08-08 08:08:08。如果输入的值为0,那么DATETIME类型转换为0000-00-00 00:00:00。  
  580.                 实例三:  
  581.                     INSERT INTO `test`.`datetime_tbl_1`   
  582.                     VALUES (20080808080808),(090101080808), (790101080808),(0);   
  583.                     SELECT * FROM `datetime_tbl_1`;   
  584.                 (4) 使用NOW()来输入当前系统日期和时间  
  585.                 实例四:  
  586.                     INSERT INTO `test`.`datetime_tbl_1`   
  587.                     VALUES (NOW());   
  588.                     SELECT * FROM `datetime_tbl_1`;   
  589.             4.1.3.5 TIMESTAMP类型  
  590.                 TIMESTAMP类型使用4个字节来表示日期和时间。TIMESTAMP类型的范围从1970-01-001 08:00:01到2038-01-19 11:14:07。MySQL中也是以'YYYY-MM-DD HH:MM:SS'的形式显示TIMESTAMP类型的值。从其形式可以看出,TIMESTAMP类型与DATETIME类型显示的格式一样的。给TIMESTAMP类型的字段赋值的表示方法基本与DATETIME类型相同。值的注意的是,TIMESTAMP类型范围比较小,没有DATETIME类型的范围大。因此,输入值时要保证在TIMESTAMP类型时有效范围内。  
  591.                 实例一:      
  592.                     CREATE TABLE  IF NOT EXISTS `test`.`timestamp_tbl_1`(`a` TIMESTAMP);  
  593.                     INSERT INTO `test`.`timestamp_tbl_1`  
  594.                     VALUES ('1970-10-01 11:11:11'),('1970#2#3 11+11+11'), ('19710101121212'),('28-01-01 11:11:11'), ('33@1@1 11*11*11'), ('790101121212'),('20080808080808'), ('090101080808'), (0),(NOW());      
  595.                     SELECT * FROM `timestamp_tbl_1`;  
  596.                 TIMESTAMP类型的几种与DATETIME类型不同的形式。  
  597.                 (1) 使用CURRENT_TIMESTAMP来输入系统日期与时间  
  598.                 (2) 输入NULL时,系统会输入系统当前日期与时间  
  599.                 (3) 无任何输入时,系统会输入系统当前日期与时间  
  600.                 实例二:      
  601.                     INSERT INTO `test`.`timestamp_tbl_1` VALUES();  
  602.                     INSERT INTO `test`.`timestamp_tbl_1` VALUES('');  
  603.                     INSERT INTO `test`.`timestamp_tbl_1` VALUES(CURRENT_TIMESTAMP);  
  604.                     INSERT INTO `test`.`timestamp_tbl_1` VALUES(NOW());  
  605.                     INSERT INTO `test`.`timestamp_tbl_1` VALUES(NULL);        
  606.                     TRUNCATE TABLE `timestamp_tbl_1`; -- 清空表  
  607.   
  608.                 TIMESTAMP类型还有一个很大的特点,说是时间是根据时区来显示的。  
  609.   
  610.                 需要显示日期与时间,TIMESTAMP类型能够根据不同地区的时区来转换时间。但是,TIMESTAMP类型的范围太小。其最大时间为2038-01-19 11:14:07  
  611.           
  612.         4.1.4 字符串类型  
  613.             字符串类型是在数据库中存储字符串的数据类型。字符串类型包括CHARVARCHAR、BLOB、TEXT、ENUM、SET。  
  614.   
  615.             1. CHAR类型和VARCHAR类型  
  616.             2. TEXT类型  
  617.             3. ENUM类型  
  618.             4. SET类型  
  619.   
  620.             4.1.4.1 CHAR类型和VARCHAR类型  
  621.                 CHAR类型和VARCHAR类型都是在创建表是指定最大长度,其基本形式如下:  
  622.                     字符串类型(M)  
  623.                 例如,CHAR(4)就是指数据类型为CHAR类型,其最大长度为4。  
  624.                   
  625.                 CHAR类型的长度是固定的,在创建表时就指定了。其长度可以是0~255的任意值。  
  626.                 例如,CHAR(100)就是指定CHAR类型的长度为100。  
  627.   
  628.                 VARCHAR类型的长度是可变的,在创建时指定了最大长度。定义时,其最大值可以取0~65535之间的任意值。指定VARCHAR类型的最大值以后,其长度可以在0到最大长度之间。例如,VARCHAR(100)的最大长度是100。但是,不是每条记录都要占100个位置。而是在这个最大值范围内,使用多少分配多少。VARCHAR类型实际占用的空间为字符串的实际长度加1。这样,可以有效的节约系统的空间。  
  629.   
  630.                 CHAR(5)与VARCHAR(5)对比  
  631.                 插入值     CHAR(5)     占用字节数   VARCHAR(5)  占用字节数  
  632.                 ''      ''      5个字节        ''      1个字节  
  633.                 '1'     '1'     5个字节        '1'     2个字节  
  634.                 '123'       '1'     5个字节        '123'       4个字节  
  635.                 '123 '      '123'       5个字节        '123 '      5个字节  
  636.                 '12345'     '12345'     5个字节        '12345'     6个字节  
  637.                   
  638.                 CHAR(5)所占用的空间都是5个字节。这表示CHAR(5)的固定长度就是5个字节。而VARCHAR(5)所占的字节数是实际长度的基本上加一。因为字符串的结束标志符占用一个字节。从表的第三行可以看到,VARCHAR将字符串'123 '最后面空格依然保留着。为了确认空格是否保留,将所有数据后面加上'*'字符。结果显示如下:  
  639.   
  640.                 实例一:  
  641.                     CREATE TABLE  IF NOT EXISTS `test`.`string_tbl_1`(  
  642.                         `a` CHAR(5),   
  643.                         `b` VARCHAR(5)  
  644.                     );  
  645.                     INSERT INTO `test`.`string_tbl_1`   
  646.                     VALUES('',''),('1''1'),('123','123'),('123 ''123 '),('12345''12345');  
  647.   
  648.                     SELECT * FROM `string_tbl_1`;  
  649.   
  650.                 char_part   varchar_part  
  651.                 *       *  
  652.                 1*      1*  
  653.                 123*        123*  
  654.                 123*        123 *  
  655.                 12345*      12345*  
  656.   
  657.                 由此可见,VARCHA类型将'123'最后面的空格保留着。而CHAR类型中将'123'后面的空格自动删除。     
  658.             4.1.4.2 TEXT类型  
  659.                 TEXT类型是一种特殊的字符串类型。TEXT只能保存字符数据,如文章等。TEXT类型包含TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。  
  660.   
  661.                 类型      允许的长度       存储空间  
  662.                 TINYTEXT    0~255字节     值的长度+2个字节  
  663.                 TEXT        0~65535字节       值的长度+2个字节  
  664.                 MEDIUMTEXT  0~167772150字节       值的长度+3个字节  
  665.                 LONGTEXT    0~4294967295字节  值的长度+4个字节  
  666.                 从表可以看出,各种TEXT类型的区别在于允许的长度和存储空间不同。因此在这几种TEXT中,根据需求选取既能满足需要以最节约空间的类型即可。     
  667.                   
  668.                 实例一:  
  669.                     CREATE TABLE  IF NOT EXISTS `test`.`string_tbl_2`(  
  670.                         `a` CHAR(10),   
  671.                         `b` VARCHAR(20),  
  672.                         `c` TEXT  
  673.                     );  
  674.                     INSERT INTO `test`.`string_tbl_2`   
  675.                     VALUES('','',''),('1''1','1'),('123','123','123'),('123 ''123 ''123 '),('12345''12345','12345');  
  676.   
  677.                     SELECT * FROM `string_tbl_2`;  
  678.             4.1.4.3 ENUM类型(枚举类型)  
  679.                 ENUM类型又称为枚举类型。在创建表时,ENUM类型的取值范围就以列表的形式指定了。  
  680.                 属性名 ENUM('值1''值2',...., '值n');  
  681.                 其中, '属性名'参数指定字段名称;'值n'参数表示列表中的第n个值,这些值末尾的空格将会被系统直接删除。  
  682.                   
  683.                 ENUm类型的值只能列表中的一个元素。其取值列表中最多能有65535个值。列表中的每个值都有一个顺序排序的编号,MySQL中存入的是这个编号,而不列表中的值。  
  684.   
  685.                 如果ENUm类型加上了NOT NULL属性,其默认值为取值列表的第1个元素。如果不加NOT NULL属性,ENUm类型将允许插入NULL,而且NULL为默认值。  
  686.                 实例一:  
  687.                     CREATE TABLE  IF NOT EXISTS `test`.`enum_tbl`(  
  688.                         `a` ENUM('male','female'),  
  689.                         `b` ENUM('true','false'NOT NULL  
  690.                     );  
  691.                     INSERT INTO `test`.`enum_tbl`   
  692.                     VALUES('male''true'),(NULL'false'), (NULLNULL),(20, 20);  
  693.                     SELECT * FROM `enum_tbl`;  
  694.             4.1.4.4 SET类型  
  695.                 基本形式如下:  
  696.                 属性名 set('值1','值2','值3'...'值n');  
  697.                 其中,'属性名'参数指定字段名称;'值n'参数列表中的第n个值,这些值末尾的空格将会被系统直接删除。其基本形式与ENUM类型一样。  
  698.   
  699.                 SET类型的值可以取列表中一个元素或者多个元素的组合。取多个元素时,不同元素之间用逗号隔开。SET类型的值最多只能是64个元素构成的组合。列表中的每一个值都有一个顺序排列的编号。MySQL中存入的是这个编号,而不是列表中的值。  
  700.   
  701.                 插入记录时,SET字段里的元素顺序无关紧要。存入MySQL数据库后,数据库系统会自动按照定义时的顺序显示。  
  702.                   
  703.                 实例一:      
  704.                     CREATE TABLE  IF NOT EXISTS `test`.`set_tbl`(  
  705.                         `a` SET('a','b','c','d','e','f','g')  
  706.                     );  
  707.                     INSERT INTO `test`.`set_tbl`    VALUES('f'),('a,b,c'),('d,e,a');  
  708.                     INSERT INTO `test`.`set_tbl` VALUES('h');  
  709.                     SELECT * FROM `set_tbl`;  
  710.           
  711.         4.1.5 二进制类型  
  712.             二进制类型是在数据库中存储二进制数据的数据类型。二进制类型包括BINARY、VARBINARY、BIT、TINYBLOB、BLOG、MEDIUMBLOB和LONGBLOG。  
  713.             1. BINARY和VARBINARY类型  
  714.             2. BIT类型  
  715.             3. BLOB类型  
  716.   
  717.             二进制类型       取值范围  
  718.             BINARY(M)       字节数为M,允许长度为0~M的定长二进制字符串  
  719.             VARBINARY(M)        允许长度为0~M的变长二进制字符串,  
  720.                         字节数为值的长度加一  
  721.             BIT(M)          M位二进制数据,M最大值为64  
  722.             TINYBLOB        可变长二进制数据,最多255个字节  
  723.             BLOB            可变长二进制数据,最多(2[16]-1)个字节  
  724.             MEDIUMBLOB      可变长二进制数据,最多(2[24]-1)个字节  
  725.             LONGBLOB        可变长二进制数据,最多(2[32]-1)个字节  
  726.   
  727.             4.1.5.1 BINARY和VARBINARY类型  
  728.                 BINARY和VARBINARY类型都是在创建表时指定了最大长度,其基本形式如下 :  
  729.                 字符串类型(M)  
  730.                 这与CHAR类型和VARCHAR类型相似。  
  731.                 例如,BINARY(10)就是指数据类型为BINARY类型,其最大长度为10。  
  732.   
  733.                 BINARY类型的长度是固定的,在创建表是就指定了。不足最大长度的空间由"\0"补全。例如,BINARY(50)就是指定BINARY类型的长度为50。  
  734.   
  735.                 VARBINARY类型的长度是可变的,在创建表时指定了最大长度。指定好了VARBINARY类型的最大值以后,基长度可以在0到最大长度之间。例如,VARBINARY(50)的最大字节长度是50。但是,不是每条记录的字节长度都是50。在这个最大范围内,使用多少分配多少。VARBINARY类型实际占用的空间为实际长度加一。这样,可以有效的节约系统的空间。  
  736.                   
  737.                 实例一:  
  738.                     CREATE TABLE  IF NOT EXISTS `test`.`binary_tbl`(  
  739.                         `a` BINARY(4),   
  740.                         `b` VARBINARY(4)  
  741.                     );  
  742.                     INSERT INTO `test`.`binary_tbl`   
  743.                     VALUES('d','d');  
  744.                     SELECT length(a), length(b) FROM `test`.`binary_tbl`;  
  745.                     SELECT a, a='d', a='d\0\0\0', b, b='d', b='b\0\0\0' FROM `test`.`binary_tbl`;  
  746.             4.1.5.2 BIT类型  
  747.                 BIT类型也是创建表时指定了最大长度,其基本形式如下:  
  748.                 BIT(M)  
  749.                 其中,'M'指定了该二进制的数的最大字节长度为M,M的最大值为64。例如,BIT(4)就是数据类型BIT类型,长度为4.若字段的类型BIT(4),存储的数据是从0到15。因为,变成二进制以后,15的值为1111,其长度为4。如果插入的值为16,其二进制数为10000,长度为5,超过了最大长度。因此大于等于16的数是不能插入到BIT(4)类型的字段中的。在查询BIT类型的数据时,要用BIN(字段名+0)来将值转换为二进制显示。  
  750.                 向表中插入0、8、14等值后,查询其结果。  
  751.   
  752.                 实例一:  
  753.                     CREATE TABLE  IF NOT EXISTS `test`.`bit_tbl`(  
  754.                         `a` BIT(4)   
  755.                     );  
  756.                     INSERT INTO `test`.`bit_tbl`   
  757.                     VALUES(0),(8),(14);  
  758.                     SELECT * FROM `test`.`bit_tbl`;  
  759.                     SELECT bin(a+0) FROM `test`.`bit_tbl`;  
  760.             4.1.5.3 BLOB类型  
  761.                 BLOB类型是一种特殊的二进制类型。BLOB可以用来保存数据量很大的二进制数据,如图片等。BLOB类型包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。这几种BLOB类型最大的区别就是能够保存的最大长度不同。LONGBLOB的长度最大,TINYBLOB的长度最小。  
  762.   
  763.                 BLOB类型与TEXT类型很类似。不同点在于BLOB类型用于存储二进制数据,BLOB类型数据是根据其二进制编码进行比较和排序。而TEXT类型是文本模式进行比较和排序的。  
  764.                 实例一:  
  765.                     CREATE TABLE  IF NOT EXISTS `test`.`bit_tbl`(  
  766.                         `a` BIT(4)   
  767.                     );  
  768.                     INSERT INTO `test`.`bit_tbl`   
  769.                     VALUES(0),(8),(14);  
  770.                     SELECT * FROM `test`.`bit_tbl`;  
  771.                     SELECT bin(a+0) FROM `test`.`bit_tbl`;            
  772.     4.2 如何选择数据类型  
  773.         在MySQ中创建表时,需要考虑为字段选择哪种数据类型是最合适的。选择合适的数据类型,会提高数据库的效率。  
  774.           
  775.         1. 整数类型和浮点数类型  
  776.         2. 浮点数类型和定点数类型  
  777.         3. CHAR类型和VARCHAR类型  
  778.         4. 时间和日期类型  
  779.         5. ENUM类型和SET类型  
  780.         6. TEXT类型和BLOB类型  
  781.   
  782.         4.2.1 整数类型和浮点数类型  
  783.             整数类型和浮点数类型最大的区别在于能否表达小数。整数类型不能表示小数,而浮点数类型可以表示小数。不同的整数类型的取值范围不同。TINYINT类型的取值范围是0~255。如果字段的最大值不超过255,那选择TINYINT类型就足够了。BIGINT类型的取值范围最大,最常用的整数类型是INT类型。  
  784.               
  785.             浮点型类型包括FLOAT类型和DOUBLE类型。DOUBLE类型的精度比FLOAT类型高。如果需要精确到小数点后10以上,就应该选择DOUBLE类型,而不应该选择FLOAT类型。  
  786.         4.2.2 浮点类型和定点数类型  
  787.             对于浮点数和定点数,当插入值的精度高于实际定义的精度,系统会自动进行四舍五入处理。其目的是为了使该值的精度达到要求。浮点数进行四舍五入不会报警,定点数出现警告。  
  788.   
  789.             在未指定精度的情况下,浮点数和定点数有其默认的精度。FLOAT类型和DOUBLE类型默认会保存实际精度。这个精度与操作系统和硬件的精度有关。DECIMAL类型默认整数位为10, 小数位为0,即默认为整数。  
  790.   
  791.             在MySQL中,定点数精度比浮点数要高。而且,浮点数会出现误差。如果要对数据的精度要求比较高,应该选择定点数。  
  792.         4.2.3 CHAR类型和VARCHAR类型  
  793.             CHAR类型的长度是固定的,而VARCHAR类型的长度是在范围内可变的。因此,VARCHAR类型占用的空间比CHAR类型小。而且,VARCHAR类型比CHAR类型灵活。  
  794.             对于长度变化比较大的字符串类型,最好选择VARCHAR类型。  
  795.   
  796.             虽然,CHAR类型的占用空间比较大,但是CHAR类型的处理速度比VARCHAR快。因此,对于长度变化不大和查询速度要求较高的字符串类型,最好选择CHAR类型。  
  797.         4.2.4 时间和日期类型  
  798.             YEAR类型只表示年份。如果要记录年份,选择YEAR类型可以节约空间。TIME类型只表示时间。如果只需要记录时间,选择TIME类型最合适的。DATE类型只表示日期。如果只需要记录日期,选择DATE类型是最合适的。  
  799.   
  800.             如果需要记录日期和时间,可以选择DATETIME和TIMESTAMP类型。DATETIME类型表示的时间范围比TIMESTAMP类型大。因此,若需要的时候范围比较大,选择DATETIME类型比较合适。TIMESTAMP类型的时间是根据时区来显示的。如果需要显示的时间与时区对应,那就应该选择TIMESTAMP类型。  
  801.         4.2.5 ENUM类型和SET类型  
  802.             ENUm类型最多可以有65535个成员,而SET类型最多只能包含64个成员。两者的取值只能在成员列表中选取。ENUM类型只能从成员中选择一个,而SET类型可以选择多个。  
  803.   
  804.             因此,对于多个值中选取一个的,可以选择ENUM类型。例如,"性别"字段就可以定义成ENUM类型,因为只能在 "男""女"中选取其中一个。对于可以选取多个值的字段,可以选择SET类型。例如,"爱好"字段就可以选择SET类型,因为可能有多种爱好。  
  805.         4.2.6 TEXT类型和BLOB类型  
  806.             TEXT类型和BLOB类型很类似。TEXT类型只能存储字符数据。而BLOB类型可以存储二进制数据。如果要存储文章等纯文件的数据,应该选择TEXT类型。如果需要存储图片等二进制的数据,应该选择BLOB类型。  
  807.   
  808.             TEXT类型包括TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT类型允许的长度最大。BLOB类型也是如此。  
  809.     4.3 常见问题及解答  
  810.         1. MySQL中什么数据类型能够储存路径?  
  811.             答:MySQL中,CHARVARCHAR、TEXT等字符串类型都可以存储路径。但是,如果路径中使用"\"符号时,这个符号会被过滤。解决办法是,路径中用"/"或者"\\"来代替"\"。这样MySQL就不会自动过滤路径分隔字符,可以完整的表示路径。  
  812.   
  813.         2. MySQL中如何使用布尔类型?  
  814.             答:在SQL标准中,存储BOOL和BOOLEAN类型。MySQL为了支持SQL标准,也是可以定义BOOL和BOOLEAN类型的。但是,BOOL和BOOLEAN类型最后换成是TINYINT(1)。也就是说,在MYSQL中,布尔类型等价于TINYINT(1)。因此,创建表时将一个字段定义成BOOL和BOOLEAN类型,数据库中真实定义的是TINYINT(1)。  
  815.   
  816.             CREATE TABLE  IF NOT EXISTS `test`.`bool_tbl`(  
  817.                 `a` BOOL,  
  818.                 `b` BOOLEAN  
  819.             );  
  820.             INSERT INTO `test`.`bool_tbl`   
  821.             VALUES(truefalse), (falsefalse), (truetrue);  
  822.             SELECT * FROM `test`.`bool_tbl`;  
  823.   
  824.         3. MySQL中如何存储JPG图片和MP3音乐?  
  825.             答:一般情况下,数据库中不直接存储图片和音乐文件。而是存储图片和文件的路径。如果实在需要在MySQL数据库中存储图片和音频文件,就选择BLOB类型。因为,BLOB类型可以用来存储二进制类型的文件。  
  826.   
  827. 5. 操作数据库  
  828.     数据库是指长期存储在计算机、有组织的、可共享的数据集合。简而言之,数据库就是一个存储数据的地方。只是,其存储方式有特定的规律。这样可以方便处理数据。数据库的操作包括创建数据库和删除数据库。这些操作都是数据库管理的基础。  
  829.     - 创建数据库  
  830.     - 删除数据库  
  831.     - 数据库的存储引擎  
  832.     - 如何选择存储引擎  
  833.   
  834.     5.1 创建数据库  
  835.         创建数据库是指在数据库系统中划分一块空间,用来存储相应的数据。这是进行表操作的基础,也是进行数据库管理的基础。  
  836.         创建数据库是通过SQL语言CREATE DATABASE命令实现的。  
  837.             CREATE DATABASE 数据库名;  
  838.               
  839.             -- MySQL命令以分号(;)或\g结束命令  
  840.   
  841.             SHOW DATABASES; -- 用列表显示所有数据库  
  842.             CREATE DATABASE example; -- 创建数据库  
  843.             CREATE DATABASE IF NOT EXISTS example; -- 如果没有example数据库则创建example数据库                 
  844.     5.2 删除数据库  
  845.         删除数据库是指数据库系统中删除已经存在的数据库。删除数据库之后,原来分配的空间将被收回。值得注意的是,删除数据库会删除该数据库中所有的表和所有数据。  
  846.         删除数据库是通过SQL语句DROP DATABASE命令实现的。  
  847.             DROP DATABASE 数据库名  
  848.             DROP DATABASE IF EXISTS example; -- 如果example数据库存在的话删除example数据库  
  849.     5.3 数据库的存储引擎  
  850.         MySQL中提到了存储引擎的概念。简而方之,存储引擎就是指表的类型。数据库存储引擎决定了表在计算机中的存储方式。  
  851.   
  852.         5.3.1 MySQL存储引擎简介  
  853.             存储引擎的概念是MySQL的特点,而且是一种插入式的存储引擎概念。这决定了MySQL数据库中的表可以用不同的方式存储。用户可以根据自己的不同要求,选择不同的存储方式、是进行事务处理等。  
  854.   
  855.             使用SHOw ENGINES语句可以查看MySQL数据库支持的存储引擎类型。  
  856.             SHOW ENGINES \G   
  857.             Engine : MyISAM  
  858.             Support: YES  
  859.             Comment: Default Engine at of MySQL 3.23 with great performance(描述说明)   
  860.             TransactionNO (是否支持事务)  
  861.             XA: NO (是不否支持分布式XA规范)  
  862.             Savepoints: NO (是否支持保存点)  
  863.   
  864.             SHOW VARIABLES LIKE 'have%';  
  865.             SHWO VARIABLES LIKE 'storage_engine';   # 数据库默认引擎[storage:存储]  
  866.             1. 可以在mysql.ini配置文件中修改数据库默认引擎  
  867.                 default-storage-engine = INNODB            
  868.         5.3.2 InnoDB存储引擎  
  869.             InnoDB是MySQL数据库的一个存储引擎。InnoDB给MySQL的表提供了事务、回滚、崩溃修复能力、多版本并发控制的事务安全。在MySQL从3.23.34a开始包含InnoDB存储引擎。InnoDB是MySQL上第一个提供外键约束的引擎。而且InnoDB对事务处理的能力,也是MySQL其他存储引擎所无法与之比拟的。  
  870.               
  871.             (1)InnoDB存储引擎中支持自动增长列(AUTO_INCREMET)  
  872.             自动增长列的值不能为空,且值必须惟一。MySQL中规定自增列必须为主键。在插入值时,如果自动增长列不输入值,则插入的值为自动增长后的值;如果输入的值为0或者空(NULL),则插入的值也为自动增长后的值;如果插入某个确定的值,且该值在前面没有出现过,则可以直接插入。  
  873.   
  874.             (2) InnoDB存储引擎中支持外键(FOREIGN KEY)  
  875.   
  876.             (3) InnoDB存储引擎中,创建表的表结构存储在.frm文件中。数据和索引存储innodb_data_home_dir和innodb_data_file_path定义的表空间中。  
  877.               
  878.             (4) InnoDB存储引擎的优势在于提供良好的事务管理、崩溃修复能力和并发控制。  
  879.             缺点是读写效率稍差,占用的数据空间相对比较大。           
  880.         5.3.3 MyISAM存储引擎  
  881.             MyISAM存储引擎是MySQL中常见的存储引擎,是以前MySQL的默认存储引擎。MyISAM存储引擎是基于ISAM存储引擎发展起来的。MyISAM增加了很多用的扩展。  
  882.                   
  883.             MyISAM存储引擎的表存储成三个文件。文件的名字与表名相同。扩展名包括frm、MYD和MYI。其中frm为扩展名的文件存储表的结构;MYD为扩展名的文件存储数据,基是MYData的缩写;MYI为扩展名的文件存储索引,其是MyIndex的缩写。  
  884.               
  885.             MyISAM存储引擎的优势在于占用空间小、处理速度快。  
  886.             缺点是不支持事务的完整性和并发性。  
  887.         5.3.4 MEMORY存储引擎  
  888.             MEMORY存储引擎是MySQL中的一个特殊的存储引擎。基使用存储在内存中内容来创建表,而且所有数据也放在内存中。这些特性都与InnoDB存储引擎、MyISAM存储引擎不同。  
  889.               
  890.             每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件的只存储表的结构。而其数据文件,都是存储在内存中。这样有利于对数据的快速的处理,提高整个表的处理效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要使用了,可以释放这些内存,甚至可以删除不需要的表。  
  891.   
  892.             MEMORY表的大小是受到限制的。表的大小主要取决于两个参数,分别是max_rows和max_heap_table_size。  
  893.         5.3.5 存储引擎的选择  
  894.             在实际工作中,选择一个合适的存储引擎是一个很复杂的问题。每种存储引擎都有各自的优势,不能笼统的说谁比谁好。  
  895.   
  896.             存储引擎的对比  
  897.               
  898.             特性      InnoDB      MyISAM      MEMORY  
  899.             事务安全    支持      X       X  
  900.             存储限制    64TB        有       有  
  901.             空间使用    高       低       低     
  902.             内存使用    高       低       高  
  903.             插入数据的速度 低       高       高  
  904.             对外键的支持  支持      无       无  
  905.               
  906.     5.4 本章实例  
  907.         学校需要建立信息化的管理,必须要建立一个信息完备的数据库系统。这个数据库系统中存储着学校的老师、学生、课程安排、考试成绩等各种信息。建立一个名为school的数据库  
  908.   
  909.         1. 登录数据库系统  
  910.         2. 查看已存在的数据库  
  911.         3. 查看默认存储引擎  
  912.         4. 创建数据库  
  913.         5. 删除数据库  
  914.   
  915.         Start:   
  916.             1. mysql -h localhost -u root -p  
  917.             2. SHOW DATABASES;  -- 查看所有数据库  
  918.             3. SHOW ENGINES \g  # 查看所有的存储引擎  
  919.                SHOW VARIABLES LIKE 'storage_engine'; /* 查看默认的存储引擎 */  
  920.   
  921.             4. CREATE DATABASE [IF NOT EXISTS] school; # 如果没有school数据库创建school数据库  
  922.             5. SHOW DATABASES;    
  923.             6. DROP DATABASE [IF EXISTS] school;    -- 删除school数据库  
  924.     5.5 上机实践  
  925.         题目要求:登录数据库系统以后,创建一个student数据库和teacher数据库。然后再删除teacher数据库。然后查看数据库系统中还存在哪些数据库。  
  926.             过程如下:  
  927.                 (1) 登录数据库  
  928.                 (2) 查看数据库系统中已存在的数据库  
  929.                 (3) 查看该数据库系统支持的存储引擎类型  
  930.                 (4) 创建一个student数据库和teacher数据库  
  931.                 (5) 再次查看数据库系统中已经存在的数据库,确保student和teacher已经存在。  
  932.                 (6) 删除teacher数据库  
  933.                 (7) 再次查看数据库系统已经存在的数据库,确保teacher数据库已经删除。  
  934.                 (8) 删除student数据库  
  935.                 (9) 再次查看数据库系统已经存在的数据库,确保student数据库已经删除。  
  936.   
  937.             Start:   
  938.                 1. mysql -h localhost -u root -p  
  939.                 2. SHOW DATABASES;  
  940.                 3. SHOW ENGINES \G  
  941.                 4. CREATE DATABASE [] student \g  
  942.                 5. CREATE DATABASE [] teacher \g  
  943.                 6. SHOW DATABASES;  
  944.                 7. DROP DATABASE [IF EXISTS] teacher;  
  945.                 8. SHOW DATABASES;  
  946.                 7. DROP DATABASE [IF EXISTS] student;  
  947.                 8. SHOW DATABASES;  
  948.     5.6 常见问题及解答  
  949.         1. 如何修改默认存储引擎?  
  950.             (1) 使用配置向导,修改默认存储引擎。  
  951.             (2) 修改配置文件my.ini,default_storage_engine=INNODB修改即可  
  952.         2. 如何选择存储引擎?  
  953.             CREATE TABLE  `test`.`test` (  
  954.                 `a` INT NOT NULL  
  955.             ) ENGINE = MYISAM ;  
  956.     5.74 本章习题  
  957.         1. 练习在MySQL数据库系统中创建一个名为worker的数据库。创建成功后,删除该数据库。  
  958.         2. 练习用三种不同的方法找出你所使用的MySQL数据库默认存储引擎。  
  959.         3. 存储引擎InnoDB、MyISAM和MEMORY各有什么优缺点?  
  960.   
  961. 6 创建、修改和删除表  
  962.     表是数据库存储数据的基本单位、一个表包含若干个字段或记录、表的操作包括创建新表、修改表和删除表。这些操作都是数据库管理中最基本,也是最重要的操作。在这一章中将讲解如何在数据库中操作表。  
  963.       
  964.     - 创建表方法  
  965.     - 表的完整性约束条件  
  966.     - 查看表结构的方法  
  967.     - 修改表的方法  
  968.     - 删除表的方法  
  969.   
  970.     6.1 创建表方法  
  971.         创建表是指在已存在的数据库中建立新表。这是建立数据库最重要的一步,是进行其他操作的基础。  
  972.         6.1.1 创建表的语法形式  
  973.             MySQL中,创建表是通过SQL语句CREATE TABLE实现的。  
  974.             CREATE TABLE 表名(  
  975.                 属性名 数据类型 [完整性约束条件],  
  976.                 属性名 数据类型 [完整性约束条件],  
  977.                 ......  
  978.                 属性名 数据类型 [完整性约束条件],  
  979.             );  
  980.             1. mysql -h localhost -u root -p  
  981.             2. SHOW DATABASES;  
  982.             3. CREATE DATABASE IF NOT EXISTS example  
  983.             4. CREATE TABLE IF NOT EXISTS text1 (  
  984.                 id INT,  
  985.                 name VARCHAR(20);  
  986.                 gender BOOLEAN,  
  987.             ) Engine = MyISAM;   
  988.             5. DESCRIBE test1 \g -- 查看example表的结构     
  989.               
  990.             完整性约束条件表   
  991.             PRIMARY KEY 标识该属性为该表的主键,可以唯一的标识对应的元组  
  992.             FOREIGN KEY 标识该属性为该表的外键,是与之联系的某表的主键   
  993.             NOT NULL    标识该属性不能为空  
  994.             UNIQUE      标识该属性的值是唯一的  
  995.             AUTO_INCREMENT  标识该属性的值自动增加,这是MySQL的SQL语句的特色  
  996.             DEFAULT     标识该属性设置默认值  
  997.               
  998.         6.1.2 设置表的主键  
  999.             主键是表的一个特殊字段。该字段能惟一地标识该表中的每条信息。主键和记录的关系,如同身份证和人的关系。主键用来标识每个记录,每个记录的主键值都不同。身份证是用来标明人的身份,每个人都具有惟一的身份证号。设置表的主键指在创建表时设置表的某个字段为该表的主键。  
  1000.   
  1001.             主键的主要目的是帮组MySQL以最快的速度查找到表中的某一条信息。  
  1002.             主键必须满足的条件:  
  1003.                 1. 主键必须是唯一的,表中任意两条记录的主键字段的值不能相同;  
  1004.                 2. 主键的值是非空值;  
  1005.                 3. 主键可以是单一的字段,也可以是多个字段组合。  
  1006.             1. 单字段的主键:  
  1007.                 CREATE TABLE student1 (  
  1008.                     stu_id INT PRIMARY KEY,  
  1009.                     stu_name VARCHAR(20) NOT NULL,  
  1010.                     stu_gender BOOLEAN  
  1011.                 ) Engine = InnoDB;  
  1012.                 SHOW TABLES;  
  1013.                 DESCRIBE student1;  
  1014.             2. 多字段主键:  
  1015.                 CREATE TABLE student2 (  
  1016.                     stu_id INT,  
  1017.                     course_id INT,  
  1018.                     grade FLOAT,  
  1019.                     PRIMARY KEY(stu_id, course_id)  
  1020.                 )Engine = InnoDB;  
  1021.               
  1022.         6.1.3 设置表的外键   
  1023.             外键是表的一个特殊字段。如果字段sno是一个表A的属性,且依赖于表B的主键。那么,称表B为父表,表A为子表,sno为表A的外键。通过sno字段将父表B和子表A建立关联关系。设置表的外键指在创建表设置某个字段为外键。  
  1024.               
  1025.             设置外键的原则:必须依赖于数据库中已存在的父表的主键;外键可以为空值。  
  1026.   
  1027.             外键的作用: 是建立该表与其父表的关联关系。父表中删除某条信息时,子表中与之对应的信息也必须有相应的改变。例如,stu_id就student表的主键,stu_id是grade表的外键。当stu_id为'123'同学退学了,需要从student表中删除该学生的信息。那么,grade表中stu_id为'123'的所有信息也应该同时删除。  
  1028.   
  1029.             CONSTRAINT 外键别名 FOREIGN KEY (属性1.1, 属性1.2...属性1.n);  
  1030.             REFERENCES 表名(属性2.1, 属性2.2,...,属性2.n)  
  1031.   
  1032.             CREATE TABLE student3 (  
  1033.                 id INT PRIMARY KEY,  
  1034.                 stu_id INT,  
  1035.                 course_id INT,  
  1036.                   
  1037.                 # 设置外键  
  1038.                 CONSTRAINT C_fk FOREIGN KEY(stu_id, course_id) REFERENCES student2(stu_id, course_id)  
  1039.             ) Engine = InnoDB;  
  1040.         6.1.4 设置表的非空约束  
  1041.             非空性是指字段的值不能为空值(NULL)。非空约束将保证所有记录中该字段都有值。如果用户新插入的记录中,该字段为空值,则数据库系统会报错。例如,在id字段加上非空约束,id字段的值就不能为空。如果插入记录的id字段的值为空,该记录将不能插入。设置表的非空约束是指在创建表时为表的某些特殊字段加上NOT NULL约束条件。设置非空约束的基本语法规则如下:  
  1042.                 属性名 数据类型 NOT NULL  
  1043.                 CREATE TABLE student4 (  
  1044.                     id INT NOT NULL PRIMARY KEY,  
  1045.                     name VARCHAR(20) NOT NULL,  
  1046.                     stu_id INT,  
  1047.                     CONSTRAINT d_fk FOREIGN KEY(stu_id) REFERENCES student2(stu_id)  
  1048.                 );  
  1049.         6.1.5 设置表的惟一性约束  
  1050.             惟一性是指所有记录中该字段的值不能重复出现。设置表的惟一性约束是指在创建表时为表的某些特殊字段加上UNIQUE约束条件。唯一性约束将保证所有记录中该字段的值不能重复出现。例如,在id字段加上惟一性约束,所以记录中id字段上不能出现相同的值。例如,在表的id字段加上惟一性约束,那么每条记录的id值都是惟一的,不能出现重复的情况。如果一条的记录的id值都是惟一的,不能出现重复的情况。如果一条的记录的id为'0001',那么该表中就不能出现另一条记录的id为'0001'。设置惟一性约束的基本语法规则如下:  
  1051.                 属性名 数据类型 UNIQUE  
  1052.                 CREATE TABLE student5 (  
  1053.                     id INT NOT NULL PRIMARY KEY,  
  1054.                     stu_id INT UNIQUE,  
  1055.                     name VARCHAR(20) NOT NULL  
  1056.                 );  
  1057.                 INSERT INTO `student5` values(1, 10, 'Sue'), (2, 11, 'Lucy');  
  1058.                 INSERT INTO `student5` values(2, 10, 'Jack');  
  1059.         6.1.6 设置表的属性值自动增加  
  1060.             AUTO_INCREMENT是MYSQL数据库中一个特殊的约束条件。其主要用于为表中插入的新记录自动生成惟一的ID。一个表只能有一个字段使用AUTO_INCREMENT约束,且该字段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数类型(TINYINT、SMALLINTINTBIGINT等)。默认情况下,该字段的值是从1开始自增。  
  1061.             设置属性值字段增加的基本语法规则如下:  
  1062.                 属性名 数据类型 AUTO_INCREMENT  
  1063.                   
  1064.                 CREATE TABLE student6 (  
  1065.                     id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,  
  1066.                     stu_id INT UNIQUE,  
  1067.                     name VARCHAR(20) NOT NULL  
  1068.                 );  
  1069.                 INSERT INTO `student6` values('', 10, 'Sue'), ('', 11, 'Lucy');  
  1070.                 INSERT INTO `student6` values('', 12, 'Jack');  
  1071.         6.1.7 设置表的履的默认值  
  1072.             在创建表时可以指定表中字段的默认值。如果插入一条新的记录时没有为这个字段赋值,那么数据库系统会自动为穿上字段插入默认值。默认值通过DEFAULT关键字来设置的。  
  1073.                 属性名 数据类型 DEFAULT  默认值  
  1074.                 CREATE TABLE student7 (  
  1075.                     id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,  
  1076.                     stu_id INT UNIQUE,  
  1077.                     name VARCHAR(20) NOT NULL DEFAULT 'WHAT',  
  1078.                     language VARCHAR(20) DEFAULT 'cn',  
  1079.                     english VARCHAR(20) DEFAULT 'ZERO',  
  1080.                     math FLOAT DEFAULT 0,  
  1081.                     computer FLOAT DEFAULT 0  
  1082.                 );  
  1083.                 INSERT INTO `student7` VALUES('',10,'Sue''kr''one','','');  
  1084.                 INSERT INTO `student7` VALUES('',11,'Jack''''','','');  
  1085.     6.2 查看表结构  
  1086.         查看表结构是指查看数据库中已存在的表的定义。查看表结构的语句包括DESCRIBE语句和SHOW CREATE TABLE语句。通过这两个语句,可以查看表的字段名、字段的数据类型、完整性约束条件等。  
  1087.   
  1088.         6.2.1 查看表基本结构语句DESCRIBE  
  1089.             MySQL中,DESCRIBE语句可以查看表的基本定义。其中包括、字段名、字段数据类型、是否为主键和默认值等。  
  1090.             DESCRIBE 表名;  
  1091.             DESC或DESCRIBE student7;  
  1092.               
  1093.         6.2.2 查看表详细结构语句SHOW CREATETABLE   
  1094.             MySQL中,SHOW CREATE TABLE语句可以查看表的详细定义。该语句可以查看表的字段名、字段的数据类型、完整性约束条件等信息。除此之外,还可以查看表默认的存储引擎和字符编码。SHOW CREATE TABLE语句的语法形式如下:  
  1095.                 SHOW CREATE TABLE 表名;  
  1096.                 SHOW CREATE TABLE student7;       
  1097.     6.3 修改表的方法  
  1098.         修改表是指修改数据库中已存在的表。修改表比重新定义表简单,不需要重新加载数据,也不会影响正在进行的服务。MySQL中能过ALTER TABLE [alter:改变,更改]语句来修改表。修改表包括修改表名、修改字段数据类型、修改字段名、增加字段、删除字段、修改字段的排列位置、更改表的存储引擎和删除表的外键约束等。  
  1099.           
  1100.         6.3.1 修改表名  
  1101.             表名可以在一个数据库中唯一的确定一张表。数据库系统通过表名来区分不同的表。例如,数据库school中有student表。那么student表就是唯一的。在数据库school中不可能存在另一个名为"student"的表。MySQL中,修改表名是通过SQL语句ALTER TABLE实现的。其语法形式如下:  
  1102.                 ALTER TABLE 旧表名 RENAME [TO] 新表名;  
  1103.             实例一:  
  1104.                 CREATE TABLE student8 (  
  1105.                     stu_id INT PRIMARY KEY,  
  1106.                     stu_name VARCHAR(20) NOT NULL,  
  1107.                     stu_gender BOOLEAN  
  1108.                 ) Engine = InnoDB;  
  1109.                 SHOW TABLES;  
  1110.                 DESCRIBE student8;  
  1111.                 ALTER TABLE student8 RENAME TO student8_changed;  
  1112.         6.3.2 修改字段的数据类型  
  1113.             字段的数据类型包括整型、浮点数型、字符串型、二进制类型、日期和时间类型等。数据类型决定了数据的存储格式、约束条件和有效范围。表中每个字段都有数据类型。ALTER TABLE语句也可以修改字段的数据类型。其基本语法如下:ALTER TABLE 表名 MODIFY 属性名 数据类型;  
  1114.               
  1115.             实例一:  
  1116.                 CREATE TABLE student9 (  
  1117.                     stu_id INT PRIMARY KEY,  
  1118.                     stu_name VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  
  1119.                     content VARCHAR(20) NOT NULL,  
  1120.                     stu_gender BOOLEAN  
  1121.                 ) Engine = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;  
  1122.                 ALTER TABLE student9 MODIFY stu_name char(20);  
  1123.         6.3.3 修改字段名[字段的数据类型, 完整性约束条件]  
  1124.             字段名可以在一张表中唯一确定一个字段。数据库系统通过字段名来区分表中的不同字段。例如,student表中包含id字段。那么,id字段在student表中是唯一的。student表中不可能存在另一个名为"id"的字段。MySQL中ALTER TABLE语句也可以修改表的字段名。其基本语法如下:  
  1125.             ALTER TABLE 表名 CHNAGE 旧字段名 新字段名 新数据类型 [新完整性约束条件];  
  1126.             其中,"旧字段名"参数指修改前的字段名;"新字段名"参数指修改后的字段名;"新数据类型"参数修改后的数据类型,如不需要修改,则将新类型设置成与原来一样。  
  1127.                 1. 只修改字段名  
  1128.                 2. 修改字段名和字段数据类型  
  1129.                 3. 修改完整性约束条件  
  1130.             实例一:  
  1131.                 CREATE TABLE student10 (  
  1132.                     stu_id INT PRIMARY KEY,  
  1133.                     stu_name VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  
  1134.                     content VARCHAR(20) NOT NULL,  
  1135.                     stu_gender BOOLEAN  
  1136.                 ) Engine = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;  
  1137.                 ALTER TABLE student10 CHANGE stu_name stu_name_changed VARCHAR(20);  
  1138.                 ALTER TABLE student10 CHANGE content content_changed VARCHAR(50) NOT NULL DEFAULT 'XXXX';  
  1139.         6.3.4 增加字段  
  1140.             在创建表时,表中的字段就已经定义完成。如果要增加新的字段,可以通过ALTER TABLE语句进行增加。  
  1141.             MySQL中,ALTER TABLE语句增加字段的基本语法如下:  
  1142.               
  1143.             ALTER TABLE 表名 ADD 新字段名 数据类型 [完整性约束条件] [FIRST | AFTER 已有字段名];  
  1144.                 1. 增加无完整性约束条件的字段  
  1145.                 2. 增加有完整性约束条件的字段  
  1146.                 3. 表的第一个位置增加字段  
  1147.                 4. 表的指定位置之后增加字段  
  1148.               
  1149.             实例一:  
  1150.                 CREATE TABLE student11 (  
  1151.                     stu_id INT PRIMARY KEY,  
  1152.                     stu_name VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  
  1153.                     content VARCHAR(20) NOT NULL,  
  1154.                     stu_gender BOOLEAN  
  1155.                 ) Engine = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;  
  1156.                 ALTER TABLE student11 ADD phone VARCHAR(20);  
  1157.                 ALTER TABLE student11 ADD birthday TIMESTAMP NOT NULL;  
  1158.                 ALTER TABLE student11 ADD num INT(11) NOT NULL FIRST;  
  1159.                 ALTER TABLE student11 ADD address VARCHAR(30) NOT NULL AFTER phone;   
  1160.         6.3.5 删除字段  
  1161.             删除字段是指删除已经定义好的表中的某个字段。在表创建好之后,如果发现某个字段需要删除。可以采用将整个表都删除,如果发现某个字段需要删除。可以采用将整个表都删除,然后重新创建一张表的做法。这样做是可以达到目的,但必须会影响到表中的数据。而且,操作比较麻烦。MySQL中,ALTER TABLE语句也可以删除表中的字段。其基本语法如下:  
  1162.                 ALTER TABLE 表名 DROP 字段名;  
  1163.             实例一:  
  1164.                 CREATE TABLE student12 (  
  1165.                     stu_id INT PRIMARY KEY,  
  1166.                     stu_name VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  
  1167.                     content VARCHAR(20) NOT NULL,  
  1168.                     stu_gender BOOLEAN  
  1169.                 ) Engine = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;  
  1170.                 ALTER TABLE student12 DROP `content`;  
  1171.         6.3.6 修改字段的排列位置  
  1172.             创建表的时候,字段在表中的排列位置就已经确定了。如果要改变字段在表中的排列位置,则需要ALTER TABLE语句来处理。MySQL中,修改字段排列位置的ALTER TABLE语句的基本语法如下:ALTER TABLE 表名 MODIFY 字段名 数据类型 FIRST | AFTER 字段名2;  
  1173.               
  1174.             1. 字段修改到第一个位置  
  1175.             2. 字段修改到指定位置  
  1176.             实例一:  
  1177.                 CREATE TABLE student13 (  
  1178.                     stu_id INT PRIMARY KEY,  
  1179.                     stu_name VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  
  1180.                     content VARCHAR(20) NOT NULL,  
  1181.                     stu_gender BOOLEAN  
  1182.                 ) Engine = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;  
  1183.                 ALTER TABLE student13 MODIFY content VARCHAR(20) FIRST;  
  1184.                 ALTER TABLE STUDENT13 MODIFY stu_id INT AFTER stu_name;  
  1185.         6.3.7 更改表的存储引擎  
  1186.             MySQL存储引擎是指MySQL数据库中表的存储类型。MySQL存储引擎包括InnoDB、MyISAM、MEMORY等。不同的表类型有着不同的优缺点。在创建表的时候,存储引擎就已经设定好了。如果要改变,可以通过重新创建一张表来实现。这样做是可以达到目的,但必然会影响到表中的数据。而且,操作比较麻烦。  
  1187.                 ALTER TABLE 表名 ENGINE=存储引擎名;  
  1188.             实例一:  
  1189.                 CREATE TABLE student14 (  
  1190.                     stu_id INT PRIMARY KEY,  
  1191.                     stu_name VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  
  1192.                     content VARCHAR(20) NOT NULL,  
  1193.                     stu_gender BOOLEAN  
  1194.                 ) Engine = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;  
  1195.                 ALTER TABLE student14 ENGINE=MyISAM;                  
  1196.         6.3.8 删除表的外键约束  
  1197.             外键是一个特殊字段,其将某一个表与其父表建立关系关系。在创建表的时候,外键约束就已经设定好了。由于特殊需要,与父表之间的关系关系需要去除,要求删除外键约束。MySQL中,ALTER TABLEy语句也可以删除表的外键约束。  
  1198.                 ALTER TABLE 表名 DROP FOREIGN KEY 外键别名;  
  1199.             实例一:  
  1200.                 CREATE TABLE `student15` (  
  1201.                     `id` INT NOT NULL PRIMARY KEY,  
  1202.                     `nameVARCHAR(20) NOT NULL,  
  1203.                     `stu_id` INT,  
  1204.                     CONSTRAINT st_fk FOREIGN KEY(stu_id) REFERENCES student7(stu_id)  
  1205.                 ) Engine = InnoDB ;  
  1206.                 ALTER TABLE `test`.`student15` DROP FOREIGN KEY st_fk;            
  1207.     6.4 删除表的方法  
  1208.         删除表是指删除数据库已经存在的表。删除表时,会删除表中的所有数据。因此,在删除表时特别注意。MySQL中通过DROP TABLE语句来删除表。由创建表时可能存在外键约束,一些表成为了与之关联的表的父表。要删除这些父表,情况比较复杂。  
  1209.               
  1210.             6.4.1 删除没有关系的普通表和被其他关联的父表的方法。  
  1211.                 CREATE TABLE student16 (  
  1212.                     stu_id INT PRIMARY KEY,  
  1213.                     stu_name VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  
  1214.                     content VARCHAR(20) NOT NULL COMMENT '内容',  
  1215.                     stu_gender BOOLEAN  
  1216.                 ) Engine = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;  
  1217.                 DROP TABLE [IF EXISTS] student16;     
  1218.   
  1219.             2.删除被其他表关联的父表  
  1220.                 数据库中某些表之间建立了关联关系。一些表成为了父表,这些表被其子表关联着。要删除这些父表,情况不像上一节那么简单。  
  1221.                 CREATE TABLE `test`.`student17_parent` (  
  1222.                     `id` INT NOT NULL PRIMARY KEY,  
  1223.                     `stu_id` INT,  
  1224.                     `nameVARCHAR(20) NOT NULL                   
  1225.                 ) Engine = InnoDB ;  
  1226.   
  1227.                 CREATE TABLE `student17_child` (  
  1228.                     `id` INT NOT NULL PRIMARY KEY,  
  1229.                     `stu_id` INT UNIQUE,  
  1230.                     `nameVARCHAR(20) NOT NULL,                      
  1231.                     CONSTRAINT parent_fk FOREIGN KEY(stu_id) REFERENCES student17_parent(id) -- id必须是带有索引   
  1232.                 ) Engine = InnoDB;  
  1233.                 DROP TABLE `student17_parent`;  -- 不能删除,因为与这关联的表有外键  
  1234.                 # 先删除外键,然后就可以删除表student17_parent  
  1235.                 ALTER TABLE `student17_child` DROP FOREIGN KEY parent_fk;  
  1236.                 DROP TABLE `student17_parent`;  
  1237.                   
  1238.     6.5 本章实例  
  1239.         在example数据库创建一个student表和一个grade表。  
  1240.         1. 登录数据库系统  
  1241.         2. 选择example数据库  
  1242.         3. 创建student表和grade表  
  1243.         4. 将grade表的course字段的数据类型改为VARCHAR(2)  
  1244.         5. 将s_num字段的位置改到course字段的前面  
  1245.         6. 将grade字段改名为score  
  1246.         7. 删除grade表的存储引擎更改为MyISAM类型  
  1247.         8. 将grade表的存储引擎更改为MyISAM类型  
  1248.         9. 将student表的address字段删除  
  1249.         10.在studnet表中增加名为phone的字段  
  1250.         11.将grade表改名为gradeInfo  
  1251.         12.删除student表         
  1252.     6.6 上机实践  
  1253.         1. 操作teacher表  
  1254.             题目要求:本题将school数据库创建一个teacher表。  
  1255.                           
  1256.                         teacher表的结构  
  1257.   
  1258.             字段名 字段描述    数据类型    主键  外键  非空  唯一  自增  
  1259.             id  编号      INT(4)      是   否   是   是   是     
  1260.             num 教工号     INT(10)     否   否   是   是   否     
  1261.             name    姓名      VARCHAR(20) 否   否   是   否   否     
  1262.             gender  姓别      TINYINT(1)  否   是   是   否   否  
  1263.             birthday出生日期    DATETIME/INT(11)否   否   否   否   否     
  1264.             address 家庭住址    VARCHAR(50) 否   否   否   否   否  
  1265.               
  1266.             按照下表要求进行操作:  
  1267.                 (1) 创建数据库school  
  1268.                 (2) 创建teacher表  
  1269.                 (3) 将teacher表的name字段的数据类型改为VARCHAR(30)  
  1270.                 (4) 将birthday字段的位置改到gender字段的前面  
  1271.                 (5) 将num字段改名为t_id  
  1272.                 (6) 将teacher表的address字段删除  
  1273.                 (7) 在teacher表中增加名为wages的字段,数据类型为FLOAT  
  1274.                 (8) 将birthday字段类型改为DATE  
  1275.                 (9) 将teacher表改名为teacherInfo  
  1276.                 (10) 将teacher表的存储引擎更必为MyISAM类型  
  1277.                   
  1278.             /*  
  1279.                 CREATE DATABASE IF NOT EXISTS school;  
  1280.                 USE school;  
  1281.                 CREATE TABLE IF NOT EXISTS teacher(  
  1282.                     id INT(4) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT COMMENT '编号',  
  1283.                     num INT(10) NOT NULL UNIQUE COMMENT '教工号',  
  1284.                     name VARCHAR(20) NOT NULL COMMENT '姓名',  
  1285.                     gender TINYINT(1) NOT NULL COMMENT '姓别',  
  1286.                     birthday DATETIME COMMENT '出生日期',  
  1287.                     address VARCHAR(50) COMMENT '家庭住址'            
  1288.                 ) Engine=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;  
  1289.                 ALTER TABLE `school`.`teacher` MODIFY name VARCHAR(30);  
  1290.                 ALTER TABLE `school`.`teacher` MODIFY birthday DATETIME AFTER name;  
  1291.                 ALTER TABLE `school`.`teacher` CHANGE num t_id INT(10);           
  1292.                 ALTER TABLE `school`.`teacher` DROP address;  
  1293.                 ALTER TABLE `school`.`teacher` ADD wages FLOAT;  
  1294.                 ALTER TABLE `school`.`teacher` MODIFY birthday DATE;  
  1295.                 ALTER TABLE `teacher` RENAME teacherInfo;  
  1296.                 SHOW GREATE TABLE teacher \G  
  1297.                 ALTER TABLE `teacherInfo` ENGINE=MyISAM;                  
  1298.             */        
  1299.         2. 操作department表和worker表  
  1300.             题目要求:本题将example数据库创建一个department表和一个worker表。  
  1301.                   
  1302.                         department表的结构  
  1303.   
  1304.             字段名 字段描述    数据类型    主键  外键  非空  唯一  自增  
  1305.             d_id    部门号     INT(4)      是   否   是   是   否  
  1306.             d_name  部门名     VARCHAR(20) 否   否   是   是   否  
  1307.             function部门职能    VARCHAR(50) 否   否   否   否   否     
  1308.             address 部门位置    VARCHAR(50) 否   否   否   否   否     
  1309.                           
  1310.                         workder表的结构  
  1311.   
  1312.             字段名 字段描述    数据类型    主键  外键  非空  唯一  自增  
  1313.             id  编号      INT(4)      是   否   是   是   是  
  1314.             num 员工编号    INT(10)     否   否   是   是   否  
  1315.             d_id    部门号     INT(50)     否   是   否   否   否     
  1316.             name    姓名      VARCHAR(20) 否   否   是   否   否     
  1317.             gender  姓别      BOOLEAN     否   否   是   否   否     
  1318.             birthday出生日期    DATE        否   否   否   否   否     
  1319.             address 家庭住址    VARCHAR(50) 否   否   否   否   否     
  1320.               
  1321.             按照下列要求进行表操作:  
  1322.                 (1) example数据库下创建department表和worker表  
  1323.                 (2) 删除department表  
  1324.   
  1325.                 CREATE DATABASE IF NOT EXISTS example;  
  1326.                 USE example;  
  1327.                 CREATE TABLE IF NOT EXISTS department(  
  1328.                     d_id INT(4) NOT NULL UNIQUE PRIMARY KEY COMMENT '部门号',  
  1329.                     d_name VARCHAR(20) NOT NULL UNIQUE COMMENT '部门名',  
  1330.                     `functionVARCHAR(50) COMMENT '部门职能',  
  1331.                     address VARCHAR(50) COMMENT '家庭住址'            
  1332.                 ) Engine=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;  
  1333.   
  1334.                 CREATE TABLE IF NOT EXISTS worker(  
  1335.                     id INT(4) NOT NULL UNIQUE PRIMARY KEY COMMENT '编号',  
  1336.                     num INT(10) NOT NULL UNIQUE COMMENT '员工编号',  
  1337.                     d_id INT(50) NOT NULL COMMENT '部门号',                  
  1338.                     name VARCHAR(20) NOT NULL COMMENT '姓名',  
  1339.                     gender TINYINT(1) NOT NULL COMMENT '姓别',  
  1340.                     birthday DATE COMMENT '出生日期',  
  1341.                     address VARCHAR(50) COMMENT '家庭住址',  
  1342.                     CONSTRAINT w_fk FOREIGN KEY(d_id) REFERENCES department(d_id) # 外键    
  1343.                 ) Engine=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;  
  1344.   
  1345.                 DROP TABLE IF EXISTS department; -- 不能删除department表  
  1346.                 # 删除外键  
  1347.                 ALTER TABLE worker DROP FOREIGN KEY w_fk;  
  1348.                 DROP TABLE IF EXISTS department;  
  1349.     6.7 常见问题及解答  
  1350.         1. 字段改名后,为什么会有部分约束条件丢失?(change:需要设置原字段约束条件)  
  1351.         2. 如何设置外键? (CONSTARINT fk_name FREIGN KEY(filed_name) REFEREANCE P_TBL_NAME(p_fld_name));  
  1352.         3. 为什么自增字段不能设置默认值?  
  1353.         4. 如何删除父表?(1.先删除子表外键,然后再删除父表)  
  1354.       
  1355.   
  1356. 7 索引   
  1357.     索引是一种特殊的数据库结构,可以用来快速查询数据库中的特定记录。索引是提高数据库性能的重要方式。MySQL中,所有的数据类型都可以被索引。MySQL的索引包括普通索引、惟一性索引、全文索引、单列索引、多列索引和空间索引等。  
  1358.         - 索引的含义和特点  
  1359.         - 索引的分类  
  1360.         - 如何设计索引  
  1361.         - 如何创建索引  
  1362.         - 如何删除索引  
  1363.           
  1364.         7.1 索引简介  
  1365.             索引由数据库表中一列或多列组合而成,其作用是提高对数据的查询速度。  
  1366.             本章将详细讲解索引的含义、作用、分类和设计索引的原则。  
  1367.   
  1368.             7.1.1 索引的含义和特点  
  1369.                 索引是创建在表上的,是对数据库中一列或多列的值进行排序的一种结构。索引可以提高查询的速度。本小节将详细讲解索引的含义、作用、优缺点。索引有明显的优势,也有其不可避免的缺点。  
  1370.                   
  1371.                 索引的优点和缺点  
  1372.                     - 索引的优点:   
  1373.                         可以提高检索数据的速度,这是创建索引的最主要的原因;对于有依赖关系的子表和父表之间联合查询时,可以提高查询速度;使用分组和排序子句进行数据查询时,同样可以显著节省查询中分组和排序的时间。             
  1374.                     - 索引的缺点:  
  1375.                         创建和维护索引需要耗费时间,耗费时间的数量随着数据量的增加而增加;索引需要占用物理空间,每一个索引要占一定的物理空间;增加、删除和修改数据时,要动态的维护索引,造成数据的维护速度降低了。  
  1376.             7.1.2 索引的分类  
  1377.                 7.1.2.1 普通索引  
  1378.                     在创建普通索引时,不附加任何限制条件。这类索引可以创建在任何数据类型上,其值是否唯一和非空由字段本身的完整性约束条件决定。建立索引以后,查询时可以通过索引进行查询。  
  1379.                 7.1.2.2 惟一性索引  
  1380.                     使用UNIQUE参数可以设置索引为惟一性索引。在创建惟一性索引时,限制该索引的值必须是惟一的。通过惟一性索引,可以更快速的确定某条记录。主键就是一种特殊惟一性索引。  
  1381.                 7.1.2.3 全文索引  
  1382.                     使用FULLTEXT参数可以设置索引为全文索引。全文索引只能创建在CHARVARCHAR、TEXT类型的字段上。查询数据量较大的字符串类型字段时,使用全文索引可以提高查询速度。(如新闻内容)  
  1383.                 7.1.2.4 单列索引  
  1384.                     在表中的单个字段上创建索引。单列单过只根据该字段进行索引。单列索引可以是普通索引,也可以是惟一性索引,还可以是全文索引。只要保证索引只对应一个字段即可。  
  1385.                 7.1.2.5 多列索引  
  1386.                     多列索引是在表的多个字段上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中使用这些字段中第一个字段时,索引才会被使用。例如,在表中的id、name和gender字段上建立一个多列索引,那么,只能查询条件使用了id字段时该索引才会被使用。  
  1387.                 7.1.2.2 空间索引  
  1388.                     使用SPATIAL参数可以设置索引为空间索引。空间索引只能建立在空间数据类型上,这样可以提高系统获取空间数据的效率。空间数据类型包括CEOMETRY、POINT、LINESTRING、POLYGON等。目前只有MyISAM存储引擎支持空间检索。这类索引很少会用到。  
  1389.             7.1.3 索引的设计原则  
  1390.                 为了使索引的使用效率更高,在创建索引的时候必须考虑在哪些字段上创建索引和创建什么类型的索引。  
  1391.   
  1392.                 1. 选择惟一性索引  
  1393.                     惟一性索引的的值是惟一的,可以更快的通过该索引来确定某条记录。例如,学生表中学号是具有惟一性的字段。为该字段建立惟一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。       
  1394.                 2. 为经常需要排序、分组和联合操作的字段建立索引  
  1395.                     经常需要排序、分组和联合操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。   
  1396.                 3. 为常作为查询条件的字段建立索引  
  1397.                     如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。  
  1398.                 4. 限制索引的数目  
  1399.                     索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。  
  1400.                 5. 尽量使用数据量少的索引  
  1401.                     如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要时间肯定要比对CHAR(10)类型字段需要的时间要多。  
  1402.                 6. 尽量使用前缀来索引  
  1403.                     如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLoB类型的字段,进行全文检索会浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。  
  1404.                 7. 删除不再使用或者很少使用的索引  
  1405.                     表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再被需要。数据库管理员应当定期找出这些索引,将它们删除,人而减少索引对更新操作的影响。  
  1406.         7.2 创建索引  
  1407.             创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。创建索引有三种方式,这三种方式分别是创建表的时候创建索引、在已经存在的表上创建索引和使用ALTER TABLE语句来创建索引。  
  1408.             7.2.1 创建表的时候创建索引   
  1409.                 创建表的时候可以直接创建索引。  
  1410.                 CREATE TABLE 表名(  
  1411.                     字段名 数据类型[完整性约束条件],  
  1412.                     字段名 类型类型[完整性约束条件]  
  1413.                 );  
  1414.                 1. 创建普通索引  
  1415.                     CREATE TABLE index_tbl_1 (  
  1416.                         id INT,  
  1417.                         name VARCHAR(20),  
  1418.                         gender BOOLEAN,  
  1419.                         INDEX(id)  
  1420.                     );  
  1421.   
  1422.                 2. 创建惟一性索引  
  1423.                     CREATE TABLE index_tbl_2 (  
  1424.                         id INT UNIQUE,  
  1425.                         name VARCHAR(20),  
  1426.                         gender BOOLEAN,  
  1427.                         UNIQUE INDEX unique_idx(id ASC-- 一般不需要建立唯一性索引  
  1428.                     );  
  1429.   
  1430.                 3. 创建全文索引  
  1431.                     CREATE TABLE index_tbl_3 (  
  1432.                         id INT,  
  1433.                         info VARCHAR(20),  
  1434.                         FULLTEXT INDEX idx_info(info)  
  1435.                     ) ENGINE=MyISAM; -- MyISAM存储引擎才能支持全文索引    
  1436.                       
  1437.                 4. 创建单列索引  
  1438.                     CREATE TABLE index_tbl_4 (  
  1439.                         id INT,  
  1440.                         subject VARCHAR(30),  
  1441.                         INDEX idx_sbj(subject(10))  
  1442.                     );    
  1443.                       
  1444.                 5. 创建多列索引  
  1445.                     CREATE TABLE index_tbl_5 (  
  1446.                         id INT,  
  1447.                         name VARCHAR(20),  
  1448.                         subject VARCHAR(30),  
  1449.                         INDEX idx_m(name(10), subject(10))  
  1450.                     );  
  1451.   
  1452.                     INSERT INTO `test`.`index_tbl_5` (`id`, `name`, `subject`) VALUES (NULL'php''this is php content'), (NULL'mysql''this is mysql content');  
  1453.   
  1454.                     # 使用索引idex_m多列索引,因为name字段是第一个索引  
  1455.                     EXPLAIN SELECT * FROM index_tbl_5 WHERE name='a' \G  
  1456.                     analyze table来更新表的统计信息  
  1457.   
  1458.                 6. 创建空间索引      
  1459.                     CREATE TABLE index_tbl_6 (  
  1460.                         id INT,  
  1461.                         space GEOMETRY NOT NULL,  
  1462.                         SPATIAL INDEX idx_sp(space)  
  1463.                     ) ENGINE=MyISAM;  
  1464.   
  1465.             7.2.2 已经存在的表上创建索引  
  1466.                 在已经存在的表上,可以直接为表上的一个或几个字段创建索引。基本形式如下 :  
  1467.                 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名   
  1468.                 ON 表名(字段[(长度)][ASC|DESC])  
  1469.                   
  1470.                 1. 创建普通索引  
  1471.                     CREATE TABLE index1_tbl_1 (  
  1472.                         id INT,  
  1473.                         name VARCHAR(20),  
  1474.                         gender BOOLEAN  
  1475.                     );  
  1476.                     CREATE INDEX idx on index1_tbl_1(id);  
  1477.                     SHOW CREATE TABLE index1_tbl_1;  
  1478.                 2. 创建惟一性索引  
  1479.                     CREATE TABLE index1_tbl_2 (  
  1480.                         id INT,  
  1481.                         name VARCHAR(20),  
  1482.                         gender BOOLEAN                    
  1483.                     );  
  1484.                     CREATE UNIQUE INDEX u_idx ON index1_tbl_2(id ASC);  
  1485.   
  1486.                 3. 创建全文索引  
  1487.                     CREATE TABLE index1_tbl_3 (  
  1488.                         id INT,  
  1489.                         info VARCHAR(20)                      
  1490.                     ) ENGINE=MyISAM;   
  1491.                     CREATE FULLTEXT INDEX f_idx ON index1_tbl_3(info(10));  
  1492.                       
  1493.                 4. 创建单列索引  
  1494.                     CREATE TABLE index1_tbl_4 (  
  1495.                         id INT,  
  1496.                         subject VARCHAR(30)  
  1497.                     );  
  1498.                     CREATE INDEX idx_sbj ON index1_tbl_4(subject(10));  
  1499.                 5. 创建多列索引  
  1500.                     CREATE TABLE index1_tbl_5 (  
  1501.                         id INT,  
  1502.                         name VARCHAR(20),  
  1503.                         subject VARCHAR(30)               
  1504.                     );  
  1505.                     CREATE INDEX idx ON index1_tbl_5(name(5),subject(10));  
  1506.                       
  1507.   
  1508.                 6. 创建空间索引      
  1509.                     CREATE TABLE index1_tbl_6 (  
  1510.                         id INT,  
  1511.                         space GEOMETRY NOT NULL  
  1512.                     ) ENGINE=MyISAM;  
  1513.                     CREATE SPATIAL INDEX idx_sp ON index1_tbl_6(space);  
  1514.               
  1515.             7.2.3 ALTER TABLE语句来创建索引  
  1516.                 在已经存在的表上,可以通过ALTER TABLE语句直接为表上的一个或几个字段创建索引。基本形式如下:  
  1517.                 ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX  
  1518.                 索引名 (字段名[(长度)][ASC|DESC]);  
  1519.   
  1520.                 1. 创建普通索引  
  1521.                     CREATE TABLE index2_tbl_1 (  
  1522.                         id INT,  
  1523.                         name VARCHAR(20),  
  1524.                         gender BOOLEAN  
  1525.                     );  
  1526.                     ALTER TABLE index2_tbl_1 ADD INDEX  
  1527.                     idx (id);  
  1528.   
  1529.                 2. 创建惟一性索引  
  1530.                     CREATE TABLE index2_tbl_2 (  
  1531.                         id INT,  
  1532.                         name VARCHAR(20),  
  1533.                         gender BOOLEAN                    
  1534.                     );  
  1535.                     ALTER TABLE index2_tbl_2 ADD UNIQUE INDEX  
  1536.                     u_idx (id ASC);  
  1537.   
  1538.                 3. 创建全文索引  
  1539.                     CREATE TABLE index2_tbl_3 (  
  1540.                         id INT,  
  1541.                         info VARCHAR(20)                      
  1542.                     ) ENGINE=MyISAM;   
  1543.                     ALTER TABLE index2_tbl_3 ADD FULLTEXT INDEX  
  1544.                     f_idx(info(10));      
  1545.                       
  1546.                 4. 创建单列索引  
  1547.                     CREATE TABLE index2_tbl_4 (  
  1548.                         id INT,  
  1549.                         subject VARCHAR(30)  
  1550.                     );  
  1551.                     ALTER TABLE index2_tbl_4 ADD INDEX   
  1552.                     idx_sbj(subject(10));  
  1553.   
  1554.                 5. 创建多列索引  
  1555.                     CREATE TABLE index2_tbl_5 (  
  1556.                         id INT,  
  1557.                         name VARCHAR(20),  
  1558.                         subject VARCHAR(30)               
  1559.                     );  
  1560.                     ALTER TABLE index2_tbl_5 ADD INDEX  
  1561.                     idx_m (name(5), subject(10));                 
  1562.   
  1563.                 6. 创建空间索引      
  1564.                     CREATE TABLE index2_tbl_6 (  
  1565.                         id INT,  
  1566.                         space GEOMETRY NOT NULL  
  1567.                     ) ENGINE=MyISAM DEFAULT CHARSET=utf8;  
  1568.                     ALTER TABLE index2_tbl_6 ADD SPATIAL INDEX  
  1569.                     idx_sp(space);  
  1570.         7.3 删除索引  
  1571.             删除索引是指将表中已经存在的索引删除掉。一些不再使用的索引会降低表的更新速度,影响数据库的性能。对于这样的索引,应该将其删除。  
  1572.   
  1573.             对应已经存在的索引,可以通过DROP语句来删除索引。基本形式如下:  
  1574.                 DROP INDEX 索引名 ON 表名;  
  1575.         7.4 本章实例  
  1576.             在job数据库创建一个user表和一个information表。  
  1577.             1. 登录数据库系统并创建job数据库  
  1578.             2. 创建user表  
  1579.             3. 创建information表  
  1580.             4. 在name字段创建名为index_name的索引  
  1581.             5. 创建名为index_bir的多列索引  
  1582.             6. 用ALTER TABLE语句创建名为index_id的惟一性  
  1583.             7. 删除user表上的index_user索引  
  1584.             8. 删除information表上的index_name索引  
  1585.   
  1586.                         user表的结构  
  1587.   
  1588.             字段名 字段描述    数据类型    主键  外键  非空  唯一  自增  
  1589.             userid  编号      INT(10)     是   否   是   是   是  
  1590.             username用户名     VARCHAR(20) 否   否   是   否   否  
  1591.             passwd  密码      VARCHAR(20) 否   否   是   否   否  
  1592.             info    附加信息    TEXT        否   否   否   否   否  
  1593.   
  1594.                         information表的结构  
  1595.   
  1596.             字段名 字段描述    数据类型    主键  外键  非空  唯一  自增  
  1597.             id  编号      INT(10)     是   否   是   是   是  
  1598.             namne   姓名      VARCHAR(20) 否   否   是   否   否  
  1599.             gender  姓别      TINYINT(1)  否   否   是   否   否  
  1600.             birthday出生日期    DATE        否   否   否   否   否  
  1601.             address 家庭住址    VARCHAR(50) 否   否   否   否   否  
  1602.             tel 电话号码    VARCHAR(20) 否   否   否   否   否  
  1603.             pic 照片      BLOB        否   否   否   否   否  
  1604.   
  1605.   
  1606.             CREATE DATABASE IF NOT EXISTS job;  
  1607.             USE job;  
  1608.             CREATE TABLE IF NOT EXISTS user(  
  1609.                 userid  INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT COMMENT '编号',  
  1610.                 username VARCHAR(20) NOT NULL COMMENT '用户名',  
  1611.                 passwd  VARCHAR(32) NOT NULL COMMENT '密码',  
  1612.                 info TEXT COMMENT '附加信息',  
  1613.                 UNIQUE INDEX idx_uid(userid DESC),  
  1614.                 INDEX idx_user(username, passwd),  
  1615.                 FULLTEXT INDEX idx_info(info)  
  1616.             ) ENGINE=MyISAM DEFAULT CHARSET=utf8;  
  1617.               
  1618.             DROP INDEX userid ON user;  
  1619.             DROP INDEX idx_uid ON user;  
  1620.             ALTER TABLE user DROP INDEX userid;  
  1621.             ALTER TABLE user DROP INDEX idx_uid;      
  1622.               
  1623.             DROP INDEX idx_user ON user;  
  1624.             ALTER TABLE user DROP INDEX idx_user;  
  1625.                           
  1626.             CREATE DATABASE IF NOT EXISTS job;  
  1627.             USE job;  
  1628.             CREATE TABLE IF NOT EXISTS information(  
  1629.                 id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT COMMENT '编号',  
  1630.                 name VARCHAR(20) NOT NULL COMMENT '姓名',  
  1631.                 gender BOOLEAN NOT NULL COMMENT '姓别',  
  1632.                 birthday DATE COMMENT '出生日期',  
  1633.                 address VARCHAR(50) COMMENT '家庭住址',  
  1634.                 tel VARCHAR(20) COMMENT '电话号码',  
  1635.                 pic BLOB COMMENT '照片'                 
  1636.             ) ENGINE=MyISAM DEFAULT CHARSET=utf8;  
  1637.   
  1638.             DROP INDEX id ON information;  
  1639.   
  1640.             CREATE INDEX index_name ON information(name(10));  
  1641.             ALTER TABLE information ADD INDEX idx_name(name(10));   
  1642.   
  1643.               
  1644.             CREATE INDEX index_bir ON information(birthday,address);  
  1645.             ALTER TABLE information ADD INDEX index_bir(birthday,address);  
  1646.   
  1647.             ALTER TABLE information ADD INDEX index_id(id ASC);  
  1648.   
  1649.             DROP INDEX idx_name ON information;  
  1650.   
  1651.             SHOW CREATE TABLE user;  
  1652.             SHOW CRETAE TABLE information;  
  1653.         7.5 上机实践  
  1654.             在数据库job下创建workInfo表。创建表的同时在id字段上创建名为index_id的惟一性索引,而且也降序的格式排列。  
  1655.   
  1656.             字段名 字段描述    数据类型    主键  外键  非空  唯一  自增  
  1657.             id  编号      INT(10)     是   否   是   是   是  
  1658.             name    职位名称    VARCHAR(20) 否   否   是   否   否  
  1659.             type    职位类别    VARCHAR(10) 否   否   否   否   否     
  1660.             address 工作地址    VARCHAR(50) 否   否   否   否   否  
  1661.             wages   工资      FLOAT       否   否   否   否   否  
  1662.             contents工作内容    TINYTEXT    否   否   否   否   否     
  1663.             extra   附加信息    TEXT        否   否   否   否   否  
  1664.               
  1665.             CREATE DATABASE IF NOT EXISTS job;  
  1666.             USE job;  
  1667.             CREATE TABLE workInfo(  
  1668.                 id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,  
  1669.                 name VARCHAR(20) NOT NULL,  
  1670.                 type VARCHAR(10),  
  1671.                 address VARCHAR(50),  
  1672.                 wages FLOAT,  
  1673.                 contents TINYTEXT,  
  1674.                 extra TEXT,  
  1675.                 INDEX index_id(id DESC)  
  1676.             ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
  1677.             CREATE INDEX index_name ON workInfo(name(10));  
  1678.             SHOW CREATE TABLE workInfo \G  
  1679.             ALTER TABLE workInfo ADD INDEX index_t(type,address);  
  1680.             ALTER TABLE workInfo ENGINE=MyISAM;  
  1681.             ALTER TABLE workInfo ADD FULLTEXT INDEX index_ext(extra);             
  1682.         7.6 常见问题及解答  
  1683.             1. MySQL中索引、主键和惟一性的区别是什么?  
  1684.                 索引建立在一个或者多个字段上。建立了索引后,表中的数据就按照索引的一定规则排列。这样可以提高查询速度。  
  1685.                   
  1686.                 主键是表中数据的唯一标识。不同的记录的主键值不同。在建立主键的时候,系统会自动建立一个惟一性索引。  
  1687.       
  1688.                 唯一性也是建立在表中一个或者几个字段上。其目的是为了对于不同的记录,具有唯一性的字段的值是不同的。  
  1689.             2. 表中建立了索引以后,导入大量数据为什么会很慢?  
  1690.   
  1691. 8 视图  
  1692.   
  1693. 9 触发器  
  1694.   
  1695. 10 查询数据  
  1696.   
  1697. 11 插入、更新和删除数据  
  1698.   
  1699. 12 MysQL运算符  
  1700.   
  1701. 13 MySQL函数  
  1702.   
  1703. 14 存储过程和函数  
  1704.   
  1705. 15 MySQL用户管理  
  1706.   
  1707. 16 数据备份与还原  
  1708.   
  1709. 17 MySQL日志  
  1710.   
  1711. 18 性能优化  
  1712.   
  1713. 19 Java访问MySQL数据库  
  1714.   
  1715. 20 PHP访问MySQL数据库  
  1716.   
  1717. 21 C#访问MySQL数据库  
  1718.   
  1719. 22 驾校管理系统 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值