在任何一组东西中,最重 要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的,这就是大家所知道的** 二八原则 ,换句话说:可以用最少的时间和精力学习到最核心的知识,即用20%的时间和精力来做到80%的效果,这也是这篇文章的初衷。本文将总结出MySQL中最常用的知识,以此达到快速学习的目的。MySQL是一个实用性工具,学习的最好方式是实践,实践,实践**。
本文主要分为下面几部分:
- 数据库中涉及到的基本概念
- MySql安装与连接及工具
- 数据操作
- 索引的简单介绍
1 基本概念
数据库
- 按照数据结构来组织、存储和管理数据的仓库,可以理解为一个文件夹或者是仓库,里面存放各种有结构的数据
表
- 某种特定类型数据的结构化列表,类似于EXCEL中的表格
模式
- 关于数据库或表的描述信息,如表包含哪些列,每列的数据是数字还是文本等
列
- 表中的一个字段。所有表都是由一个或多个列组成的,同一列数据类型相同
行
- 表中的一个记录,MySQL 中以行的形式存储数据
主键
- 表中能够唯一标识每一行数据的的一列或多列,如登记学生的信息,学生都有唯一的学号,这个学号就可以设置为主键,当然也可以用身份证号
2 MySql的安装与工具
MySql的安装
-
mysql下载地址
访问上述下载地址,根据自己的操作系统选择对应的安装包,目前最新的版本已经到了8.0,但是现在好多公司还是使用5.7左右的版本,因此也说明了版本不是越新越好的。
连接工具
安装mysql后,连接数据库有多种方法:
- 命令行连接
> mysql -h 127.0.0.1 -u root -p
-- 使用root用户登录到本地3306端口上的数据库,也可以登录远程的,只要把-h 后面地址改成远程ip即可
- 使用工具连接
主要图形化工具有
两个都是可以通过图形界面的形式访问数据库。可根据个人使用喜好选择。
3 SQL 语法
SQL 用于访问和处理数据库的标准的计算机语言,主要操作包括对数据库,表及表中记录的 增删改查(CRUD)。在我们新安装的数据库系统中,只有系统库,需要新建数据库才能进行后续操作,所以先学习数据库 的CRUD操作。
数据库的操作
- 增
create database db_name;
- 删
drop database db_name;
- 改
RENAME DATABASE db_name TO new_db_name
- 查
show databases;
以上是数据库所有的命令,很简单吧,需要注意的是 SQL 命令是不区分大小写的,一般习惯 sql支持的命令名称 用大写,其他自定义名称用小写,;
表示 一条命令的结束,命令行时要查询哪个数据库下的表有两种方式,一是用use db_name;
切到对应数据库下,以后的操作就是针对这个数据库下的操作,二是可以使用db_name.table_name
的全限定的方式查询对应表。
表的操作
表的操作也有CRUD,不过稍微复杂一点。
- 查
show tables;
- 删
drop table table_name;
- 改
alter table old_table_name rename to new_table_name
- 增
CREATE TABLE tablename
(
column1 datatype [NULL|NOT NULL] [CONSTRAINTS],
column2 datatype [NULL|NOT NULL] [CONSTRAINTS],
...,
primary key(column1 )
);
注, [ ] 表示这一项可写可不写。
举个例子,建一个名称为 student 的表,有姓名 name,年龄 age,性别sex三列,建表语句如下:
CREATE TABLE `student` (
`name` varchar(30) CHARACTER SET utf8 NOT NULL,
`age` int(11) DEFAULT NULL,
`sex` char(1) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
表中记录的操作
插入 insert
为了能进行实操,先学习如何插入记录到表中,上面的例子中已经新建了表student,假设插入如下数据到表中
姓名 | 年龄 | 性别 |
---|---|---|
张三 | 20 | 男 |
李四 | 18 | 男 |
王五 | 16 | 男 |
韩梅梅 | 14 | 女 |
李雷 | 14 | 男 |
插入语句为:
INSERT INTO student(name,age,sex) VALUES('张三',20,'男');
INSERT INTO student(name,age,sex) VALUES('李四',18,'男');
INSERT INTO student(name,age,sex) VALUES('王五',16,'男');
INSERT INTO student(name,age,sex) VALUES('韩梅梅',14,'女');
INSERT INTO student(name,age,sex) VALUES('李雷',14,'男');
这样我们就得到了5条数据,也可以指定部分列进行插入,后面的值要和列对应。可以看出向表中插入数据的基本格式为:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
// 如果插入所有字段,table_name 后面的列可以省略。
特别的,可以从别的表中查询插入,如向student2(和student表结构一致) 表插入数据年龄大于15的学生(关于如何查询下章介绍),SQL如下:
INSERT INTO student2
SELECT name,age,sex
FROM student
WHERE age > 15;
// 语句形式为:Insert into Table2(字段1,字段2
,...) select 字段1,字段2,... from Table1;
检索
从表中查询需要的数据又称为检索,支持查询,去重,排序,分组,统计等操作。
单列,多列,所有列的检索
语法格式:
SELECT col1[,col2,col3...] FROM table_name;
或:
SELECT * FROM table_name;
上面一条语句可以选择表中的一列或者多列进行展示,而第二条语句则进行所有列展示,可用于不知道表中字段情况查询。
去重 distinct
- distinct 作用于所有的列
SELECT DISTINCT col1[,col2,col3...] FROM table_name;
限制结果 limit
有时不需要展示太多条数据,可以使用limit进行限制,语法如下:
SELECT col1[,col2,col3...]
FROM table_name
LIMIT n[,m];
limit 后面可带一个数字,表示取几条数据,也可以用逗号隔开的两条数据,表示从第n条开始取,取m条数据。
注释
注释主要用来备注说明,或者有时候忽略掉不需要的语句,主要有两种方式:
- 行内注释 -- 或#
- 多行注释 /* */
如:
-- 这是行注释, 注意-- 后面是要有一个空格的
# 这也是行注释
SELECT * FROM table_name ...;
...
/*
这是多行注释,可以换行
*/
SQL语句...
排序 order by
如果需要对查询结果进行排序(升序或者降序),可以使用order by 子句,order by子句一定是select的最后一条子句,其还有如下特点:
- 后可加 多列
- 可按照列位置排序 即order by 1,2(1,2 表示select 后字段位置序号)
- 可按非选择列排序,即不在select 后展示的列
- 默认升序asc, 倒序用desc
条件过滤 where
当需要按照条件进行筛选数据时,可用where 子句,where子句一般跟在表名之后,
- 支持的操作符有: + ,<> ,!= ,<, <=, >, >= ,BETWEEN ... AND ...,IS NULL,IS NOT NULL, 注意,IS NULL 不能用 = NULL 去判断
- 逻辑操作符 AND OR
- 逻辑操作符优先级
- 通配符过滤 like
- % 表示 任何字符出现任何次数,但不会匹配NULL
- _ 只匹配单个字符
- [] 指定一个字符集,匹配指定位置的一个字符,可使用[^ ] 来否定
字段的计算
有时需要对多列字段进行组合或者一些计算以达到目的,主要支持的计算有:
- 字段拼接 concate函数
- 去前后空格 trim
- 字段别名(或叫导出列) As
- 算术运算 +-*/
函数
函数是辅助字段计算的方式,一般给定一定个数输入,函数会输出一个值,主要可以分为以下几类,
- 文本处理函数
CONCAT(str1, str2, ...):拼接字符串
CONCAT_WS(separator, str1, str2, ...):使用指定分隔符连接字符串
LEFT(str, length):从左截取指定长度的子字符串
RIGHT(str, length):从右截取指定长度的子字符串
SUBSTRING(str, index, length):从指定位置处开始截取指定长度的子字符串
LENGTH(str):返回字符串的长度
LOWER(str):将字符串转换为小写格式
UPPER(str):将字符串转换为大写格式
LTRIM(str):去除字符串左侧的空格
RTRIM(str):去除字符串右侧的空格
TRIM(str):去除字符串两侧的空格
FORMAT(X, D):按照指定的小数位数D将数值X转化为字符串
LPAD(str, length, padStr):在字符串左侧用padStr将原字符串填充至指定长度,当指定长度小于原字符串长度时,截断原字符串
RPAD(str, length, padStr):在字符串右侧用padStr将原字符串填充至指定长度,当指定长度小于原字符串长度时,截断原字符串
REPLACE(str, from_str, to_str):将字符串中的所有匹配的字符串替换为新字符串
REVERSE(str):将字符串逆序输出
- 日期和时间处理函数
NOW():返回当前的时间和日期
CURDATE():返回当前的日期
CURTIME():返回当前时间
DATE(dateAndTime):提取日期时间表达式中的日期部分
DAY():返回日期时间表达式中的天数部分
YEAR():返回日期时间表达式中的年部分
EXTRACT(unit FROM date):按照指定的时间单位从日期时间表达式中提取年、月、日、时间等部分
DATE_FORMAT(date, format):按照指定格式显示时间日期
DATE_ADD(date, INTERVAL exp unit)、DATE_SUB(date, INTERVAL exp unit):日期和时间的加减操作。返回值是否包含时间取决于给定的时间日期的表达式和时间单位。
DATEDIFF(date1, date2):返回两个日期的差值,会忽略表达式中的时间,仅对日期进行运算
ADDDATE(date, INTERVAL exp unit):等同于DATE_ADD()
ADDDATE(date, days):在给定的日期上加上给定的天数
ADDTIME(time1, time2):将两个时间表达式相加
- 数值处理函数
ABS() 返回一个数的绝对值
COS() 返回一个角度的余弦
EXP() 返回一个数的指数值
PI() 返回圆周率
SIN() 返回一个角度的正弦
SQRT() 返回一个数的平方根
TAN() 返回一个角度的正切
数据汇总
- 聚集函数:对某些行运行的函数,计算并返回一个值
AVG() 返回某列的平均值
COUNT() 返回某列的行数,使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。
使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和
数据分组
分组即根据一列或者几列,将一个数据集划分成若干个“子集”,然后针对若干个“子集”进行数据处理
- 分组是使用SELECT语句的GROUP BY子句建立的
- 在非分组的列(即非group by 后面的列)上可以使用 COUNT, SUM, AVG,等函数
- 过滤分组 having,支持所有WHERE操作符
语法:
SELECT column_name, function1(col1[,col2...])[, function2(col3,col4...)]
FROM table_name
WHERE condition
GROUP BY column_name
SELECT子句顺序
子 句 | 说 明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
修改 update
UPDATE table_name SET field = new_val[, field = new_val] [ WHERE condition1 [and condition2]]
删除 delete
DELETE FROM table_name WHERE condition1 [and condition2]
- 全表内容删除
DELETE FROM table_name
orTRUNCATE TABLE table_name
组合与连接 union / join
组合 UNION /UNION ALL
UNION/UNION ALL 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。UNION多个 SELECT 语句会删除重复的数据,而UNION ALL多个 SELECT 语句不会删除重复的数据。
语法:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
连接JOIN
前面主要是在一张表中读取数据,但是在真正的应用中经常需要从多个数据表中读取数据。本节介绍多表关联连接操作JOIN。在 SELECT, UPDATE 和 DELETE 语句中都可使用 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
语法:
SELECT col1,col2 ...
FROM table1
INNER|LEFT|RIGHT JOIN table2
ON condition1[,condition2,...]
INNER JOIN
INNER JOIN,内连接,或等值连接,主要产生同时符合table1和table2的一组数据
LEFT JOIN
LEFT JOIN左连接以左表table1为主表,即以主表产生一套完整的记录,去右表中匹配的记录 .如果没有匹配到,则置为null
RIGTH JOIN
RIGTH JOIN右连接和 LEFT JOIN 正好相反,以右表table2为主表,即以右表产生一套完整的记录,去左表中匹配的记录 .如果没有匹配到,则置为null。如果把 LEFT JOIN 中table1和table2互换位置,则结果等价于 RIGTH JOIN。
4 MySQL索引操作
索引的知识可以写成一本书,这里只简单介绍一部分。索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书的目录,能加快数据库的查询速度。
直接创建索引
CREATE [UNIQUE] INDEX index_name ON table_name(column1(length)[,column2(length),...]) ;
修改表结构的方式添加索引
ALTER TABLE table_name ADD [UNIQUE] INDEX index_name ON (column1(length)[,column2(length),...]);
创建表的时候同时创建索引
CREATE TABLE `table_name` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) NOT NULL ,
`sex` char(3) NULL ,
`age` int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
[UNIQUE] INDEX index_name (name(length))
);
删除索引
DROP INDEX index_name ON table_name;
帮助文档使用
在 MySQL 使用过程中,可能经常会遇到以下问题:
- 某个操作语法突然忘记了
- 当前版本上,都支持哪些函数?
- 当前版本上,是否支持某个功能?
当然我们可能想到查找 MySQL 的文档。但是却要耗费大量的时间和精力。 所以对于以上问题,最好的解决办法是使用 MySQL 安装后自带的帮助文档,在遇到问题时可以方便快捷地进行查询
按照层次看帮助
如果不知道帮助能够提供些什么,可以用?contents
或者 help contents
命令来显示所有可供查询的的分类,然后对于列出的分类,可以使用help 类别名称
的方式针对用户感兴趣的内容做进一步的查看。
快速查阅帮助
在实际应用当中,如果需要快速查阅某项语法时,可以使用关键字进行快速查询。例如,想知道 show 命令都能看些什么东西,可以用如下命令:? show
或 help show
又如,想查看 CREATE TABLE 的语法,可以使用以下命令:
? CREATE TABLE
或 help CREATE TABLE
常用的网络资源
https://www.mysql.com/ 是 MySQL 的官方网站,可以下载到各个版本的 MySQL 以及相关客户端开发工具等,提供了目前最权威的 MySQL 数据库及工具的在线手册。
至此已经把MySQL 中基础部分总结完成,后续文章将总结MYSQL一些其他特性,如视图,存储过程,触发器,事务,游标,索引原理,性能优化等
<END>