ldl-1

早就想把自己的数据库基础巩固一下,然而一直没有时间,今天终于抽出时间对mysql数据库基础进行了学习与扩展。

mysql与其他数据库的区别

Sqlite: 开源免费,体积小,单文件,没有进程。磁盘读性能强大。写并发性较低。
Mysql:开源免费,关系型数据库,体积小性能强,完全的多线程实现,多平台移植。
Sqlserver:微软出品,只能运行在windows上。与windows server 配合很好
Oracle:安全性高,性能高,兼容性高,可移植性高。价格昂贵,维护难度大,学习成本高。

mysql实例及重要版本节点

实例即服务器上的进程。ps -ef|grep mysql可以进行查看。
mysql重要的版本节点:5.5/5.7/8.0
(详情了解这里

视图

虚拟表,实际是执行一个预置sql。表面和表格一样,对代码不透明。

索引

索引的作用:快速定位数据。
索引的缺点:额外占用空间,数据变更时需要同步更新索引。(详情了解这里
索引的类型:
1)普通索引 index:加速查找数据。
2)唯一索引
主键索引:primary key 加速查找+约束(不为空且唯一)。
唯一索引:unique 加速查找数据+约束(唯一)。
3)联合索引:
primary key(id,name):联合主键索引。
unique(id,name):联合唯一索引。
index(id,name):联合普通索引。
4)全文索引fulltext :用于搜索很长一篇文章的时候,效果最好。
5)空间索引spatial :了解就好,几乎不用

创建/删除索引的语法

点击查看代码
#方法一:创建表时
      CREATE TABLE 表名 (
                 字段名1  数据类型 [完整性约束条件…],
                  字段名2  数据类型 [完整性约束条件…],
                  [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
                  [索引名]  (字段名[(长度)]  [ASC |DESC]) 
                  );
   
#方法二:CREATE在已存在的表上创建索引
         CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名 
                      ON 表名 (字段名[(长度)]  [ASC |DESC]) ; 

 #方法三:ALTER TABLE在已存在的表上创建索引
         ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX
                              索引名 (字段名[(长度)]  [ASC |DESC]) ;   
	
 #删除索引:DROP INDEX 索引名 ON 表名字;


`善用帮助文档
help create
help create index

1.创建索引
-在创建表时就创建(需要注意的几点)
create table s1(
id int ,#可以在这加primary key
#id int index #不可以这样加索引,因为index只是索引,没有约束一说,
#不能像主键,还有唯一约束一样,在定义字段的时候加索引
name char(20),
age int,
email varchar(30)
#primary key(id) #也可以在这加
index(id) #可以这样加
);
-在创建表后在创建
create index name on s1(name); #添加普通索引
create unique age on s1(age);添加唯一索引
alter table s1 add primary key(id); #添加住建索引,也就是给id字段增加一个主键约束
create index name on s1(id,name); #添加普通联合索引
2.删除索引
drop index id on s1;
drop index name on s1; #删除普通索引
drop index age on s1; #删除唯一索引,就和普通索引一样,不用在index前加unique来删,直接就可以删了
alter table s1 drop primary key; #删除主键(因为它添加的时候是按照alter来增加的,那么我们也用alter来删)`

常见函数

IF:三个参数,第一个参数为返回真假的表达式,当表达式为1时,函数返回第二个参数,否则返回第三个参数。
UNIX_TIMESTAMP:当无参数时返回当前时间戳,加日期参数返回的是日期时间戳。
FROM_UNIXTIME:把时间戳格式化。
COUNT:聚合函数,计数。
SUM:聚合函数,求和。
LENGTH:返回字符串长度。
(详情点击这里

基础sql

1.insert
Insert into table( col1,col2,… ) values (col1val, col2val,…) ;正常用法(当有主键,插入相同数据时,报错;当没有主键时,会直接插入,产生相同数据)。
(`的作用,通常用来说明其中的内容是数据库名、表名、字段名,防止数据库将其识别为关键字)

Replace into :
与insert into类似(当有主键或唯一索引时, 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据,否则,直接插入新数据。当不存在主键时,replace into 会直接插入数据,这将导致表中出现重复的数据。)

Insert ignore into:当在表中发现已存在数据时,忽略新数据。

Insert into … ON DUPLICATE KEY UPDATE values(col)

  1. on duplicate key update 含义:
    1)如果在INSERT语句末尾指定了 on duplicate key update,
    并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,
    则在出现重复值的行执行UPDATE;
    2)如果不会导致唯一值列重复的问题,则插入新行。

  2. values(col_name)函数只是取当前插入语句中的插入值,并没有累加功能。
    如:count = values(count) 取前面 insert into 中的 count 值,并更新
    当有多条记录冲突,需要插入时,前面的更新值都被最后一条记录覆盖,
    所以呈现出取最后一条更新的现象。
    如:count = count + values(count) 依然取前面 insert into 中的 count 值,
    并与原记录值相加后更新回数据库,这样,当多条记录冲突需要插入时,
    就实现了不断累加更新的现象。

注:insert into ... on duplicate key update ... values() 这个语句
尽管在冲突时执行了更新,并没有插入,但是发现依然会占用 id 序号(自增),
出现很多丢失的 id 值,
(详情点击这里

Insert into table1( col1,col2,… ) select col1,col2,… from table2
从一个表中复制数据,然后将数据插到另一个表中。

Insert into table1
select * from table2

将一个表中的所有列插到另一个表中。

2.update
1)Update table set col=val where 正常更新。
2)update table set sex= \'男\', name=\'张三\' where id = 1 ; 更新多个字段用逗号,而不是and。
3)UPDATE table1 a left JOIN table2 b ON a.HOSTID = b.hostid SET a.GROUP_ID = CASE ID
    WHEN 1 THEN
    \'abc\'
    WHEN 2 THEN
    \'def\'
    WHEN 3 THEN
    \'ghi\'
    ELSE
    \'jkl\'
END
WHERE b.groupid = \'00000000-1111-2222-3333-444444444444\'

复杂情况,结合表联合、case。

3.delete
delete from where 正常用法。

复杂语句分析

Select ... from ... join ... on ... where ... group by ... having ... order by ... limit

分析顺序:
From →join→on→where→groupby→Select→having→orderby→limit

Where 中的匹配方式
=, >, <, >=, <=, <>, !=
In, not in, like, between, is null, is not null

修改表结构的DDL

Create,Alert,Drop

另外有一个学sql的网站这里,有空可以多看看。

分类:

技术点:

相关文章: