99

0x00 前言

小白成长计划第二周任务,选择mysql作为主要学习语言,本来是准备学mssql的,但是基于mysql遇到的最多,且不算很熟练,mssql企业、单位中用的较多一点,但是碰到的比较少,且语法大同小异,后期会专门学一下sql语言,来了解下关系型数据库的语法以及特性。

0x01 关系型和非关系型数据库区别

关系型数据库

  • 复杂查询:可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
  • 事务支持:使得对于安全性能很高的数据访问要求得以实现。

非关系型数据库

  • 性能:NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
  • 可扩展性:同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

对比

  • 对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
  • 但是近年来这两种数据库都在向着另外一个方向进化。例如:
    NOSQL数据库慢慢开始具备SQL数据库的一些复杂查询功能的雏形,比如Couchbase的index以及MONGO的复杂查询。对于事务的支持也可以用一些系统级的原子操作来实现例如乐观锁之类的方法来曲线救国。
  • SQL数据库也开始慢慢进化,比如HandlerSocker技术的实现,可以在MYSQL上实现对于SQL层的穿透,用NOSQL的方式访问数据库,性能可以上可以达到甚至超越NOSQL数据库。可扩展性上例如Percona Server,可以实现无中心化的集群。

虽然这两极都因为各自的弱势而开始进化出另一极的一些特性,但是这些特性的增加也会消弱其本来具备的优势,比如Couchbase上的index的增加会逐步降低数据库的读写性能。所以怎样构建系统的短期和长期存储策略,用好他们各自的强项是架构师需要好好考虑的重要问题。

0x02 关系型数据库

关系型数据库即RDBMS(Relational Database Management System)数据库。
特点:
1、数据库以表格的形式出现
2、每行为各种记录名称
3、每列为记录名称所对应的数据域
4、许多的行和列组成一张表单
5、若干的表单组成database

关系型数据库是依据关系模型来创建的数据库。
关系模型就是”一对一,一对多,多对多”等关系模型,关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。

关系模型中常用的概念:

  • 关系:一张二维表,每个关系都具有一个关系名,就是通常说的表名
  • 元组:二维表中的一行,在数据库中经常被称为记录(一行数据)
  • 属性:二维表中的一列,在数据库中经常被称为字段
  • 域:属性的取值范围,也就是数据的某一列取值范围
  • 关键字:一组可以唯一标识元组的属性,数据库中称为主键
  • 关系模式:指对关系的描述。其格式为:关系名(属性1,属性2,…属性N),在数据库中构成表结构

关系型数据库的优点

  • 容易理解:二维表结构是贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解
  • 使用方便:通用的sql语言使得操作关系型数据库非常方便
  • 易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率
  • 支持sql:可用于复杂的查询

关系型数据库的缺点

  • 为了维护一致性:其读写性能比较差
  • 固定的表结构
  • 读写时效性:对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比如发一条消息之后,过几秒乃至十几秒之后才看到这条动态是完全可以接受的
  • 高并发读写需求:网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
  • 海量数据的高效率读写:网站每天产生的数据量是巨大的,对于关系型数据库来说,在一张包含海量数据的表中查询,效率是非常低的

0x03 Mysql数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

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

0x04 Mysql管理

使用phpstudy集成环境,将mysql下的bin目录添加到系统环境中,使用命令进入mysql命令行页面。

mysql -uroot -proot

use 选择数据库
show 查看数据库或表

添加mysql新用户

mysql数据库为mysql用户库
选择mysql
use mysql;
show tables;//查看mysql数据库下所有表

添加新用户
insert into user(
host,user,password,select_priv,insert_priv,update_priv) value(
'localhost','time',password('time'),'y','y','y'
);

select * from user;//查看user表所有内容


另外一种添加用户的方法为通过SQL的 GRANT 命令,你下命令会给指定数据库TUTORIALS添加用户 zara ,密码为 zara123

mysql> grant select,insert,update,delete,create,drop
-> on tutorials.*
-> to 'zara'@'localhost'
-> identified by 'zara123';

用户权限列表
为用户指定权限,在对应的权限列中插入语句设置Y即可。

  • Select_priv //允许用户查询
  • Insert_priv //允许用户插入
  • Update_priv //允许用户更新
  • Delete_priv //允许用户删除
  • Create_priv //允许用户创建
  • Drop_priv //允许用户删除数据库、表、视图的权限,包括truncatetable命令
  • Reload_priv //允许执行flush命令,指明重新加载权限表到系统内存中
  • Shutdown_priv //代表允许关闭数据库实例,执行语句包括mysqladmin shutdown
  • Process_priv //允许查看MySQL中的进程信息,比如执行showprocesslist,
  • File_priv //允许在MySQL可以访问的目录进行读写磁盘文件操作,可使用 的命令包括load data infile,select … into outfile,load file()函数
  • Grant_priv //是否允许此用户授权或者收回给其他用户你给予的权限
  • References_priv //是否允许创建外键
  • Index_priv //是否允许创建和删除索引
  • Alter_priv //允许修改表结构的权限,但必须要求有create和insert权 限配合。如果是rename表名,则要求有alter和drop原表,create和 insert新表的权限

mysql配置文件my.ini
windows下默认配置文件,在配置文件中,可以指定不同的错误日志存放目录,linux下配置文件是my.cof

[client]
port=3306
[mysql]
default-character-set=gbk

[mysqld]
port=3306
basedir="D:/phpStudy/MySQL/"
datadir="D:/phpStudy/MySQL/data/"
character-set-server=gbk
default-storage-engine=MyISAM
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=512

query_cache_size=0
table_cache=256
tmp_table_size=18M

thread_cache_size=8
myisam_max_sort_file_size=64G
myisam_sort_buffer_size=35M
key_buffer_size=25M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K

innodb_additional_mem_pool_size=2M

innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M

innodb_buffer_pool_size=47M
innodb_log_file_size=24M
innodb_thread_concurrency=8

mysql管理命令

  • use 数据库名:选择要操作的mysql数据库,使用该命令后所有MySQL命令都只针对该数据库。
    mysql> use mysql;
    Database changed
  • show databases:列出mysql数据库管理系统的所有数据库
    mysql> show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | mag |
    | mysql |
    | performance_schema |
    | test |
    | ultrax |
    +--------------------+
    6 rows in set (0.03 sec)
  • show tables:显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。
    mysql> use mysql;
    Database changed
    mysql> show tables;
    +---------------------------+
    | Tables_in_mysql |
    +---------------------------+
    | columns_priv |
    | db |
    | event |
    | func |
    | general_log |
    | help_category |
    | help_keyword |
    | help_relation |
    | help_topic |
    | host |
    | ndb_binlog_index |
    | plugin |
    | proc |
    | procs_priv |
    | proxies_priv |
    | servers |
    | slow_log |
    | tables_priv |
    | time_zone |
    | time_zone_leap_second |
    | time_zone_name |
    | time_zone_transition |
    | time_zone_transition_type |
    | user |
    +---------------------------+
    24 rows in set (0.00 sec)
  • show columns from 数据表:显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。
    mysql> show columns from user;
    +------------------------+-----------------------------------+
    | Field | Type | Null | Key | Default |
    Extra |
    +------------------------+-----------------------------------+
    | Host | char(60) | NO | PRI | |
    |
    | User | char(16) | NO | PRI | |
    |
    | Password | char(41) | NO | | |
    |
    | Select_priv | enum('N','Y') | NO | | N |
    |
    | Insert_priv | enum('N','Y') | NO | | N |
    |
    | Update_priv | enum('N','Y') | NO | | N |
    |
    | Delete_priv | enum('N','Y') | NO | | N |
    |
    | Create_priv | enum('N','Y') | NO | | N |
    |
    | Drop_priv | enum('N','Y') | NO | | N |
    |
    | Reload_priv | enum('N','Y') | NO | | N |
    |
    | Shutdown_priv | enum('N','Y') | NO | | N |
    |
    | Process_priv | enum('N','Y') | NO | | N |
    |
    | File_priv | enum('N','Y') | NO | | N |
    |
    | Grant_priv | enum('N','Y') | NO | | N |
    |
    | References_priv | enum('N','Y') | NO | | N |
    |
    | Index_priv | enum('N','Y') | NO | | N |
    |
    | Alter_priv | enum('N','Y') | NO | | N |
    |
    | Show_db_priv | enum('N','Y') | NO | | N |
    |
    | Super_priv | enum('N','Y') | NO | | N |
    |
    | Create_tmp_table_priv | enum('N','Y') | NO | | N |
    |
    | Lock_tables_priv | enum('N','Y') | NO | | N |
    |
    | Execute_priv | enum('N','Y') | NO | | N |
    |
    | Repl_slave_priv | enum('N','Y') | NO | | N |
    |
    | Repl_client_priv | enum('N','Y') | NO | | N |
    |
    | Create_view_priv | enum('N','Y') | NO | | N |
    |
    | Show_view_priv | enum('N','Y') | NO | | N |
    |
    | Create_routine_priv | enum('N','Y') | NO | | N |
    |
    | Alter_routine_priv | enum('N','Y') | NO | | N |
    |
    | Create_user_priv | enum('N','Y') | NO | | N |
    |
    | Event_priv | enum('N','Y') | NO | | N |
    |
    | Trigger_priv | enum('N','Y') | NO | | N |
    |
    | Create_tablespace_priv | enum('N','Y') | NO | | N |
    |
    | ssl_type | enum('','ANY','X509','SPECIFIED') | NO | |
    |
    | ssl_cipher | blob | NO | | NULL |
    |
    | x509_issuer | blob | NO | | NULL |
    |
    | x509_subject | blob | NO | | NULL |
    |
    | max_questions | int(11) unsigned | NO | | 0 |
    |
    | max_updates | int(11) unsigned | NO | | 0 |
    |
    | max_connections | int(11) unsigned | NO | | 0 |
    |
    | max_user_connections | int(11) unsigned | NO | | 0 |
    |
    | plugin | char(64) | YES | | |
    |
    | authentication_string | text | YES | | NULL |
    |
    +------------------------+-----------------------------------+------+
    42 rows in set (0.02 sec)
  • show index from 数据表: 显示数据表的详细索引信息,包括PRIMARY KEY(主键)
    mysql> show index from db;
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | db | 0 | PRIMARY | 1 | Host | A | NULL | NULL | NULL | | BTREE | | |
    | db | 0 | PRIMARY | 2 | Db | A | NULL | NULL | NULL | | BTREE | | |
    | db | 0 | PRIMARY | 3 | User | A | 3 | NULL | NULL | | BTREE | | |
    | db | 1 | User | 1 | User | A | 1 | NULL | NULL | | BTREE | | |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    4 rows in set (0.00 sec)
  • show table status like 数据表\G: 该命令将输出MySQL数据库管理系统的性能及统计信息。
    **显示数据库 mag 中所有表的信息**
    mysql> show table status from mag;
    +------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
    | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
    +------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
    | mag | MyISAM | 10 | Dynamic | 3 | 36 | 108 | 281474976710655 | 2048 | 0 | NULL | 2019-07-30 03:04:36 | 2019-07-30 03:41:18 | NULL | utf8_general_ci | NULL | | |
    +------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
    1 row in set (0.32 sec)




    **表名以W3Cschool开头的表的信息**
    mysql> show table status from mag like 'mag%';
    +------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
    | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
    +------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
    | mag | MyISAM | 10 | Dynamic | 3 | 36 | 108 | 281474976710655 | 2048 | 0 | NULL | 2019-07-30 03:04:36 | 2019-07-30 03:41:18 | NULL | utf8_general_ci | NULL | | |
    +------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
    1 row in set (0.00 sec)




    **加上\G,查询结果按列打印**
    mysql> show table status from mag like 'mag%'\G;
    *************************** 1. row ***************************
    Name: mag
    Engine: MyISAM
    Version: 10
    Row_format: Dynamic
    Rows: 3
    Avg_row_length: 36
    Data_length: 108
    Max_data_length: 281474976710655
    Index_length: 2048
    Data_free: 0
    Auto_increment: NULL
    Create_time: 2019-07-30 03:04:36
    Update_time: 2019-07-30 03:41:18
    Check_time: NULL
    Collation: utf8_general_ci
    Checksum: NULL
    Create_options:
    Comment:
    1 row in set (0.00 sec)

0x05 数据库操作

创建数据库
creare database 数据库名:创建数据库

mysql> create database study;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mag |
| mysql |
| performance_schema |
| study |
| test |
| ultrax |
+--------------------+
7 rows in set (0.06 sec)

删除数据库
drop database 数据库名:删除数据库

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mag |
| mysql |
| performance_schema |
| study |
| study1 |
| test |
| ultrax |
+--------------------+
8 rows in set (0.00 sec)

mysql> drop database study1;
Query OK, 0 rows affected (0.39 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mag |
| mysql |
| performance_schema |
| study |
| test |
| ultrax |
+--------------------+
7 rows in set (0.00 sec)

选择数据库
use 数据库名:选择数据库,选中后操作都只在此数据库内

mysql> use mysql;
Database changed

0x06 mysql数据类型

  • Mysql中定义数据字段的类型对数据库的优化非常重要
  • Mysql支持多种类型,大致可以分为三类:数值、日期/时间、字符串(字符)类型

数值类型

  • MySQL支持所有标准SQL数值数据类型。
  • 这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
  • 关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
  • BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
  • 作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度浮点数值
DOUBLE 8 字节 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

日期和时间类型

  • 表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
  • 每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。
  • TIMESTAMP类型有专有的自动更新特性
类型 大小(字节) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 8 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型

  • 字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LOGNGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据
  • char和varchar类型类似但不同,保存和检索的方式不同,它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
  • binary和varbinary类类似char和varchar,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
  • blob是一个二进制大对象,可以容纳可变数量的数据。有4种blob类型:tinyblob、blob、mediumblob和longblob。它们只是可容纳值的最大长度不同。
  • 有4种text类型:tinytext、text、mediumtext和longtext。这些对应4种BLOB类型,有相同的最大长度和存储需求。

0x07 操作表与数据

创建数据表
创建数据库表需要以下信息

  • 表名
  • 表字段名
  • 定义每个表字段

以下是创建数据表的sql通用语法

create table table_name(表名) (column_name(字段名) column_type(字段类型));

实例

mysql> use study;//选择数据库
Database changed
mysql> create table study(//创建study表
-> study_id int not null auto_increment, //创建id字段,不允许为空,自增长
-> study_title varchar(100) not null, //创建title 最大长度100个字节 不允许为空
-> study_author varchar(40) not null, //创建author 最大长度40个字节 不允许为空
-> submission_date DATE, //记录时间(应该是)
-> primary key (study_id) //设置主键为id
-> );
Query OK, 0 rows affected (0.40 sec)

实例解析:

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

删除数据表
MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。

以下为删除数据表的通用语法:

drop table table_name;

实例

mysql> show tables;
+-----------------+
| Tables_in_study |
+-----------------+
| study |
+-----------------+
1 row in set (0.00 sec)

mysql> drop table study;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
Empty set (0.00 sec)

插入数据
Mysql表中使用 insert into 语句来插入数据

以下为Mysql数据表中插入数据通用的 insert into sql语法:

insert into table_name(表名) (字段1 , 字段2 , ... ,字段n) values (值1 , 值2 , ... , 值N)

PS: 如果值是字符型,必须加单引号或者双引号,如: ‘值’、”值”

实例

mysql> insert into study(study_id,study_title,study_author) values(1 , 'hello,Time!' , 'nice');
Query OK, 1 row affected (0.00 sec)

mysql> select * from study;
+----------+--------------+--------------+-----------------+
| study_id | study_title | study_author | submission_date |
+----------+--------------+--------------+-----------------+
| 1 | hello,Time! | nice | NULL |
+----------+--------------+--------------+-----------------+
1 row in set (0.00 sec)

PS:其实ID可以不用加,会自动增加

查询数据
MySQL 数据库使用SELECT语句来查询数据。

以下为Mysql数据库中查询数据通用的select语法:

select column_name,colimn_name(字段名) from table_name(表名) [(where 字段=某个值)][offset m][limit n]

实例

mysql> select * from study;
+----------+-------------------------+--------------+-----------------+
| study_id | study_title | study_author | submission_date |
+----------+-------------------------+--------------+-----------------+
| 1 | hello,Time! | nice | NULL |
| 2 | 今天天气不错,就是有点热 | nice | NULL |
+----------+-------------------------+--------------+-----------------+
2 rows in set (0.00 sec)

解析

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

where 子句
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。

以下是select语句使用where子句从数据表中读取数据的通用语法:

select 字段1,字段2,...,字段n from 表1,表2 where 条件 [and[or]] 条件2

解析

  • 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
  • 你可以在where子句中指定任何条件。
  • 你可以使用and或者or指定一个或多个条件。
  • where子句也可以运用于SQL的 delete 或者 update 命令。
  • where 子句类似于程序语言中的if条件,根据 MySQL 表中的字段值来读取指定的数据。

以下为操作符列表,可用于 where 子句中。
下表中实例假定 A为10 B为20
|操作符 |描述 |实例|
|——-|——-|—-|
|= |等号,检测两个值是否相等,如果相等返回true |(A = B) 返回false。|
|<> 或 != |不等于,检测两个值是否相等,如果不相等返回true |(A != B) 返回 true。|
|> |大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true |(A > B) 返回false。|
|< |小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true |(A < B) 返回 true。|
|>= |大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true |(A >= B) 返回false。|
|<= |小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true |(A <= B) 返回 true。|

  • 如果我们想再MySQL数据表中读取指定的数据,WHERE 子句是非常有用的。
  • 使用主键来作为 WHERE 子句的条件查询是非常快速的。
  • 如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。

实例

mysql> select * from study where study_id = 2;
+----------+-------------------------+--------------+-----------------+
| study_id | study_title | study_author | submission_date |
+----------+-------------------------+--------------+-----------------+
| 2 | 今天天气不错,就是有点热 | nice | NULL |
+----------+-------------------------+--------------+-----------------+
1 row in set (0.00 sec)

update更新
如果我们需要修改或更新MySQL中的数据,我们可以使用 SQL UPDATE 命令来操作。

以下是update修改数据表数据的通用sql语法:

uodate 表名 set 字段1=值1 , 字段2=值2 [where ]

解析

  • 你可以同时更新一个或多个字段。
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以在一个单独表中同时更新数据。
    当你需要更新数据表中指定行的数据时 WHERE 子句是非常有用的。

实例

mysql> update study set study_title="hello,NICE" where study_id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from study;
+----------+-------------+--------------+-----------------+
| study_id | study_title | study_author | submission_date |
+----------+-------------+--------------+-----------------+
| 1 | hello,NICE | nice | NULL |
| 2 | hello,你好 | nice | NULL |
+----------+-------------+--------------+-----------------+
2 rows in set (0.00 sec)

delete删除
你可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录。

以下语法是delete语句在数据表中删除数据的通用语法:

delete from 表名 where 字段n=值n

解析

  • 如果没有指定 WHERE 子句,MySQL表中的所有记录将被删除。
  • 你可以在 WHERE 子句中指定任何条件
  • 您可以在单个表中一次性删除记录。
    当你想删除数据表中指定的记录时 WHERE 子句是非常有用的。

实例

mysql> delete from study where study_id = 1;
Query OK, 1 row affected (0.00 sec)

mysql> select * from study;
+----------+-------------+--------------+-----------------+
| study_id | study_title | study_author | submission_date |
+----------+-------------+--------------+-----------------+
| 2 | hello,你好 | nice | NULL |
+----------+-------------+--------------+-----------------+
1 row in set (0.00 sec)

link子句
我们知道在MySQL中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。
WHERE 子句中可以使用等号 (=) 来设定获取数据的条件,如 “w3cschool_author = ‘Sanjay’”。
但是有时候我们需要获取 w3cschool_author 字段含有 “jay” 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
SQL LIKE 子句中使用百分号(%)字符来表示任意字符,类似于UNIX或正则表达式中的星号 (*)。
如果没有使用百分号(%), LIKE 子句与等号(=)的效果是一样的。

以下是select语句使用like子句从数据表中读取数据的通用语法:

select 字段1,字段2 from 表1,表2 where 字段1 like 条件 [and[or]] 字段2='值2'

解析

  • 你可以在WHERE子句中指定任何条件。
  • 你可以在WHERE子句中使用LIKE子句。
  • 你可以使用LIKE子句代替等号(=)。
  • LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
  • 你可以使用AND或者OR指定一个或多个条件。
  • 你可以在 DELETE 或 UPDATE 命令中使用 WHERE…LIKE 子句来指定条件。

实例

mysql> select * from study ;
+----------+-------------------------+--------------+-----------------+
| study_id | study_title | study_author | submission_date |
+----------+-------------------------+--------------+-----------------+
| 3 | 今天天气不错,就是有点热 | nice | NULL |
| 2 | hello,你好 | nice | NULL |
| 4 | 111111111111 | nice | NULL |
| 5 | 111111111111 | nono | NULL |
| 6 | 222222222222 | nono | NULL |
+----------+-------------------------+--------------+-----------------+
5 rows in set (0.00 sec)

mysql> select * from study where study_author like '%no';
+----------+--------------+--------------+-----------------+
| study_id | study_title | study_author | submission_date |
+----------+--------------+--------------+-----------------+
| 5 | 111111111111 | nono | NULL |
| 6 | 222222222222 | nono | NULL |
+----------+--------------+--------------+-----------------+
2 rows in set (0.00 sec)

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

以下是SQL SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据:

select 字段 from 表名 order by 字段 [ASC[DESC]]

解析

  • 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
  • 你可以设定多个字段来排序。
  • 你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升排列。
  • 你可以添加 WHERE…LIKE 子句来设置条件。

实例

//正序
mysql> select * from study order by study_author ASC;
+----------+-------------------------+--------------+-----------------+
| study_id | study_title | study_author | submission_date |
+----------+-------------------------+--------------+-----------------+
| 3 | 今天天气不错,就是有点热 | nice | NULL |
| 2 | hello,你好 | nice | NULL |
| 4 | 111111111111 | nice | NULL |
| 5 | 111111111111 | nono | NULL |
| 6 | 222222222222 | nono | NULL |
+----------+-------------------------+--------------+-----------------+
5 rows in set (0.00 sec)

//倒序
mysql> select * from study order by study_author DESC;
+----------+-------------------------+--------------+-----------------+
| study_id | study_title | study_author | submission_date |
+----------+-------------------------+--------------+-----------------+
| 5 | 111111111111 | nono | NULL |
| 6 | 222222222222 | nono | NULL |
| 3 | 今天天气不错,就是有点热 | nice | NULL |
| 2 | hello,你好 | nice | NULL |
| 4 | 111111111111 | nice | NULL |
+----------+-------------------------+--------------+-----------------+
5 rows in set (0.00 sec)

group by分组
GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

以下是group by在mysql中的语法

select 字段名,function(字段名) from 表名 where 字段名 operator value group by 字段名

实例

mysql> select study_title, count(*) from study group by study_title;
+-------------------------+----------+
| study_title | count(*) |
+-------------------------+----------+
| 111111111111 | 2 |
| 222222222222 | 1 |
| hello,你好 | 1 |
| 今天天气不错,就是有点热 | 1 |
+-------------------------+----------+
4 rows in set (0.00 sec)

使用 WITH ROLLUP

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:

mysql> SELECT name, SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
+--------+--------------+
| name | singin_count |
+--------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| NULL | 16 |
+--------+--------------+
4 rows in set (0.00 sec)

Mysql连接使用
在前几章节中,我们已经学会了如果在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。
本章节我们将向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。
你可以在SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

实例

mysql> SELECT a.w3cschool_id, a.w3cschool_author, b.w3cschool_count FROM w3cschool_tbl a INNER JOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author;
+--------------+------------------+-----------------+
| w3cschool_id | w3cschool_author | w3cschool_count |
+--------------+------------------+-----------------+
| 1 | John Poul | 1 |
| 3 | Sanjay | 1 |
+--------------+------------------+-----------------+
2 rows in set (0.04 sec)

mysql> SELECT b.w3cschool_id, b.w3cschool_author, a.w3cschool_count FROM w3cschool_tbl b INNER JOIN tcount_tbl a ON b.w3cschool_author = a.w3cschool_author;
+--------------+------------------+-----------------+
| w3cschool_id | w3cschool_author | w3cschool_count |
+--------------+------------------+-----------------+
| 1 | John Poul | 1 |
| 3 | Sanjay | 1 |
+--------------+------------------+-----------------+
2 rows in set (0.00 sec)

实例

以 w3cschool_tbl 为左表,tcount_tbl 为右表,理解MySQL LEFT JOIN的应用:

mysql> SELECT a.w3cschool_id, a.w3cschool_author, b.w3cschool_count FROM w3cschool_tbl a LEFT JOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author;
+--------------+------------------+-----------------+
| w3cschool_id | w3cschool_author | w3cschool_count |
+--------------+------------------+-----------------+
| 1 | John Poul | 1 |
| 2 | Abdul S | NULL |
| 3 | Sanjay | 1 |
+--------------+------------------+-----------------+
3 rows in set (0.04 sec)

实例

以 tcount_tbl 为左表,w3cschool_tbl 为右表,理解MySQL RIGHT JOIN的应用:

mysql> SELECT b.w3cschool_id, b.w3cschool_author, a.w3cschool_count FROM tcount_tbl a RIGHT JOIN w3cschool_tbl b ON a.w3cschool_author = b.w3cschool_author;
+--------------+------------------+-----------------+
| w3cschool_id | w3cschool_author | w3cschool_count |
+--------------+------------------+-----------------+
| 1 | John Poul | 1 |
| 2 | Abdul S | NULL |
| 3 | Sanjay | 1 |
+--------------+------------------+-----------------+
3 rows in set (0.00 sec)

正则表达式
在前面的章节我们已经了解到MySQL可以通过 LIKE …% 来进行模糊匹配。
MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。
如果您了解PHP或Perl,那么操作起来就非常简单,因为MySQL的正则表达式匹配与这些脚本的类似。
下表中的正则模式可应用于 REGEXP 操作符中。

模式 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
[…] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^…] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。
p1 p2
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

实例
查找study_author字段中以ni开头的所有数据:

mysql> select study_author from study where study_author regexp '^ni';
+--------------+
| study_author |
+--------------+
| nice |
| nice |
| nice |
+--------------+
3 rows in set (0.00 sec)

查找study_author字段中以no结尾的所有数据

mysql> select study_author from study where study_author regexp 'no$';
+--------------+
| study_author |
+--------------+
| nono |
| nono |
+--------------+
2 rows in set (0.00 sec)

查找study_author字段中包含n字符串的所有字符

mysql> select study_author from study where study_author regexp 'n';
+--------------+
| study_author |
+--------------+
| nice |
| nice |
| nice |
| nono |
| nono |
+--------------+
5 rows in set (0.00 sec)

查找study_author字段中以元音字符开头或以no字符串结尾的所有数据

mysql> select study_author from study where study_author regexp '^[aeiou]|no$';
+--------------+
| study_author |
+--------------+
| nono |
| nono |
+--------------+
2 rows in set (0.00 sec)

目前就学到这里吧,后面太深了,有点吃不透,留作以后进阶。

0x08 参考连接

https://www.cnblogs.com/Csir/p/7889953.html
https://www.jianshu.com/p/fd7b422d5f93
https://blog.csdn.net/robinjwong/article/details/18502195
https://www.cnblogs.com/wuyepeng/p/9744393.html