我看了一下自己之前应该是没有写过SQL相关的东西,以后打算把各种关系型数据库学习的东西也都扔进去,因为其实感觉区别不大,也就是各个数据库的数据类型和扩展函数不太一样。
这次主要整理的是上周五(8月9日)的SQL学习内容,大概是把SQL自带函数之前的基础知识看完了。但是不整理它就永远是一坨零碎的笔记,于是整理一下。
简介
SQL的全称是结构化查询语言(Structed Query Language,SQL),实际上只是一个语言标准,当前的各种关系型数据库都会在支持SQL的基础上增加了各种可能没什么用的内容。
SQL对大小写不敏感,我全部小写主要是因为敲大写太累了,没必要。反正命令部分有需要的话大写即可。
那天实际上的操作是在Oracle上完成的,因为当时没有装好MySQL,但其实大多数东西差不多可以通用,如果以后还有什么不同的地方我会在相应位置补全。
Oracle和MySQL的区别(个人感到的)
目前可以感到的就是“database”这个概念大概Oracle是没有的,因为它的表是直接放在用户下边,一个用户负责一套表的管理,这样说实话我还比较喜欢,不太理解MySQL用户下边还要再塞一堆数据库做什么,那么新建用户说实话就没有什么意义了,全交给dba不就行了?反正普通用户去搞建表这套操作搞不好是要丢饭碗的。
增删改查
这里的增删改查针对的是数据库里的表的内容进行的操作,不是对表这个对象的操作。
/*单纯的查找功能,*部分可以替换成每一列中的项,这些项还可以空格后取别名,where主要是加筛选条件的,order by进行排序,在前面的属性优先排列,desc表示从大到小排列,distinct可以把不重复的内容拿出来*/
select (distinct) * from table_name where ... order by ...(desc);
/*更改数据项的值,where确定位置,务必不能丢,不然可能会发生全部数据都被改掉的惨剧*/
update table_name set xx=yy where ...;
/*删除一行数据,where确定位置,大多数情况不能丢,丢了就把整个表清空了,当然你要真的想清空表也算是一种方法大概*/
delete from table_name where ...;
/*插入一行数据,第一个括号,是每一项的名字,第二个括号,是每一项要插入的值*/
insert into table_name(...) values (...);
这几句大概是没有建表权限的人用的最多的话,估计前期大部分时间都在干这个事情。因为建表毕竟还是需要一定设计的,暂时不会。
另外提一句,MySQL引号没有特殊要求,但Oracle应该是只能用单引号。
select top操作,这个操作的意思是从一张表里取出前几个元素,但是MySQL实际用的是LIMIT关键字,Oracle实际用的是ROWNUM来控制。
-- MySQL取出表中前5个数据
select * from table_name limit 5;
-- Oracle取出表中前5个数据
select * from table_name where ROWNUM <= 5;
模式匹配
实际上就是模糊查找,就我看的这点内容,好像在正则表达式上的支持实际上数据库可能不是太好,如果有变动我再后边补充,之际上大概也就用了一个LIKE关键字和%和_两个通配符。其中%代表了一个到多个字符_只代表一个字符。似乎支持一点正则表达式的内容,用^[]在中括号填写,但是使用起来似乎不太方便,也可能是我本人对正则表达式不太熟悉。模式匹配用在WHERE关键字后边。
IN 和 BETWEEN
IN用在WHERE中来规定属性在多个值之中,可以加NOT。
BETWEEN A AND B 用来WHERE中来规定属性在A和B之间,可以加NOT。
连接
我感觉这个部分有点难,等我之后细细研究一下,现在就先把格式列一下。
create table access_log
(
aid char(4) not null,
site_id char(4) not null, -- 站点ID,对应websitesID
count number(5) not null,
da date not null
);
insert into access_log(aid,site_id,count,da) values
(
'9',
'3',
201,
to_date('2016-05-17','yyyy-mm-dd')
);
/*连接有4种,内(INNER)连接,全(FULL)连接,左(LEFT)连接,右(RIGHT)连接*/
select w.id,w.name,a.count,a.da from websites w inner join access_log a on w.id = a.site_id;
说实话感觉也就内连接用的多,其他的,感觉用的比较少啊。
表的创建和、删除和修改
下面展示的是Oracle数据库下的建表和删除表语句,主要是在数据类型上各个数据库有所不同,其他的东西基本一致,像是添加约束,在建表的时候都可以添加。无非就是格式上有所区别,这个在约束部分会具体展开。
create table websites
(
id char(4) not null, -- 编号
name varchar2(30) not null, -- 名称
url varchar2(100) not null, -- 网址
alexa number(7) not null,
country varchar2(10) not null -- 国家
);
-- 删除整个表的结构,结构都没了,自然数据更保存不了了
drop table table_name;
truncate table table_name;用来清除表里的内容,其实我感觉用不带where的删除语句应该也可以。
alter table table_name add/drop/modify column clolumn_name datatype用来给表的结构进行修改,像是加列、减列和修改列的数据类型。
索引
创建索引可以加快访问的速度,但是索引过多表的更新耗费时间也会变长,所以对于经常访问的数据创建索引即可。
/*创建索引,带unique表示唯一索引,两行的索引值不能一样*/
create (unique) index index_name on table_name (xxx);
-- MySQL删除索引,Oracle的直接drop就行
alter table table_name drop index index_name;
约束
约束大概是有这么几种,非空约束(NOT NULL),主键约束(PRIVATE KEY),外键约束(FOREIGN KEY),唯一性约束(UNIQUE),检查元素(CHECK)和默认值(DEFAULT)。
约束可以在建表时就定义,也可以对建好的表用ALTER语句修改添加约束。
主键约束和唯一性约束的区别是,主键约束一表只有一个,唯一性约束没有这个要求。
外键指向另一个表的唯一性约束。
具体内容可以之后再整理一篇。
视图
简单来说视图是通过定义的语句直接从各个实体表中生成的表,这张表同样可以进行查找,加函数,做连接.这样做的好处是掩盖了实际的表结构,只提供必要的数据可视化。
-- 创建视图的语句
create view view_name as select xx_1,xx_2,... from table_name where ...;
-- 修改视图可以用create,也可以用replace
-- 删除视图
drop view view_name;
难点总结
总的来说,难点在连接部分,约束部分和分组部分,分组上面没提到,实际上就是GROUP BY语句,这三个部分需要下去再做总结,不断巩固,总感觉不会就不踏实。