sql

csv是文本文件,用记事本就能打开,XLS是二进制的文件只有用EXCEL才能打

数据模型
数据库按照数据结构来组织、存储和管理数据,实际上,数据库一共有三种模型:
层次模型
网状模型
关系模型

基于关系模型的关系数据库,在关系数据库中,关系是通过主键和外键来维护的

INT
整型
4字节整数类型,范围约+/-21亿
BIGINT
长整型
8字节整数类型,范围约+/-922亿亿
REAL
浮点型
4字节浮点数,范围约+/-1038
DOUBLE
浮点型
8字节浮点数,范围约+/-10308
DECIMAL(M,N)
高精度小数
由用户指定精度的小数,例如,DECIMAL(20,10)表示一共20位,其中小数10位,通常用于财务计算
CHAR(N)
定长字符串
存储指定长度的字符串,例如,CHAR(100)总是存储100个字符的字符串
VARCHAR(N)
变长字符串
存储可变长度的字符串,例如,VARCHAR(100)可以存储0~100个字符的字符串
BOOLEAN
布尔类型
存储True或者False
DATE
日期类型
存储日期,例如,2018-06-22
TIME
时间类型
存储时间,例如,12:20:59
DATETIME
日期和时间类型
存储日期+时间,例如,2018-06-22 12:20:59

注意NULL表示字段数据不存在。一个整型字段如果为NULL不表示它的值为0,同样的,一个字符串型字段为NULL也不表示它的值为空串''。

商用数据库,例如:Oracle,SQL Server,DB2等;
开源数据库,例如:MySQL,PostgreSQL等;
桌面数据库,以微软Access为代表,适合桌面应用程序使用;
嵌入式数据库,以Sqlite为代表,适合手机应用和桌面程序。

总的来说,SQL语言定义了这么几种操作数据库的能力:
DDL:Data Definition Language
DDL允许用户定义数据,也就是创建表、删除表、修改表结构这些操作。通常,DDL由数据库管理员执行。
DML:Data Manipulation Language
DML为用户提供添加、删除、更新数据的能力,这些是应用程序对数据库的日常操作。
DQL:Data Query Language
DQL允许用户查询数据,这也是通常最频繁的数据库日常操作。

主键

主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。
可以使用多个列作为联合主键,但联合主键并不常用。

外键

外键并不是通过列名实现的,而是通过定义外键约束实现的:
ALTER TABLE 表 1
ADD CONSTRAINT 外键约束名
FOREIGN KEY (表1中的需要定义外键的列名)

REFERENCES 表2 (关联的外键列名);

通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果classes表不存在id=99的记录,students表就无法插入class_id=99的记录。

要删除一个外键约束,也是通过ALTER TABLE实现的:
ALTER TABLE 表名
DROP FOREIGN KEY 外键约束名;

删除外键约束并没有删除外键这一列。删除列是通过DROP COLUMN ...实现的

关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。

索引

索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如gender列,大约一半的记录值是M,另一半是F,因此,对该列创建索引就没有意义。
如果要经常根据score列进行查询,就可以对score列创建索引:
ALTER TABLE students

ADD INDEX idx_score (score);
可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。
对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。

在设计关系数据表的时候,看上去唯一的列,例如身份证号、邮箱地址等,因为他们具有业务含义,因此不宜作为主键。
但是,这些列根据业务要求,又具有唯一性约束:即不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一索引。例如,我们假设students表的name不能重复:

通过UNIQUE关键字我们就添加了一个唯一索引。
也可以只对某一列添加一个唯一约束而不创建唯一索引:
ALTER TABLE students

ADD CONSTRAINT uni_name UNIQUE (name);

这种情况下,name列没有索引,但仍然具有唯一性保证。
无论是否创建索引,对于用户和应用程序来说,使用关系数据库不会有任何区别。这里的意思是说,当我们在数据库中查询时,如果有相应的索引可用,数据库系统就会自动使用索引来提高查询效率,如果没有索引,查询也能正常执行,只是速度会变慢。因此,索引可以在使用数据库的过程中逐步优化。

通过对数据库表创建索引,可以提高查询速度。
通过创建唯一索引,可以保证某一列的值具有唯一性。
数据库索引对于用户和应用程序来说都是透明的

SELECT语句其实并不要求一定要有FROM子句,可以用于计算

如果不加括号,条件运算按照NOT、AND、OR的优先级进行,即NOT优先级最高,其次是AND,最后是OR。加上括号可以改变优先级。
使用ORDER BY score DESC, gender表示先按score列倒序,如果有相同分数的,再按gender列排序:

OFFSET是可选的,如果只写LIMIT 15,那么相当于LIMIT 15 OFFSET 0。 offset 以0开始,OFFSET超过了查询的最大数量并不会报错,而是得到一个空的结果集
MySQL中,LIMIT 15 OFFSET 30还可以简写成LIMIT 30, 15。

要特别注意:如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL:

分组:在结果1的基础上再进行分组。

join:

简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上,on 条件是s.class_id = c.id,表示students表的class_id列与classes表的id列相同的行需要连接;
根据条件
INNER JOIN只返回同时存在于两张表的行数据,
RIGHT OUTER JOIN返回右表都存在的行。如果某一行仅在右表存在,那么结果集就会以NULL填充剩下的字段。
LEFT OUTER JOIN则返回左表都存在的行。

关系数据库的基本操作就是增删改查,即CRUD:Create、Retrieve、Update、Delete。其中,对于查询,我们已经详细讲述了SELECT语句的详细用法。

而对于增、删、改,对应的SQL语句分别是:
INSERT:插入新记录;
UPDATE:更新已有记录;
DELETE:删除已有记录。

你可能感兴趣的:(sql)