MySQL基础入门

在任何一组东西中,最重 要的只占其中一小部分,约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 or TRUNCATE 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

img_innerjoin.gif

INNER JOIN,内连接,或等值连接,主要产生同时符合table1和table2的一组数据

LEFT JOIN

img_leftjoin.gif

LEFT JOIN左连接以左表table1为主表,即以主表产生一套完整的记录,去右表中匹配的记录 .如果没有匹配到,则置为null

RIGTH JOIN

img_rightjoin.gif

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 命令都能看些什么东西,可以用如下命令:? showhelp show

又如,想查看 CREATE TABLE 的语法,可以使用以下命令:
? CREATE TABLEhelp CREATE TABLE

常用的网络资源

https://www.mysql.com/ 是 MySQL 的官方网站,可以下载到各个版本的 MySQL 以及相关客户端开发工具等,提供了目前最权威的 MySQL 数据库及工具的在线手册。


至此已经把MySQL 中基础部分总结完成,后续文章将总结MYSQL一些其他特性,如视图,存储过程,触发器,事务,游标,索引原理,性能优化等


<END>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,028评论 0 19
  • MySQL技术内幕:SQL编程 姜承尧 第1章 SQL编程 >> B是由MySQL创始人之一Monty分支的一个版...
    沉默剑士阅读 2,404评论 0 3
  • 手动不易,转发请注明出处 --Trance 数据库系统命令: (1).查看存储过程状态:show pro...
    Trance_b54c阅读 1,646评论 0 8
  • 1. 了解SQL 1.1 数据库基础 ​ 学习到目前这个阶段,我们就需要以某种方式与数据库打交道。在深入学习MyS...
    锋享前端阅读 1,038评论 0 1
  • 这些日子过得太逍遥,自来醒自来睡,无所顾及无所期盼。几日就无趣了,看来人活下来就得有事做呢,要不就会自来的找事做,...
    水杯阅读 234评论 0 1