龙之介大人

LAMP的搭建与MariaDB的基础使用
LAMP 搭建LAMP指的Linux(操作系统)、ApacheHTTP 服务器,MySQL(有时也指MariaDB...
扫描右侧二维码阅读全文
25
2019/12

LAMP的搭建与MariaDB的基础使用

LAMP 搭建

LAMP指的Linux(操作系统)、ApacheHTTP 服务器,MySQL(有时也指MariaDB,数据库软件) 和PHP(有时也是指Perl或Python) 的第一个字母。LAMP便成了一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。

  • 静态资源:静态内容;客户端从服务器获得的资源的表现形式与原文件相同;
  • 动态资源:通常是程序文件,需要在服务器执行之后,将执行的结果返回给客户端;
  • CGI: Common Gateway Interface(简化版的http协议)

LAMP安装

CtentOS 7:yum install httpd php php-mysql mariadb-server mariadb

CtentOS 6:yum install httpd php mysql-server php-mysql

注意:httpd的event和worker模式的php模块是不一样的.php要求httpd使用prefork MPM

#1. 安装mariadb
#检查是否安装
[root@master ~]# rpm -qa mariadb
mariadb-5.5.64-1.el7.x86_64
[root@master ~]# rpm -qa mariadb-server
mariadb-server-5.5.64-1.el7.x86_64
#查找启动服务文件名
[root@master ~]# rpm -ql mariadb-server | grep service
/usr/lib/systemd/system/mariadb.service

#启动mariadb
[root@master ~]# systemctl start mariadb.service 
[root@master ~]# systemctl status mariadb.service 
[root@master ~]# ss -tnl 
State      Recv-Q Send-Q            Local Address:Port                           Peer Address:Port                              
LISTEN     0      50                            *:3306                                      *:* 

#2. 安装php
[root@master ~]# rpm -q php
php-5.4.16-46.1.el7_7.x86_64

[root@master ~]# rpm -ql php
/etc/httpd/conf.d/php.conf
/etc/httpd/conf.modules.d/10-php.conf
/usr/lib64/httpd/modules/libphp5.so
/usr/share/httpd/icons/php.gif
/var/lib/php/session

#3. 启动httpd查看是否加载php模块
[root@master ~]# systemctl start httpd.service  
[root@master ~]# ss -tnl 
State      Recv-Q Send-Q            Local Address:Port                           Peer Address:Port                             
LISTEN     0      50                            *:3306                                      *:*                                
LISTEN     0      128                        [::]:80                                     [::]:*   
[root@master ~]# httpd -M
 php5_module (shared)

#4. 测试配置的结果
[root@master html]# cd /www/html/
[root@master html]# mv index.html index.php
[root@master html]# echo "<?php phpinfo();?>" > index.php 
[root@master html]# elinks 127.0.0.1 #返回phpinfo的正确信息说明配置好了
                             phpinfo() (1/18) 
   PHP Logo                                          
   PHP Version 5.4.16                                                                                             
              System                     Linux master 3.10.0-1062.4.3.el7.x86_64 #1 SMP Wed Nov 13                
                                         23:58:53 UTC 2019 x86_64                                                 
              Build Date                 Nov 1 2019 16:05:03                                                      
              Server API                 Apache 2.0 Handler                                                       
              Virtual Directory Support  disabled                                                                 
              Configuration File         /etc                                                                     
              (php.ini) Path                                                                                      
              Loaded Configuration File  /etc/php.ini                                                             
              Scan this dir for          /etc/php.d     
.....

#5. php连接mysql服务器测试
[root@master html]# vim index.php      
<?php
$conn = mysql_connect('127.0.0.1','mysql','');
if($conn){
    echo "success";
    echo "  $conn";
}else{
    echo "failure";
}
mysql_close();
?>

#测试结果
[root@develop-vscode ~]# curl 10.10.1.109
success  Resource id #2

#6. 关闭mariadb测试
[root@develop-vscode ~]# curl 10.10.1.109
failure
  • 请求流程:Client --> (http) --> httpd --> (cgi) --> application server (program file) --> (mysql) --> mariadb

安装typecho

[root@master html]# wget http://typecho.org/downloads/1.1-17.10.30-release.tar.gz
[root@master html]# tar -xf 1.1-17.10.30-release.tar.gz 
[root@master html]# mv build/* .

#创建用户以及数据库
MariaDB [(none)]> GRANT ALL ON typecho.* TO 'typecho'@'127.0.0.1' IDENTIFIED BY 'passwd';
MariaDB [(none)]> CREATE DATABASE typecho;
#登录web安装界面安装后即可访问

安装phpMyadmin

[root@master html]#wget https://files.phpmyadmin.net/phpMyAdmin/4.4.15.10/phpMyAdmin-4.4.15.10-all-languages.zip
[root@master html]#unzip phpMyAdmin-4.4.15.10-all-languages.zip 
[root@master html]#mv phpMyAdmin-4.4.15.10-all-languages pma
[root@master html]#cd pma/
[root@master html]#cp config.sample.inc.php config.inc.php
[root@master html]## tr -d 'a-zA-Z0-9' < /dev/urandom | head -30 | md5sum #生成随机字符串用于加密
[root@master html]#vim config.inc.php 
$cfg['blowfish_secret'] = '2b7da3047161c0388aeb7364618e7752'; #添加随机字符串到这里

#安装mbstring
[root@master pma]# yum install php-mbstring
[root@master pma]# systemctl restart httpd.service

#测试安装结果
[root@develop-vscode ~]# elinks 10.10.1.109/pma/
                              phpMyAdmin                                                    
                        Welcome to phpMyAdmin                                               
   Javascript must be enabled past this point!                                                                    
   Language[English_________________________]                                                                     
   Log inDocumentation                                                                                            
   Username: _________________________                                                                            
   Password: _________________________                                                                            
   [ Go ]

LAMP的部署

PHP

  • PHP的Opcode
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引Zend):
  • 1、Scanning(Lexing) —— 将PHP代码转换为语言片段(Tokens)
  • 2、Parsing —— 将Tokens转换成简单而有意义的表达式
  • 3、Compilation —— 将表达式编译成Opocdes
  • 4、Execution —— 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能
扫描-->分析-->编译-->执行
  • php的加速器
基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。由此也可以看出,这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的。常见的php加速器有:
  • 1、APC (Alternative PHP Cache)

  • 2、eAccelerator

    • 源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。项目地址, http://eaccelerator.net/
  • 3、XCache

  • 4、Zend Optimizer和Zend Guard Loader

    • Zend Optimizer并非一个opcode加速器,它是由Zend Technologies为PHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 而Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展。项目地址,http://www.zend.com/en/products/guard/runtime-decoders
  • 5、NuSphere PhpExpress

  • PHP源码目录结构
PHP的源码在结构上非常清晰。其代码根目录中主要包含了一些说明文件以及设计方案,并提供了如下子目录:
+ 1、build —— 顾名思义,这里主要放置一些跟源码编译相关的文件,比如开始构建之前的buildconf脚本及一些检查环境的脚本等。
+ 2、ext —— 官方的扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现。 个人开发的扩展在测试时也可以放到这个目录,以方便测等。
+ 3、main —— 这里存放的就是PHP最为核心的文件了,是实现PHP的基础设施,这里和Zend引擎不一样,Zend引擎主要实现语言最核心的语言运行环境。
+ 4、Zend —— Zend引擎的实现目录,比如脚本的词法语法解析,opcode的执行以及扩展机制的实现等等。
+ 5、pear —— PHP 扩展与应用仓库,包含PEAR的核心文件。
+ 6、sapi —— 包含了各种服务器抽象层的代码,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。
+ 7、TSRM —— PHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏通常是对TSRM的封装,TSRM(Thread Safe Resource Manager)线程安全资源管理器。
+ 8、tests —— PHP的测试脚本集合,包含PHP各项功能的测试文件。
+ 9、win32 —— 这个目录主要包括Windows平台相关的一些实现,比如sokcet的实现在Windows下和*Nix平台就不太一样,同时也包括了Windows下编译PHP相关的脚本。

php配置文件

  • 配置文件:/etc/php.ini, /etc/php.d/*.ini
配置文件(php.ini)在PHP启动时被读取。对于服务器模块版本的PHP,仅在web服务器启动时读取一次。
对于CGI和CLI 版本,每次调用都会读取。
#查看php的配置文件路径
[root@master html]# rpm -qa | grep php
php-common-5.4.16-46.1.el7_7.x86_64
php-cli-5.4.16-46.1.el7_7.x86_64
php-mysql-5.4.16-46.1.el7_7.x86_64
php-mbstring-5.4.16-46.1.el7_7.x86_64
php-pdo-5.4.16-46.1.el7_7.x86_64
php-5.4.16-46.1.el7_7.x86_64

[root@master html]# rpm -qc php-common
/etc/php.d/curl.ini
/etc/php.d/fileinfo.ini
/etc/php.d/json.ini
/etc/php.d/phar.ini
/etc/php.d/zip.ini
/etc/php.ini

#配置文件解析
# ini:
#   [Foo]: Secion Header
#   directive = value
#   ; : 注释符;
# https://www.php.net/manual/zh/  #详细配置参考官网
# php.ini核心配置选项:http://php.net/manual/zh/ini.core.php
# php.ini配置选项列表:http://php.net/manual/zh/ini.list.php

MariaDB(MySQL)

  • 数据结构模型:层次模型、网状结构、关系模型
  • 关系模型:

    • 二维关系:row, column
  • 数据库管理系统:DBMS

    • 关系:Relational,RDBMS

DB DBMS DBA DBS 概念

  • DB、DBMS、DBA、DBS概念:

    数据库(Data Base,DB): 是按一定结构组织并长期存储在计算机内的、可共享的大量数据的有机集合。其实就是存放数据的仓库,只不过这些数据存在一定的关联、并按一定的格式存放在计算机上。例如,把一个学校的学生、课程、学生成绩等数据有序的组织并存放在计算机内,就可以构成一个数据库。

DBMS六个基本功能:
数据定义(Data Definition):提供了数据定义语言(Data Definition Language,DDL)。
数据操纵(Data Manipulation):提供数据操纵语言(Data Manipulation Language,DML)。
访问控制(Access Control):提供了数据控制语言(Data Control Language)。
完整性约束检查(Integrity Constraint Check)
并发控制(Concurrency Control)

共享数据库允许多个用户和程序并发的访问数据库,这就可能引起冲突,导致数据不一致。因此DBMS应用有并发控制的功能,确保试图更新同一数据的多个用户能以一种受控方式完成各自的工作,即避免并发操作时可能带来的数据的不一致性。

数据库恢复(Database Recovery)

数据库管理系统(Data Base Management System,DBMS): 是管理和维护数据库的系统软件。常用的DBMS有:Oracle、DB2、SqlServer、MySql等

数据库管理员(Date Base Administrator ,DBA):管理操作数据库人员。

数据库系统(Data Base System,DBS): 是实现有组织的、动态地存储大量关联数据、方便多用户访问的计算机软件、硬件和数据资源组成的系统,简化为:DBS=计算机系统(硬件、软件平台、人)+DBMS+DB

DBS的四个特点:整体数据结构化,数据的共享度高,数据的独立性高,高度的数据控制能

RDBMS基础概念

  • 数据库的基础概念
补充材料:RDMBS设计范式基础概念
    设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
     目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。

(1) 第一范式(1NF)
    所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。

    说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。

(2) 第二范式(2NF)
    第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。

    第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。

(3) 第三范式(3NF)
    第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。

RDBMS:
    MySQL: MySQL, MariaDB, Percona-Server
    PostgreSQL: 简称为pgsql --> EnterpriseDB
    Oracle:
    MSSQL:


事务:多个操作被当作一个整体对待
    ACID:
        A: 原子性;
        C:一致性;
        I: 隔离性;
        D:持久性;

SQL: Structure Query Language (结构化查询语句)

SQL解释器:
    数据库存储协议:应用层协议(C/S)
        S: server,监听于套拼字,接收并处理客户端的应用请求;
        C:Client,程序接口:CLI GUI 用用程序接口:ODBC(Open Database Connection)
  • 表的概念:
约束:constraint,向数据表提供的数据要遵守的限制;
    1.主键约束:primary key 一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;必须提供数据,即NOT NULL; 一个表只能存在一个
    2.外键约束:foreign key 一个表中的某字段可填入数据取决于另一个表的主键已有的数据;
    3.非空约束:not null 约束强制列不接受 NULL 值。约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。 
    4.默认约束:default 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。
    5.唯一约束:unique 一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为NULL;一个表可以存在多个
    6.检查约束:check 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
                    如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。

索引:将表中的一个或多个字段中的数据复制一份另存,并且此些需要按特定次序排序存储;

关系运算:
    选择:挑选出符合条件的行(部分);
    投影:挑选出需要的字段;
    连接: 用于把来自两个或多个表的行结合起来。

数据抽象:
    物理层:决定数据的存储格式,即RDBMS在磁盘上如何组织文件;
    逻辑层:描述DB存储什么数据,以及数据间存在什么样的关系;
    视图层:描述DB中的部分数据;

安装MySQL

  • 安装方式:源码安装,YUM安装,RPM安装,deb安装
[root@centos6 ~]# yum install -y mysql mysql-server mysql-devel
[root@centos6 ~]# service mysqld start
[root@centos6 ~]# netstat -luntp | grep mysql
[root@centos6 ~]# mysql -u root

安装MariaDB

  • MariaDB的特性:
插件式存储引擎:存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择;

1.更多的存储的存储引擎
    MyISAM --> Aria, 
    InnoDB --> XtraDB
2.诸多扩展和新特性
3.提供了较多测试组件
4.truly open source
  • Centos7安装:yum install mariadb-server

二进制文件下载地址:https://downloads.mariadb.org/

[root@master ~]# wget https://downloads.mariadb.org/interstitial/mariadb-10.4.11/bintar-linux-x86_64/mariadb-10.4.11-linux-x86_64.tar.gz/from/http%3A//mirrors.tuna.tsinghua.edu.cn/mariadb/

#创建运行用户与用户组
[root@master ~]#groupadd -r -g 27 mysql
[root@master ~]#useradd -r -g 27 -u 27 mysql -M #不创建家目录

#解压程序包与初始化目录
[root@master ~]# tar xvf mariadb-10.4.11-linux-x86_64.tar.gz -C /usr/local
[root@master ~]# cd /usr/local/
[root@master local]# ln -sv mariadb-10.4.11-linux-x86_64 mysql #也可以不创建软链接文件,但要把mariadb-10.4.11-linux-x86_64/这个目录的名字改为mysql,这是二进制安装必须要求的,目录名字必须为mysql

#修改权限
[root@master mysql]# chown -R mysql:mysql ./*

#修改数据的储存位置;数据存储目录默认为:data
[root@master ~]# fdisk /dev/sdb #建立LVM分区
[root@master ~]# partx -a /dev/sdb
[root@master ~]# pvcreate /dev/sdb1
[root@master ~]# vgcreate myvg /dev/sdb1
[root@master ~]# lvcreate -L 10G -n mydata /dev/sdb1
[root@master ~]# mkdir /mnt/data
[root@master ~]# mount /dev/myvg/mydata /mnt/data
[root@master data]# chown mysql:mysql data/

#初始化安装数据库
[root@master mysql]# . scripts/mysql_install_db --user=mysql --datadir=/mnt/data/data/

#创建日志文件
[root@master ~]# mkdir /var/log/mariadb/
[root@master mariadb]# touch mariadb.log
[root@master mariadb]# chown mysql:mysql mariadb.log 

#复制启动脚本到/etc/init.d/目录下
[root@master support-files]# cp mysql.server /etc/init.d/mysqld
[root@master support-files]# chkconfig --add mysqld 
[root@master support-files]# chkconfig --list mysqld  
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off

#配置文件
#配置格式:类ini格式,为各程序均通过单个配置文件提供配置信息;
#    [prog_name]
#配置文件查找次序:
#/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf
#复制配置文件
[root@master ~]#cp /usr/local/mysql/support-files/my-large.cnf /etc/mysql/my.cnf

#在mariadb安装目录下的support-files有好几种配置模板,已经配置好的部分参数,分别用于不同的环境,这里简要说明一下:
#   my-small.cnf 这个是为小型数据库或者个人测试使用的,不能用于生产环境
#   my-medium.cnf 这个适用于中等规模的数据库,比如个人项目或者小型企业项目中,
#   my-large.cnf 一般用于专门提供SQL服务的服务器中,即专门运行数据库服务的主机,配置要求要更高一些,适用于生产环境
#   my-huge.cnf 用于企业级服务器中的数据库服务,一般更多用于生产环境使用所以根据以上几个文件,如果个人使用或者测试,那么可以使用前两个模板;
#                企业服务器或者64G以上的高配置服务器可以使  后面两个模板,另外也可以根据自己的需求来加大参数和扩充配置获得更好的性能

#修改配置文件
[root@master ~]#vim /etc/mysql/my.cnf  ##在这个配置文件中增加三行
datadir = /mnt/data/data   ## ---指定存放数据库的存放位置
innodb_file_per_table = on ## ---表示每个数据库中的每个表都有一个单独的文件保存,便于管理
skip_name_resolve = on  ##---禁止解析主机名

#启动mysql
[root@master ~]#/etc/init.d/mysqld start
[root@master ~]#netstat -luntp | grep mysql

MariaDB的基本组成与连接方式

#MariaDB的组成:
#C:
#    mysql:CLI 交互式客户端程序
#    mysqldump,mysqladmin
#S:
#   mysqld_safe
#   mysqld
#   mysqld_multi


#服务器监听的两种socket地址:
#   ip socket: 监听在tcp的3306端口,支持远程通信; 
#   unix sock: 监听在sock文件上(/tmp/mysql.sock, /var/lib/mysql/mysql.sock),仅支持本地通信;
#   server: localhost, 127.0.0.1


#MariaDB使用前需要进行安全初始化
[root@master ~]# mysql_secure_installation 
# 安全初始化:设置root密码,清空无密码用户,关闭远程登录,移除空数据库,重载配置


#命令行交互式客户端程序:mysql
#   mysql
#       -uUSERNAME: 用户名;默认为root
#       -hHOST: 服务器主机; 默认为localhost
#       -pPASSWORD:用户的密码;  默认为空密码  
#注意:mysql用户账号由两部分组成:'USERNAME'@'HOST'; 其中HOST用于限制此用户可通过哪些主机远程连接mysql服务;
#   支持使用通配符:
#       %: 匹配任意长度的任意字符:172.16.0.0/16, 172.16.%.%
#       _: 匹配任意单个字符;
#服务端命令:通过mysql协议发往服务器执行并取回结果,每个命令都必须命令结束符号;默认为分号;

#连接MariaDB
[root@master ~]# mysql -uroot -proot
MariaDB [(none)]> use mysql;    
MariaDB [mysql]> SELECT User,Host,PassWord FROM user;
+------+-----------+-------------------------------------------+
| User | Host      | PassWord                                  |
+------+-----------+-------------------------------------------+
| root | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root | master    | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root | 127.0.0.1 | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root | ::1       | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
+------+-----------+-------------------------------------------+
MariaDB [mysql]> help #查看基础的内建命令;



#关系型数据的常用组件
#   数据库: database
#   表: table
#       行: row
#       列: column
#   索引: index
#   视图: view
#   用户: user
#   权限: privilege
#   存储过程: procedure
#   储存函数: function
#   触发器: trigger
#   事件调度器: event scheduler

MariaDB的基础使用

#SQL语句
# DDL: Data Defination Language
#   CREATE, DROP, ALTER    
# DML: Data Manipulation Language
#   INSERT, DELETE, UPDATE, SELECT
# DCL: Data Control Language
    GRANT, REVOKE
# SQL语句应当遵循使用法则:全部大写或全部小写


#查看全部数据库
SHOW DATABASES;

#数据库
CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';#创建数据库
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';#删除数据库(极度危险,生产环境极度建议不要使用)

    CHARACTER SET 'charecter set name'
    COLLATE 'collate name'

#查看支持所有字符集:
SHOW CHARACTER SET;

#查看支持所有排序规则:
SHOW COLLATION;

#获取命令使用帮助
HELP KETWORD;

#表
CREATE TABLE [IF NOT EXISTS] tb_name (col1 datatype 修饰符, col2 datatype 修饰符) ENGINE=''

#查看所有的引擎:
SHOW ENGINES;#建议使用innoDB引擎

#查看表:
SHOW TABLES [FROM db_name]

#查看表结构:
DESC [db_name.]tb_name

#删除表
DROP TABLE [IF EXISTS] tb_name;


#数据类型
#   字符型
#       定长字符型:CHAR(#), BINARY(#)
#       变长字符型: VARCHAR(#), VARBINARY(#)
#   对象存储:
#       TEXT: 不区分大小写                                    
#       BLOB:区分字符大小写
#   内置类型:
#       ENUM
#       SET
#   数值型
#       精确数值型
#           整型: int
#           tinyint: 1byte
#           smallint: 2bytes
#           mediumint: 3bytes
#           int: 4bytes
#           bigint: 8bytes
#           十进制: decimal
#       近似数值型
#           单精度浮点型
#               float
#           双精度浮点型
#               double
#   日期时间型
#      日期:DATE
#      时间:TIME
#      日期时间:DATETIME
#      时间戳:TIMESTAMP
#      年份:YEAR(2), YEAR(4)
#   修饰符:
#      所有类型适用:
#          NOT NULL:非空约束
#          DEFAULT VALUE: 设定默认值
#          PRIMARY KEY: 有两个作用,一是约束作用(constraint),用来规范一个存储主键和唯一性,但同时也在此key上建立了一个主键索引;
#          UNIQUE KEY: 也有两个作用,一是约束作用(constraint),规范数据的唯一性,但同时也在这个key上建立了一个唯一索引;
#      数值类型适用:
#          UNSIGNED: 无符号及非负数
#          AUTO_INCREMENT: 自增

#示例:
CREATE DATABASE test;
USE test;
CREATE TABLE tp1(id INT NOT NULL, name VARCHAR(100) NOT NULL, pwd VARCHAR(100));   
DESC tp1;

MariaDB增删改查

#表:
    CREATE TABLE [IF NOT EXISTS] 'tbl_name' (col1 type1, col2 type2, ...) 
        col type1 
        PRIMARY KEY(col1,...)
        INDEX(col1, ...)
        UNIQUE KEY(col1, ...)
        表选项:
            ENGINE [=] engine_name
            ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
            SHOW ENGINES;
    #获取创建表帮助:
    HELP CREATE TABLE;
    #查看表状态:
    SHOW TABLE STATUS LIKE 'tb1_name'\G
    #删除表:
    DORP TABLE [IF EXISTS] 'tp_name';

    ALTER TABLE 'tb1_name';
    字段:
        添加字段:ADD (ADD coll1 data_type [FIRST|AFTER| col_name])
        删除字段: DROP
        修改字段: ALTER, CHANGE, MODIFY
            CHANGE:添加字段
            MODIFY:修改字段
    索引:
        添加索引: ADD
        删除索引: DROP
    表选项:
        修改:不建议修改表,修改表及其影响性能,消耗资源.

    查看表上的索引:SHOW INDEXES FROM [db_name.]tbl_name;

索引:
    索引是特殊数据结构;定义在查找时作为查找条件的字段;
    索引:要有索引名称;

    创建索引:
        CREATE INDEX index_name ON tb1_name (index_col_name,...)
    删除索引:
        DROP INDEX index_name ON tb1_name

DML:INSERT, DELETE, SELECT, UPDATE
    INSERT INTO:
        INSERT [INTO] tb1_name [(col_name,...)] {VALUES | VALUE} (val1,...),(...),...

    SELECT:
        SELECT col1,col2,... FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
        字段表示法:
            *:所有字段
            as:字段别名,col1 AS alias1
        WHERE clase:
            操作符:
                >, <, >=, <=, ==, !=
                BETWEEN ... AND ...
                LIKE:
                    %:任意长度
                    _:任意单个字符
                RLIKE:
                    正则表达式的模式匹配;
                IS NULL
                IS NOT NULL
            条件逻辑操作:
                AND
                OR
                NOT
    DELETE:
        DELETE FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n]; 
    UPDATE:
         UPDATE tbl_name SET col1=new_val1, col2=new_val2, ... [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];

DCL:用户账号及权限管理
    用户账号:'user'@'host'
        user: 用户名
        host: 此用户访问mysqld服务时允许通过哪些主机远程创建连接;
            IP、网络地址、主机名、通配符(%和_);
    禁止检查主机名:
        my.cnf, [mysqld]
        skip_name_resolve = yes

    创建用户账号:
        CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];
    删除用户:
        DROP USER 'username'@'host';
    授权:
        权限级别:管理权限、数据库、表、字段、存储例程;
        GRANT priv_type,... ON [object_type] db_name.tb_name TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];

         priv_type: ALL [PRIVILEGES]
            db_name.tb_name:
            *.*: 所有库的所表;
            db_name.*: 指定库的所有表;
            db_name.tb_name: 指定库的指定表;
            db_name.routine_name:指定库的存储例程;
        查看指定用户获得的授权:
            SHOW GRANTS FOR 'user'@'host'; 
            SHOW GRANTS FOR CURRENT_USER;
    回收授权:
        REVOKE priv_type, ... ON db_name.tb_name FROM 'user'@'host';

注意:MariaDB服务进程启动时会读取mysql库中的所有授权表至内存中;
    (1) GRANT或REVOKE等执行权限操作会保存于表中,MariaDB的服务进程会自动重读授权表;
    (2) 对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表:
        mysql> FLUSH PRIVILEGES;

使用示例

#示例:
CREATE TABLE stu(id INT UNSIGNED NOT NULL PRIMARY KEY, name VARCHAR(20) NOT NULL, age TINYINT UNSIGNED); #创建表
DESC stu; #查看表结构
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id    | int(10) unsigned    | NO   | PRI | NULL    |       |
| name  | varchar(20)         | NO   |     | NULL    |       |
| age   | tinyint(3) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
#定义两个主键
CREATE TABLE stu2(id INT UNSIGNED NOT NULL, name VARCHAR(20) NOT NULL, age TINYINT UNSIGNED, PRIMARY KEY(id,name));
DESC stu2;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id    | int(10) unsigned    | NO   | PRI | NULL    |       |
| name  | varchar(20)         | NO   | PRI | NULL    |       |
| age   | tinyint(3) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
#添加一个字段,字段类型为枚举类型.
ALTER TABLE stu ADD gender ENUM('m','n');
DESC stu;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| id     | int(10) unsigned    | NO   | PRI | NULL    |       |
| name   | varchar(20)         | NO   |     | NULL    |       |
| eag    | tinyint(3) unsigned | YES  |     | NULL    |       |
| gender | enum('m','n')       | YES  |     | NULL    |       |
+--------+---------------------+------+-----+---------+-------+
#修改字段
ALTER TABLE stu CHANGE id sid INT UNSIGNED NOT NULL; #入过定义过字段主键可以修改时不用再次定义主键
DESC stu;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| sid    | int(10) unsigned    | NO   | PRI | NULL    |       |
| name   | varchar(20)         | NO   |     | NULL    |       |
| age    | tinyint(3) unsigned | YES  |     | NULL    |       |
| gender | enum('m','n')       | YES  |     | NULL    |       |
+--------+---------------------+------+-----+---------+-------+
#添加唯一键
ALTER TABLE stu ADD UNIQUE KEY(name); 
DESC stu;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| sid    | int(10) unsigned    | NO   | PRI | NULL    |       |
| name   | varchar(20)         | NO   | UNI | NULL    |       |
| age    | tinyint(3) unsigned | YES  |     | NULL    |       |
| gender | enum('m','f')       | YES  |     | NULL    |       |
+--------+---------------------+------+-----+---------+-------+
#索引和键的区别是:
#   主键有非同约束和NOT NULL约束;
#   唯一键:非相同约束,而唯一性索引列允许空值。;
#   索引:无任何限制,索引可以提高查询的速度。 

#添加索引
ALTER TABLE stu ADD INDEX(age);
DESC stu; #添加索引后desc是查看不出来的
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| sid    | int(10) unsigned    | NO   | PRI | NULL    |       |
| name   | varchar(20)         | NO   | UNI | NULL    |       |
| age    | tinyint(3) unsigned | YES  | MUL | NULL    |       | 
| gender | enum('m','f')       | YES  |     | NULL    |       |
+--------+---------------------+------+-----+---------+-------+

#查看索引
SHOW INDEXES FROM stu;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| stu   |          0 | PRIMARY  |            1 | sid         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| stu   |          0 | name     |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| stu   |          1 | age      |            1 | age         | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

#删除表索引
ALTER TABLE stu DROP age;
SHOW INDEXES FROM stu;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| stu   |          0 | PRIMARY  |            1 | sid         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| stu   |          0 | name     |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

#删除索引的另一种方式
DROP INDEX name ON stu;
SHOW INDEXES FROM stu;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| stu   |          0 | PRIMARY  |            1 | sid         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

#插入数据
INSERT INTO stu VALUES (1,'zhangsan','m'),(2,'lisi','f');#插入多行数据
INSERT INTO stu (sid,name) VALUES (3,'zhaoyun'),(5,'zhangfei');
SELECT * FROM stu;
+-----+----------+--------+
| sid | name     | gender |
+-----+----------+--------+
|   1 | zhangsan | m      |
|   2 | lisi     | f      |
|   3 | zhaoyun  | NULL   |
|   5 | zhangfei | NULL   |
+-----+----------+--------+

#查询sid小于3的数据
SELECT * FROM stu WHERE sid < 3;
+-----+----------+--------+
| sid | name     | gender |
+-----+----------+--------+
|   1 | zhangsan | m      |
|   2 | lisi     | f      |
+-----+----------+--------+

#查询gender等于m的数据
SELECT * FROM stu WHERE gender = 'm';
+-----+----------+--------+
| sid | name     | gender |
+-----+----------+--------+
|   1 | zhangsan | m      |
+-----+----------+--------+

#查询gender为空的数据
SELECT * FROM stu WHERE gender IS NULL;
+-----+----------+--------+
| sid | name     | gender |
+-----+----------+--------+
|   3 | zhaoyun  | NULL   |
|   5 | zhangfei | NULL   |
+-----+----------+--------+

#查询所有数据后根据名字排序(升序)
SELECT * FROM stu ORDER BY name;
+-----+----------+--------+
| sid | name     | gender |
+-----+----------+--------+
|   2 | lisi     | f      |
|   5 | zhangfei | NULL   |
|   1 | zhangsan | m      |
|   3 | zhaoyun  | NULL   |
+-----+----------+--------+

#查询所有数据后根据名字排序(降序序)

SELECT * FROM stu ORDER BY name DESC;
+-----+----------+--------+
| sid | name     | gender |
+-----+----------+--------+
|   3 | zhaoyun  | NULL   |
|   1 | zhangsan | m      |
|   5 | zhangfei | NULL   |
|   2 | lisi     | f      |
+-----+----------+--------+

#查询所有数据后降序显示前两条
SELECT * FROM stu ORDER BY name DESC LIMIT 1,2;
+-----+----------+--------+
| sid | name     | gender |
+-----+----------+--------+
|   1 | zhangsan | m      |
|   5 | zhangfei | NULL   |
+-----+----------+--------+

#查询sid>=2<=4的数据
SELECT * FROM stu WHERE sid>=2 AND sid <=4;
+-----+---------+--------+
| sid | name    | gender |
+-----+---------+--------+
|   2 | lisi    | f      |
|   3 | zhaoyun | NULL   |
|   4 | wangwu  | m      |
+-----+---------+--------+
SELECT * FROM stu WHERE sid BETWEEN 2 AND 4; 
+-----+---------+--------+
| sid | name    | gender |
+-----+---------+--------+
|   2 | lisi    | f      |
|   3 | zhaoyun | NULL   |
|   4 | wangwu  | m      |
+-----+---------+--------+

#查询name以z开头的数据
SELECT * FROM stu  WHERE name LIKE 'z%';
+-----+----------+--------+
| sid | name     | gender |
+-----+----------+--------+
|   1 | zhangsan | m      |
|   3 | zhaoyun  | NULL   |
|   5 | zhangfei | NULL   |
+-----+----------+--------+

#AS别名的查询
SELECT sid AS stuid, name AS stuname FROM stu;
+-------+----------+
| stuid | stuname  |
+-------+----------+
|     1 | zhangsan |
|     2 | lisi     |
|     3 | zhaoyun  |
|     4 | wangwu   |
|     5 | zhangfei |
+-------+----------+

#删除sid为3的数据
DELETE FROM stu WHERE sid=3;
SELECT * FROM stu;
+-----+----------+--------+
| sid | name     | gender |
+-----+----------+--------+
|   1 | zhangsan | m      |
|   2 | lisi     | f      |
|   4 | wangwu   | m      |
|   5 | zhangfei | NULL   |
+-----+----------+--------+

#修改stu的第5行dender为NULL的字段为f
UPDATE stu SET gender='f' WHERE sid=4;
SELECT * FROM stu WHERE sid = 4;
+-----+--------+--------+
| sid | name   | gender |
+-----+--------+--------+
|   4 | wangwu | f      |
+-----+--------+--------+

#创建用户账号
CREATE USER 'wpuser'@'%' IDENTIFIED BY 'pwd';
SELECT User,Host,Password FROM user;
+--------+-----------+-------------------------------------------+
| User   | Host      | Password                                  |
+--------+-----------+-------------------------------------------+
| root   | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root   | master    | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root   | 127.0.0.1 | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root   | ::1       | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| wpuser | %         | *975B2CD4FF9AE554FE8AD33168FBFC326D2021DD |
+--------+-----------+-------------------------------------------+

#删除用户
DROP USER 'wpuser'@'%';
SELECT User,Host,Password FROM user;
+--------+-----------+-------------------------------------------+
| User   | Host      | Password                                  |
+--------+-----------+-------------------------------------------+
| root   | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root   | master    | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root   | 127.0.0.1 | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root   | ::1       | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
+--------+-----------+-------------------------------------------+

#查看wpuser用户的授权
SHOW GRANTS FOR 'wpuser'@'%';
+-------------------------------------------------------------------------------------------------------+
| Grants for wpuser@%                                                                                   |
+-------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wpuser'@'%' IDENTIFIED BY PASSWORD '*975B2CD4FF9AE554FE8AD33168FBFC326D2021DD' |
+-------------------------------------------------------------------------------------------------------+
#查看root用户的授权
SHOW GRANTS FOR 'root'@'127.0.0.1';+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@127.0.0.1                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+
最后修改:2019 年 12 月 25 日 03 : 12 PM

发表评论