Mysql基础知识概括
数据库简介
数据库相关概念:
- DB:数据库,保存一组有组织的数据的容器
- DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据
- SQL:结构化查询语言,用于和DBMS通信的语言
结构化与非结构化:
结构化数据:即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据。我们可以清楚的看到能够形式化存储在数据库中,每一个列都有具体的含义,如下图所示:
Size | name |
---|---|
100 | george |
101 | dam |
102 | jordan |
- 非结构化数据:不方便用数据库二维逻辑表来表现的数据,包括所有格式的办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等等。
为什么要学习数据库?
- 持久化数据到本地
- 可以实现结构化查询,方便管理
市场中的数据库系统:
- IBM公司开发的关系数据库,典型代表产品:DB2。
- IBM公司开发的层次数据库,代表产品:IMS层次数据库。
- Oracle 公司开发的Oracle关系型数据库。
- 瑞典MySQL AB公司开发的小型关系型数据库管理系统MySQL。
数据库存储数据的特点:
- 将数据放到表中,表再放到库中
- 一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。
- 表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。
- 表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性”
- 表中的数据是按行存储的,每一行类似于java中的“对象”。
数据库中的Schema与database的关系:
- MySQL官方文档指出,从概念上讲,模式是一组相互关联的数据库对象,如表,表列,列的数据类型,索引,外键等等。但是从物理层面上来说,模式与数据库是同义的。你可以在MySQL的SQL语法中用关键字SCHEMA替代DATABASE,例如使用CREATE SCHEMA来代替CREATE DATABASE。
- 在关系型数据库中,分三级:database.schema.table。即一个数据库下面可以包含多个schema,一个schema下可以包含多个数据库对象,比如表、存储过程、触发器等。但并非所有数据库都实现了schema这一层,
比如mysql直接把schema和database等效了
,PostgreSQL、Oracle、SQL server等的schema也含义不太相同。所以说,关系型数据库中没有catalog的概念。但在一些其它地方(特别是大数据领域的一些组件)有catalog的概念,也是用来做层级划分的,一般是这样的层级关系:catalog.database.table。
MySQL简介
MySQL简介:
- MySQL是一个关系型数据库管理系统,由g典MySQLAB公司开发,目前属于Oracle公司。
- MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
- Mysql是开源的,所以你不需要支付额外的费用。
- Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库。MySQL使用标准的SQL数据语言形式。
- Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Per、PHP、Eifel、Ruby和Tcl等。Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言。
- MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。
MySQL的语法规范:
- 不区分大小写,但建议关键字大写,表名、列名小写
- 每条命令最好用分号结尾
- 每条命令根据需要,可以进行缩进 或换行
- 注释:
①单行注释:#注释文字
②单行注释:-- 注释文字
③多行注释:/* 注释文字 */
SQL的语言分类:
- DQL(Data Query Language):数据查询语言 select
- DML(Data Manipulate Language):数据操作语言 insert 、update、delete
- DDL(Data Define Languge):数据定义语言 create、drop、alter
- TCL(Transaction Control Language):事务控制语言 commit、rollback
Mysql安装:
- Linux版本的安装:
- Window版本的安装:
①链接:window10下安装MySQL详解
②配置环境变量配置以便在任何目录可执行mysql命令。
③mysql安装可以分为免安装版和安装板。
Mysql目录:
- Window版本中:
①bin目录:用于放置一些可执行文件,如mysql.exe、mysqld.exe、mysqlshow.exe等。
②data目录:用于放置一些日志文件以及数据库。
③include目录:用于放置一些头文件,如:mysql.h、mysql_ername.h等。
④lib目录:用于放置一系列库文件。
⑤share目录:用于存放字符集、语言等信息。
⑥my.ini:是MySQL数据库中使用的配置文件。
- Linux版本中:
①mysql数据库目录: /var/lib/mysql
②mysql配置文件目录: /usr/share/mysql
③相关命令目录 :/usr/bin
DQL语言
基础查询
语法:
select 查询列表 from 表名;
特点:
- 查询列表可以是字段、常量、表达式、函数,也可以是多个
- 查询结果是一个虚拟表
示例:
- 查询单个字段
select 字段名 from 表名;
- 查询多个字段
select 字段名,字段名 from 表名;
- 查询所有字段
select * from 表名
- 查询常量
①注意:字符型和日期型的常量值必须用单引号或双引号引起来,数值型不需要
②单引号和双引号没区别。
select 常量值;
- 查询函数
select 函数名(实参列表);
- 查询表达式
select 100/1234;
-
起别名
①as:写as。
②空格:不写as,起个空格。
③as和空格两者没啥区别
④使用双引号:会将别名解析成双引号里的内容.引号是什么.别名就是什么。
⑤不使用双引号:即使别名全部命名成小写,也会被解析成大写字母。所以,双引号一般会用在最外层的select子句中,保证列名的大小写是你想要的结果。
⑥注意:如一句sql语句中,使用"tname"做别名,后面调用"tname"需要使用双引号,不使用双引号的tname会被解析成TNAME,此时会找不到对应的列,会报错.因为对应的列被我们解析成了tname, 和TNAME是不相同的列。
-
去重
select distinct 字段名 from 表名;
-
+号
①在java中+号的:
<1>运算符,两个操作数都为数值型。
<2>连接符:只要有一个操作数为字符串。
②在mysql中只有一个作用:运算符,做加法运算
<1>select 数值+数值; 直接运算
<2>select 字符+数值;先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算
③select null+值;结果都为null -
【补充】concat函数
①功能:拼接字符
select concat(字符1,字符2,字符3,...);
- 【补充】
ifnull函数
①功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
select ifnull(commission_pct,0) from employees;
- 【补充】
isnull函数
①功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0 - 【补充】操作符:
IS NULL
和IS NOT NULL
①功能:和isnull函数类似。 - 总结:
查询空值的运行速度基本上为:IFNULL() > IS NULL > ISNULL()
注意:
- Mysql 一个字段定义成int类型,查询时传入String,会截取字符串( Mysql会将从左到右的第一个非数值开始,将后面的字符串转成0,在和数值类型相加。)
- 但是一个字段定义成int类型,插入时传入String将会报错
条件查询
条件查询分类:
-
一、
条件表达式:
①示例:salary>10000
②条件运算符:> < >= <= = != <> -
二、
逻辑表达式:
①示例:salary>10000 && salary<20000
逻辑运算符:
②and(&&):两个条件如果同时成立,结果为true,否则为false
③or(||):两个条件只要有一个成立,结果为true,否则为false
④not(!):如果条件成立,则not后为false,否则为true -
三、
模糊查询
:LIKE
①示例:last_name like ‘a%’
②NOT LIKE:NOT LIKE的使用方式与之相同,用于获取匹配不到的数据 -
四、
范围查询:
BETWEEN…AND… 与 IN 与EXISTS
①BETWEEN...AND...和 >= and <=是等价的。
②NOT IN:NOT IN的使用方式与之相同,用于获取匹配不到的数据
③EXISTS:SELECT … FROM table WHERE EXISTS subquery
<1>该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE或FALSE)来决定主查询的数据结果是否得以保留。
<2>提示:
1、EXISTS (subquery)只返回TRUE或FALSE,因此子查询中的SELECT’也可以是SELECT1l或select oK,官方说法是实际执行时会忽略SELECT洁单,因出没有区别
2、EXSTS子查询的实际执行过程可能经过了忧化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以碗定是否有效率问题。
3、EXISTS子查询往往也可以用条件表达式、其他子查询或者JON来替代,何种最优需要具体问题具体分析
排序查询
简介:
- 语法:
select
要查询的东西
from
表
where
条件
order by 排序的字段|表达式|函数|别名 【asc|desc】
- order by 默认
升序(从小到大)
,升序为asc(a为首字母)
,降序为desc。
- MySQL将null算作最小值,因此:
<1>将null强制放在最前:
if(isnull(字段名),0,1) asc //asc可以省略
<2>将null强制放在最后
if(isnull(字段名),0,1) dsc
if(isnull(字段名),1,0) asc //asc可以省略 - order by 后面
加rand()可以随机排序
。 order by 多个字段时,优先排序写在前面的字段,后面的字段的排序是在前面排序好的数据中相同的区间里排序(即后面的字段的排序不会破坏前面的字段的排序)
常见函数
单行函数:
字符函数
concat拼接
substr截取子串
upper转换成大写
lower转换成小写
trim去前后指定的空格和字符
ltrim去左边空格
rtrim去右边空格
replace替换
lpad左填充
rpad右填充
instr返回子串第一次出现的索引
length 获取字节个数数学函数
round 四舍五入
rand 随机数
floor向下取整
ceil向上取整
mod取余
truncate截断日期函数
now当前系统日期+时间
curdate当前系统日期
curtime当前系统时间
str_to_date 将字符转换成日期
date_format将日期转换成字符流程控制函数
if 处理双分支
case语句 处理多分支
情况1:处理等值判断
情况2:处理条件判断其他函数
version版本
database当前库
user当前连接用户- 链接:MySQL 函数
interval日期函数:
- 链接:MySql时间处理及interval函数运用
- 当函数使用时,即interval(),为比较函数,如:interval(10,1,3,5,7); 结果4;
- 原理:10为被比较数,后面1,3,5,7为比较数,将后面四个依次与10比较,看后面数字组有多少个少于10,则返回其个数。前提是后面数字组为从小到大排列,否则返回结果0。
- 当关键词使用时,表示为设置时间间隔,常用在date_add()与date_sub()函数里,
如:interval 1 day,解释为将时间间隔设置为1天。
单行函数,日期函数的优劣:
- mysql的一些个性:
①单表千万级别(优化到极致能达到亿级别)行记录存储,简单条件(最好条件上有索引,当然也需要看具体case)查询
②mysql喜欢大内存(可以将大量的索引直接放到内存中),喜欢高性能IO(比如SSD)
③高并发的时候,CPU资源消耗也是非常严重的。如果峰值请求的时候,给遇上一个mysql函数(需要CPU做计算),那就很可能因为一个简单mysql函数酿成了悲剧。mysql出事故的时候,load很容易飙到100+ mysql不是系统的瓶颈
①该场景下可以随意的使用mysql提供的特性功能,例如msyql函数,多方便好用啊。较少了应用层的工作量。而且对你系统性能没有多大的影响。
②举例说明:小型系统,请求量小,数据存储量小,mysql server内存充足,统计需求(一个sql跑一个晚上你也不担心)