个人学习过程中总结,如有不同见解望交流。
- 数据库概述
a) 概念:数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
b) 数据库分类:主要分为关系型和非关系型
关系型数据库:各个数据之间存在关联
1.特点:数据形式是表,由二维表以及表之间的联系形成的数据组织
2.优点:
1)可复杂查询:可以用SQL语句方便的进行非常复杂的join查询等
2)支持事务ACID:保持数据的一致性和安全性
3)易于维护:由于是表结构,格式都一致
3.缺点:
1)不擅长处理大量数据读写,因为要维护数据的一致性
2)表在增加索引和变更表结构时数据无法更新
3)添加字段不固定的记录时很麻烦
4)进行非常简单的查找时速度相对较慢
5)不易于数据的分散:由于关系型的原因,表之间的join操作需要数据在同一服务器内
非关系型数据库:又被称为NoSQL(not only sql),各个数据之间相互独立
1.特点:基于键值对来存储,分布式且不提供事务
2.优点:
1)高性能:因其不需要解析sql语句的过程,所以读写性能很高,擅长处理大量数据
2)易于扩展:因其基于键值对的结构存储,数据没有耦合性
3)可储存各种格式
4)查询速度快:nosql数据库将数据存于缓存中,比数据存在硬盘中的关系型数据库查询速度要快得多
5)易于数据的分散:因为数据相互独立,数据分散在各个服务器上,对大量数据的读写的压力小
3.缺点:
1)不支持sql ,学习使用成本较高
2)只适合储存简单类型的数据
2. 数据库的安装和使用
yum安装即可
启动服务 service mysqld start
修改密码: mysql -u root , use mysql , update user set password=’xxx’ where user = ‘root’ , flush privileges (使修改生效)
3. SQL基本语法
a) 函数:
i. 数学函数:
- ABS(x)返回绝对值
- CEIL(x)返回大于等于x的最小整数
- POW(x,y)返回x的y次方
ii. 字符串函数 - LENGTH(x)返回字节个数(中文占3个字节)
- CHAR_LENGTH返回字符个数
- concat(str1,str2,strn)将多个字符串连接成一个字符串
- concatws(sign,str1,str2,strn) 将多个字符串通过sign连接成一个字符串
- uper(str) lower(str) 将字符串全部字母变为大写/小写
- left,right,lpad,rpad,ltrim,rtrim,trim,repeat,replace,strcmp,substring,instr,reverse 等常用字符串截断函数
iii. 时间和日期函数 - curdate()获取当前日期的字符串表示形式
- curtime()或 current_time() 获取当前时间的字符串表示形式。
- now()或 sysdate()返回当前的日期和时间。
- unix_timestamp() 返回 unix 当前时间戳形式。
- unix_timestamp(date) 如 unix_timestamp(‘yyyy-mm-dd hh:mm:ss’),返回某个形式的日期时间格式实例对应的 unix 时间戳形式。
- from_unixtime(long) 将 UNIX 时间戳的时间转换为普通格式的时间。
- datediff(d1,d2) 日期减法,计算日期 d1->d2 之间相隔的天数。
- adddate(date,days_num) 日期加法,计算其实日期 date 加上 days_num 天的日期。
iv. 条件判断函数 - if(boolean,v1,v2)如果boolean true返回v1否则v2
- ifnull(v1,v2)
- case when then else end:有两种形式:1:case xxxx when x then x else x end 2:case when xxxx then x when xxxx then x else x end
v. 系统函数 - version() 返回数据库的版本号
- connection_id 返回当前连接的id
- database() 返回当前所在数据库名称
- user() 返回当前用户的字符串形式
- charset(str) 返回当前字符编码
b) 数据类型:
i. 数值类型: 从小到大依次tinyint,smallint,mediumintint,int(integer的缩写),bigint,float,double,decimal
ii. 日期类型:date(YYYY-MM-DD),time(HH:MM:SS),year(YYYY),datetime(YYYY-MM-DD HH:MM:SS),timestamp(YYYYMMDDHH:MM:SS)
iii. 字符串类型: - char 定长字符串
- varchar 变长字符串
- text 长文本数据
- blob 二进制长文本数据
c) 语句语法
1.DDL (数据定义)
create:1.create database xxx //新建数据库
2.create table xxx(字段 类型,… ) //新建表
ENGINE = innoDB //设置存储引擎
(存储引擎:) DEFAULT charset=utf8 //设置默认编码
drop: 1.drop database xxx; 删库
2.drop table xxx; 删表
alter: 1.add: alter table xxx add xxx int/alter table xxx add aaa int after bbb unsigned not null auto_increment primary key 在最后的位置增加表的字段/在bbb字段后面加字段(无符号 不为null 自增主键)
2.alter table xxx drop xxx 删字段
3.rename : alter table xxx rename xxx 改表名
4:change: alter table xxx chenge aaa bbb varchar(20); 改表字段和类型
5.modify:alter table xxx modify clumn xxx varchar(10) comment ‘xxx’ 修改字段类型(comment注释)
6.engine:alter table xxx engine = innodb; 修改存储引擎
索引: 1. create index xxx on table xxx 添加普通索引或unique索引
2..drop index xxx on table xxx / alter table xxx drop index xxx / alter table xxx drop primary key
3. alter table xxx add 索引类型(index,uniq,primary key)clumns_list(即多个字段)
其他索引的注意事项:[转载引用]()
2.DML (数据控制)
insert:insert into tablename (clumns_list) values (values_list);
delete: delete from tablename where 字段名 = values
update: update tablename set clumn1=newvalue1,clumn2=newvalue2 where xxx=xxx;
Load:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE ‘file_name.txt’
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY ‘string’]
[[OPTIONALLY] ENCLOSED BY ‘char’]
[ESCAPED BY ‘char’ ]
]
[LINES
[STARTING BY ‘string’]
[TERMINATED BY ‘string’]
]
[IGNORE number LINES]
[(col_name_or_user_var,…)]
[SET col_name = expr,…)]
LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并装入一个表中。文件名称必须为一个文字字符串。
由character_set_database系统变量指示的字符集被用于解释文件中的信息。SET NAMES和character_set_client的设置不会影响对输入的解释。
3.DQL(数据查询)
select xxx
from table
where xxx=xx (or , and ,in/not in , like)
group by xxx
having xxx
order by xxx asc/desc)
(union / union all)
- distinct : select distinct xxx from xxx
- limit : slecet xxx from xxx limit xx;(也可用来做分页查询)
- group by : 要和聚合函数连用 筛选条件用 having=
- 子查询:子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用
标量子查询:子查询返回一个单一的标量 - MYSQL应用
SQL优化:避免全表扫描。
全表扫描的情况:
1.where 条件对null值判断
2.where条件判断<>、!=
3.where判断in/not in(可以用between或exist代替)
4.where条件中使用参数
5.where条件中对字段使用表达式或函数 如:where age/2<10
6.or连接时,左右任意一个字段没有索引都会进行全表扫瞄
7.like 左右都模糊查询%a%