个人学习过程中总结,如有不同见解望交流。

  1. 数据库概述
    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. 数学函数:

  1. ABS(x)返回绝对值
  2. CEIL(x)返回大于等于x的最小整数
  3. POW(x,y)返回x的y次方
    ii. 字符串函数
  4. LENGTH(x)返回字节个数(中文占3个字节)
  5. CHAR_LENGTH返回字符个数
  6. concat(str1,str2,strn)将多个字符串连接成一个字符串
  7. concatws(sign,str1,str2,strn) 将多个字符串通过sign连接成一个字符串
  8. uper(str) lower(str) 将字符串全部字母变为大写/小写
  9. left,right,lpad,rpad,ltrim,rtrim,trim,repeat,replace,strcmp,substring,instr,reverse 等常用字符串截断函数
    iii. 时间和日期函数
  10. curdate()获取当前日期的字符串表示形式
  11. curtime()或 current_time() 获取当前时间的字符串表示形式。
  12. now()或 sysdate()返回当前的日期和时间。
  13. unix_timestamp() 返回 unix 当前时间戳形式。
  14. unix_timestamp(date) 如 unix_timestamp(‘yyyy-mm-dd hh:mm:ss’),返回某个形式的日期时间格式实例对应的 unix 时间戳形式。
  15. from_unixtime(long) 将 UNIX 时间戳的时间转换为普通格式的时间。
  16. datediff(d1,d2) 日期减法,计算日期 d1->d2 之间相隔的天数。
  17. adddate(date,days_num) 日期加法,计算其实日期 date 加上 days_num 天的日期。
    iv. 条件判断函数
  18. if(boolean,v1,v2)如果boolean true返回v1否则v2
  19. ifnull(v1,v2)
  20. 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. 系统函数
  21. version() 返回数据库的版本号
  22. connection_id 返回当前连接的id
  23. database() 返回当前所在数据库名称
  24. user() 返回当前用户的字符串形式
  25. 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. 字符串类型:
  26. char 定长字符串
  27. varchar 变长字符串
  28. text 长文本数据
  29. 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)

  1. distinct : select distinct xxx from xxx
  2. limit : slecet xxx from xxx limit xx;(也可用来做分页查询)
  3. group by : 要和聚合函数连用 筛选条件用 having=
  4. 子查询:子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用
    标量子查询:子查询返回一个单一的标量
  5. 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%