SQL语言

发布于 2020-09-28  18 次阅读


SQL语言

分为层次, 网状, 关系模型数据库.

eg: MySQL为关系型数据库.

数据类型

名称类型说明
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

关系模型

主键

主键是用来定位记录, 不可再修改, 完全与业务无关.

自增类型

自动为新纪录分配自增主键.

primary_key_name bigint not null auto_increment

全局唯一GUID类型

使用GUID算法计算出主键.

联合主键

使用多个字段组合来作为主键.

外键

外键将一个表通过一对一, 一对多或多对多的关系关联到另一个表. 使用外键约束会降低数据库性能, 一般不使用.

alter table table_name
add constraint constraint_name
foreign key (foreign_key_name)
references constraint_table_name (main_key_name);

删除外键约束.

alter table table_name
drop foreign key (constraint_name);

只是删除了外键约束, 并未删除外键这一列.

索引

索引是关系数据库中对某一列或多个列的值进行预排序的数据结构.

使用索引使得查找时不必遍历整个表, 加速查找.

alter table table_name
add index index_name (column1_name, column2_name...);

有些列具有唯一性故需要增加唯一索引.

alter table table_name
add unique index index_name (column_name);

也可以只添加唯一约束, 不添加索引.

alter table table_naem
add constraint constraint_name unique (column_name);

查询整表:

select * from table_name;

可以给某表取别名select * from table_name new_name.

查询某几列:

select column1_name, column2_name from table_name;

可以给某列取别名select column_name new_name from table_name.

查询多表:

select * from table1_name, table2_name;

这会将table1和table2进行两两组合, 最后返回的记录条数为表1记录条数和表2记录条数的乘积.

也可以通过table_name.column_name的方法使得结果集返回某列或某几列.

条件查询

select * from table_name where condition1 operator condition2 operator...;

operator

and

与.

or

或.

not

非.

condition中的运算符
符号说明
=等于
<>不等于
>大于
<小于
>=大于等于
<=小于等于
between在某个范围内
like搜索某种模式
in指定针对某个列的多个可能值
  1. !=只在一部分数据库可以被识别, 如MySQL, 推荐使用<>.
  2. between num1 and num2表示num1~num2.
  3. name like'百合%' 表示查询姓百合的人, %为通配符.
  4. name in('nier', 'sagiri') 表示查询姓名为nier和sagiri的人.

排序

正序:

select * from table_name order by column_name asc;

asc可以省略.

反序:

select * from table_name order by column_name desc;

多重排序:

select * from table_name order by column1_name column2_name;

按colunmn1_name排完序后若有相同的项, 再按column2_name排序.

order by语句必须放在where语句之后.

分组

select column1_name, column2_name group by column1_name, column2_name;

按某几列分组.

分页

limit page_size offset page_offset;

page_index = page_size * (page_index - 1).

offset超过最大页数即会返回空集.

聚合

select function_name(column_name) from table_name;

function

count

参数为*或列名都可以, 都返回表中行数.

可以配合分组来查询每组人数.

sum

参数为列名, 该列必须为数值类型, 返回该列合计值.

avg

参数为列名, 该列必须为数值类型, 返回该列平均值.

max

参数为列名, 返回该列最大值.

min

参数为列名, 返回该列最小值.

连接

内连接

select t1.c1, t2.c1, t2.c2
from table1_name t1
inner join table2_name t2
on condition;

inner join后跟需要连接的表名, on后跟返回结果集条件, eg:t1.c1=t2.c1, 结果集返回的是两表都存在的记录.

外连接

select t1.c1, t2.c1, t2.c2
from table1_name t1
full outer join table2_name t2
on condition;

结果集中包含两张表中t1存在t2不存在和t1不存在t2存在的记录.

左连接
select t1.c1, t2.c1, t2.c2
from table1_name t1
left outer join table2_name t2
on condition;

返回左表即t1存在的记录, 若t2不存在则将结果集中t2相关列置为null.

右连接
select t1.c1, t2.c1, t2.c2
from table1_name t1
right outer join table2_name t2
on condition;

返回右表即t2存在的记录, 若t1不存在则将结果集中t1相关列置为null.

insert to ... values ...

insert to table_name (column1_name, column2_name) values
(column1_value1, column2_value2)
(column1_value3, column2_value4)
...; 

可以只插入1行, 也可以插入多行记录.

update ... set ... where ...

update table_name set column1_name = value1, column2_name = value2 where condition;

delete from ... where ...

delete from table_name where condition;

人生如逆旅,我亦是行人。