简介
数据库(Database,DB)
数据库管理系统(Database Management System,DBMS)
DBMS种类:
-
关系型数据库(Ralational RDB):通过二维表结构来管理数据,使用SQL(Structured Query Language,结构化查询语言)对数据进行操作(Oracle,甲骨文(大);SQL Server,微软(中);DB2,IBM(大);MySQL(中)等),安全(保存到磁盘)
-
非关系型数据库:memcached(小)、MongoDB(小)、Redis(大)(同步到磁盘),效率高,不安全(断电丢失)
-
面向对象数据库(OODB):把数据和对数据的操作集合起来以对象为单位进行管理
-
XML数据库(XMLDB):可以对XML形式的大量数据进行告诉操作
-
键值存储系统(KVS):用来保存用于查询所使用的主键和值得组合的数据库
SQL语句种类:
- DDL(Data Definiton Language,数据定义语言):用于创建或删除存储数据用的数据库以及数据库中表等对象
- CREATE:创建
- DROP:删除
-
ALTER:修改
- DML(Data Manipulation Language,数据操作语言):用于查询和变更表中的记录
- SELECT:查询
- INSERT:插入
- UPDATE:更新
-
DELETE:删除
- DCL(Data Control Language,数据控制语言):用于确认和取消对数据库中的数据进行的变更,还可以对RDBMS中的用户是否有权限操作数据库的对象进行设定
- COMMIT:确认变更
- ROLLBACK:取消变更
- GRANT:赋予操作权限
- REVOKE:取消操作权限
SQL书写规则
- 以分号结尾
- 关键字不区分大小写
- 常数(字符串及日期用单引号标记,数字直接书写)
- 单词之间要用半角空格或换行符分割
MySQL是c/s(客户端/服务端),用的时候需要连接服务器
查看所有字符集
show character set;
查看服务器默认的对外处理的字符集
show variables like 'character_set%';
改变服务器接受客户端的字符集
set character_set_client = gbk;
改变服务器发送客户端的字符集
set character_set_results = gbk;
快捷设置服务器的字符集
set names gbk;
== character_set_client、character_set_results、character_set_connection, connection连接层是字符集转变中间层,如果统一了,效果更高,不统一也没有关系
数据库的创建
只能使用半角英文字母、数字、下划线作为数据库、表、列的名称。
创建数据库
CREATE DATABASE 数据库名字;
例:CREATE DATABASE SHOP;
, CREATE DATABASE SHOP charset utf8;
查看所有数据库
show databases;
show databases like 'info\_%';
查看以info_开头的数据库
show create databases 数据库名字;
查看数据库创建语句(sql语句执行前会被优化)
选中数据库
use 数据库名字;
修改数据库
数据库的名字不可以改;
数据库的修改仅限库选项:字符集和校对集(校对集依赖字符集)
alert database 数据库名字 [库选项];
例:‘alert database info charset GBK;’
删除数据库
drop database 数据库名字;
表的创建
创建表
CREATE TABLE [if not exists] [数据库名.]表名 (列名1 类型 约束, 列名2 类型 约束, ..., 表约束1, 表约束2, ...) [表选项]
表选项: 字符集(charset/character set)、校对集(collate)、存储引擎(engine (innodb、myisam))
例:
CREATE TABLE Shohin (shohin_id CHAR(4) NOT NULL, shohin_mei VARCHAR(100) NOT NULL, PRIMARY KEY (shohin_id));
查看所有表
show tables [like ...];
show create table 表名;
查看表结构
desc/describe 表名;
show columns from 表名;
数据类型
-
INTEGER:整型
-
CHAR:CHAR(8)用于指定字符串的存储的最大长度,超出部分无法输入,不足的会以半角空格补足
-
VARCHAR: VARCHAR(8)用于指定字符串的存储的最大长度,超出部分无法输入,不足的不会补足
-
DATE:存储日期
约束的设置
约束是除了数据类型之外,队列中存储数据进行限制或追加条件
- NOT NULL:输入不能为空,否则出错
- PRIMARY KEY:主键约束,唯一,通过主键取出唯一数据
表的删除和更新
删除表,一次性删除多张
DROP TABLE 表名1, 表名2, 表名3;
,删除后无法恢复,例:DROP TABLE Shohin;
添加或删除列
- 添加列,指定位置
ALTER TABLE 表名 ADD [COLUMN] 列名 类型 约束 [FIRST等];
Oracle和SQL Server 中不用写COLUMN
ALTER TABLE 表名 ADD (列名 类型 约束);
Oracle中可以添加多列
ALTER TABLE 表名 ADD (列名 类型 约束,列名 类型 约束,...);
- 删除列
ALTER TABLE 表名 DROP [COLUMN] 列名;
Oracle和SQL Server 中不用写COLUMN
ALTER TABLE 表名 DROP (列名);
Oracle中可以添加多列
ALTER TABLE 表名 DROP (列名 类型 约束,列名 类型 约束,...);
-
变更表名
ALTER TABLE 表名 RENAME TO 新表名
;rename table 老表明 to 新表明;
-
修改表字符集
alert table 表名 charset = GBK;
- 修改表中的字段类型并发到指定位置
alert table 表名 modify 字段名 数据类型 [属性] [位置]
- 重命名字段
alert table 表名 change 就字段 新字段名 数据类型 [属性] [位置];
数据插入
-
插入原则上是一条语句插入一条数据,但通常DBMS都提供插入多条数据的方法。
-
基本语法:
INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...);
-
列清单:(列名1, 列名2, …)
-
值清单:(值1, 值2, …)
-
列清单和值清单的数量必须保持一致,否则报错。
-
插入多条数据:
INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...), ...;
-
对表进行全列插入的时候可以省略列清单。
-
在值清单中写入NULL,可以向没有设定
NOT NULL
的列插入NULL,如果设定了NOT NULL
,则插入失败。 - 插入默认值,在创建表时设定DEFAULT 约束(
CREATE TABLE 表名 (age INTEGER DEFAULT 0);
)- 插入时在值列表指定
DEFAULT
关键字,INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, DEFAULT, ...);
- 插入时在值列表指定
-
在列清单和值清单中省略设定,就会使用默认值
-
从其他表复制数据
INSERT INTO 表名1 (列名1, 列名2, ...) SELECT 列名1, 列名2, ... FROM 表名2;
- 复制表结构及数据到新表,要求目标表不存在,因为在插入时会自动创建
select * into 目标表名 from 源表名;
- 只复制表结构到新表
CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2
查询语句
列查询
SELECT 列名1, 列名2, ... FROM 表名;
查询列数据
SELECT * FROM 表名;
查询所有列数据
列设定别名
SELECT 列名1 AS 别名1, 列名2 AS 别名2, ... FROM 表名;
当别名为汉字时需要使用双引号括起来。
例:SELECT shohin_id AS “商品编号” FROM Shohin;
常数查询
SELECT '商品' AS moji, 38 AS price, shohin_id FROM Shohin;
将“moji”和“price”字段设定为指定的常数。
从结果中删除重复行
SELECT DISTINCT 列名1, 列名2, ... FROM 表名;
当有多个字段时,会将一条数据当做判断是否重复的标准。
NULL也会被视为一类数据,多个NULL会合并为一个。
WHERE
SELECT 列名, ... FROM 表名 WHERE 条件表达式;
算数运算符(“+” 、“-”、“*”、“/”)
例:SELECT price, price * 2 AS price_x2 From 表名;
会将“price * 2”的结果作为后一个的结果输出。
比较运算符(“=”、“<>”、“>”、“>=”、“<”、“<=”)
WHERE选择用
逻辑运算符
- NOT 取反
- AND 与
- OR 或
SQL 有真、假、不确定三种情况。
NULL
NULL 的任何运算结果都是NULL;
比较是不是NULL, 要用 IS NULL或IS NOT NULL;
NULL 是属于不确定行列的数据
数据更新
删除
DROP TABLE 表名;
删除整个表;
DELETE FROM 表名
删除表中的所有数据
DELETE FROM 表名 WHERE 条件
删除表中的指定数据
DELETE
语句中不能指定列名
TRUNCATE 表名
只能删除表中的所有数据,不能删除指定数据,执行速度比DELETE
要快的多,DELETE语句在DML语句中属于处理时间较长,因此需要删除全部数据的时候可以使用TRUNCATE
更新
UPDATE 表名 SET 列名 = 值;
将整列设定为一个值
UPDATE 表名 SET 列名 = 值 WHERE 条件;
将符合条件的列设定为一个值
UPDATE 表名 SET 列名1 = 值1, 列名2 = 值2, ... WHERE 条件;
将符合条件的多列进行更新(通用)
UPDATE 表名 SET (列名1, 列名2, ...) = (值1, 值2, ...) WHERE 条件;
同上(在某些DBMS无法使用)
事务
-
事务是在同一个处理单元中执行的一系列更新处理的集合。可以对数据库中的数据更新处理的提交(COMMIT)和取消(ROLLBACK)进行管理。
-
事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)四种特性,简称ACID特性。
-
事务语法:
事务开始语句
DML语句1;
DML语句1;
DML语句1;
...
事务结束语句(COMMIT或ROLLBACK)
- 事务的开始语句:标准SQL中没有定义事务的开始语句,一般有DBMS自己来定义
- SQL Server :
BEGIN TRANSACTION
- MySQL :
START TRANSACTION
- Oracle : 无
- SQL Server :
- ACID特性
- 原子性:要么全执行(COMMIT),要么都不执行(ROLLBACK)
- 一致性:违反规则的SQL会被取消执行
- 隔离性:事务之间是隔离的,一个事务结束前,对其他事务而言是不可见的
- 持久性:保证数据不丢失
数据类型
数值型
包含整型和小数型
整型
- tinyint:1个字节(一个字节是2的8次方)
- smallint:2个字节
- mediumint:3个字节
- int/integer:4个字节
- bigint:8个字节
tinyint(2):指定显示宽度,不会影响存储的大小范围; tinyint(2) zerofill, 当显示宽度不够时,0填充;
小数型
包括浮点型和定点型
浮点型
精度有限,会丢失精度
- float:4字节,精度7位
- double:8字节,精度15位
float:没有小数 float(M, D): M代表总长度,D代表小数长度 浮点型插入,整数部分不能超出,小数部分超出会4舍5入
定点型
精度固定,不会丢失精度
- decimal: M最大为65,D最大为30,默认是(10,2)
日期类型
datetime
- 格式:YYYY-MM-DD HH:MM:SS
- 取值:’1000-01-01 00:00:00‘到’9999-12-31 23:59:59‘
- 存储:8
- 零值:0000-00-00 00:00:00
timestamp(自动修改)
- 格式:YYYY-MM-DD HH:MM:SS
- 取值:’1970-01-01 00:00:00‘到’2038-01-19 03:14:07‘
- 存储:4
- 零值:0000-00-00 00:00:00
date
- 格式:YYYY-MM-DD
- 取值:’1000-01-01‘到’9999-12-31‘
- 存储:3
- 零值:0000-00-00
time
- 格式:HH:MM:SS
- 取值:’-838:59:59‘到’838:59:59‘
- 存储:3
- 零值:00:00:00
year
- 格式:YYYY
- 取值:1901到2155
- 存储:1
- 零值:0000
字符串型
包括char、varchar、text、blob、enum、set
定长字符串
在定义结构的时候就已经确定了数据的存储长度。
Char(L): L代表可以存储的长度,单位为字符,最大255
变长字符串
Varchar(L):理论65536个字符,存储长度一般会多出1到2个字节
Varchar(4):存储4个汉字,占用空间为 4 * 3 + 1 = 13
当字符长度超过255,用text
定长浪费存储空间,效率高 变长节省存储空间,效率低
文本字符串
如果数据量特别大,超过255个字符,使用文本字符串。
Text:存储字符串 Bolb:存储二进制,比如图片(通常不用)
枚举字符串
字段值只能是其中的一个,内部存储的是整型
create table mu_enum(gender enum(‘男,’女’,’保密’))
枚举在进行定义的时候会创建一个数字和枚举元素的对应关系存储起来(放到日志系统中),在存储的时候会将枚举元素转换为数字存储,在提取的时候会将数字转换为枚举元素
集合字符串
creat table my_set(hob set(‘篮球’, ‘足球’, ‘网球’))
insert into my_set values (‘篮球’, ‘足球’)
实际存储的是数值,不是字符串(集合是多选)
MySQL默认规定一条记录最大的长度是65535字节,所有的字段加在一起所占的字节数不能超过65535。
utf8下varchar实际顶配21844字符 varchar(21844) : 21844*3+2=65534
gbk下varchar实际顶配32766字符 varchar(32766) : 32766*2+2=65534
MySQL如果有任何一个字段为null,系统会自动从整个记录中保留一个字节来存储null
text文本字符串是额外存储的,只占用记录中的部分长度:10个字节(保存数据地址及长度)
列属性
NULL/NOT NULL,default,Primary key,unique key,auto_increment,comment
NULL/NOT NULL(空属性)
语法:字段名 数据类型 not null
例子:create table if not exists my_notnull(name varchar(10) not null)
空数据是不参加运算的。任何数据与null运算都是null
comment(描述)
语法:字段名 数据类型 comment ‘说明文字’
例子:create table if not exists my_ comment(name varchar(10) comment '姓名字段')
default(默认值)
语法:字段名 数据类型 default 默认值
例子:create table if not exists my_ default(name varchar(10) not null comment '姓名', age tinyint unsigned not null default 18)
插入数据:如果要使用默认值,在给表插入数据的时候,不给字段赋值即可。
insert into my_default(name) values('张三');
、insert into my_default(name, age) values('张三', default);
Primary key(主键)
主键不能重复, 不能为空
desc 表名;查看表信息
- 添加主键
创建表的时候,在字段后加上 primary key。(只能将一个字段设置为主键)
语法:字段名 数据类型 primary key
例子:create table if not exists my_pri(name varchar(10) not null comment '姓名', number char(8) primary key)
- 复合主键 (多个字段都相同是才是相同主键)
在创建表的时候,在所有的字段之后,使用primay key(主键字段列表)来创建主键(可以有多个字段作为主键)来创建复合主键。
语法:primary key(字段1,字段2……)
例子:create table if not exists my_primary_key2(number int not null, classname varchar(20) not null, primary key(number,classname))charset utf8;
- 追加主键
语法1:alter table 表名字 字段名 数据类型 primary key(新建一个字段,添加主键,如果字段已经存在要用修改的方式;
语法2:alter table 表名字 add primary key(要添加主键的字段名);
聚合与排序
常用的聚合函数
所有的聚合函数如果以列为参数,那么在计算之前就已经把NULL排除在外了。
-
COUNT:行数
COUNT(*)或计算或有的行数包含NULL, COUNT(列名)会去除当前列为NULL的记录。
-
SUM:数值列的合计值
SELECT SUM(列名),SUM(列名) FROM 表明;
-
AVG:数值列的平均值
SELECT AVG(列名),AVG(列名) FROM 表明;
-
MAX:任意列的最大值
SELECT MAX(列名),MAX(列名) FROM 表明;
-
MIN:任意列的最小值
SELECT MIN(列名),MIN(列名) FROM 表明;
-
使用聚合函数删除重复值,所有的聚合函数都可以使用DISTINCT
例:
SELECT COUNT(DISTINCT 列名) FROM 表明;
先删除重复数据再计算数量
GROUP BY 分组
- 聚合键中包含NULL时,在结果中会以“不确定”行的形式表现出来。
- 使用聚合函数和GROUP BY子句时注意
- 只能写在SELECT语句中
- GROUP BY子句中不能使用别名
- GROUP BY子句中的聚合结果是无序的
- WHERE子句中不能使用聚合函数
SELECT 列名1, 列名2, ... FROM 表名 GROUP BY 列名1, 列名2, ...;
子句中的书写顺序:
SELECT … FROM … WHERE … GROUP BY …;
HAVING 指定条件
给搜索结果指定选择条件。
SELECT 列名1, COUNT(*), ... FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 条件;
HAVING子句中能使用的要素:
- 常数
- 聚合函数
- GROUP BY 中指定的列名(聚合键)
聚合键所对应的条件不应该写在HAVING子句中,应该写在WHERE子句当中,子WHERE子句中执行速度更快。
ORDER BY 排序
SELECT 列名1, ... FROM 表名 ORDER BY 列名1, 列名2;
SELECT 列名1, ... FROM 表名 ORDER BY 列名1, 列名2 ASC;
SELECT 列名1, ... FROM 表名 ORDER BY 列名1 DESC, 列名2 ASC;
如果不写‘ASC’或’DESC’,默认是‘ASC’;
排序的顺序,从左到右依次使用。
NULL的排序:NULL 不能做比较运算,有NULL参与的排序,会将是NULL的数据汇总到结果的开头或是末尾显示。
语句执行顺序:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY;
ORDER BY 中可以使用别名。这是因为在SELECT之前使用的语句别名无法被识别,在SELECT之后的语句可以使用别名。
复杂查询
视图
从SQL语句的角度看视图就是一张表,视图和表的区别就是是否保存了实际的数据,表保存实际的数据。
在创建表时会通过INSERT语句将数据保存到数据库中,数据库会存储到硬盘设备中,通过SELECT语句就是从存储设备上读取数据,进行各种计算之后返回给用户。
而视图不会将数据保存到存储设备或其他的地方,实际上视图保存的是SELECT语句,我们从视图中读取数据的时候,视图会在内部执行SELECT语句,并创建一张临时表。
视图的优点:
- 无需保存数据,节省存储设备空间
- 将频繁使用的SELECT语句保存成视图,这样不必每次重写
创建视图:
CREATE VIEW 视图名称(列名1, 列名2, 列名3, ...) AS SELECT语句;
SELECT语句中列的排列顺序要和视图中列的排列顺序相同。
例:
CREATE VIEW ShohinSum(shohin_bunrui, cnt_shohin) AS SELECT shohin_bunrui, COUNT(*) FROM Shohin GROUP BY shohin_bunrui;
SELECT shohin_bunrui, cnt_shohin FROM ShohinSum;
原表的数据更新之后,视图也会自动更新
视图可以嵌套,但是多层嵌套会降低SQL的性能,尽量使用单层视图。
视图的限制:
- 定义视图时不能使用ORDER BY子句(有些DBMS可以)
- 对视图进行更新
删除视图:
DROP VIEW 视图名;
子查询
子查询就是一次性的视图,在SELECT语句执行完毕之后就会消失。
例:
SELECT shohin_bunrui, cnt_shohin FROM (SELECT shohin_bunrui, COUNT(*) FROM Shohin GROUP BY shohin_bunrui) AS ShohinSum;
该SELECT语句是嵌套的,多层嵌套会使SQL可读性变差,性能也会降低,所以避免多层嵌套。
标量子查询
标量子查询就是返回单一值得子查询,比如返回表中的某一行某一列的值。
例:
SELECT shohin_id, shohin_mei, hanbai_tanka FROM Shohin WHERE hanbai_tanka > (SELECT AVG(hanbai_tanka) FROM Shohin);
关联子查询
关联子查询就是在子查询中添加WHERE子句的条件。
例:
SELECT shohin_id, shohin_mei, hanbai_tanka FROM Shohin AS S1 WHERE hanbai_tanka > (SELECT AVG(hanbai_tanka) FROM Shohin AS S2 WHERE S1.shohin_bunrui = S2.shohin_bunrui GROUP BY shohin_bunrui);
函数、谓词、CASE表达式
函数的种类
- 算术函数(数值计算)
- 字符串函数(字符串操作)
- 日期函数(日期操作)
- 转换函数(转换数值类型和数值)
- 聚合函数(数据聚合)
算数函数
- +(加法)
- -(减法)
- *(乘法)
- \(除法)
- ABS(绝对值)
- MOD(取余):MOD(被除数,除数)
- ROUND(四舍五入):ROUND(数值,保留小数位数)
字符串函数
-
(拼接):字符串1 字符串2 - LENGTH(字符串长度):LENGTH(字符串)
- LOWER(小写转换)
- UPPER(大写转换)
- REPLACE(字符串替换):REPLACE(对象字符串,替换前字符串,替换后字符串)
- SUBSTRING(字符串截取):SUBSTRING(对象字符串 FROM 起始位置 FOR 字符数)
日期函数
- CURRENT_DATE(当前日期)
- CURRENT_TIME(当前时间)
- CURRENT_TIMESTAMP(当前时间和日期)
- EXTRACT(截取日期元素):EXTRACT(日期元素(YEAR/MONTH/DAY/HOUR/MINUTE/SECOND) FROM 日期)
转换函数
- CAST(类型转换):CAST(转换前的值 AS 想要转换的数据类型)
- COALESCE(将NULL转换为其他值):COALESCE(数据1,数据2,数据3,…)该函数会返回可变参数中左侧开始第一个不是NULL的值。
谓词
就是返回值为真值的函数。
LIKE:’%’代表0字符以上的任意字符串,’_‘代表任意1字符
- 前方一致:LIKE ‘DD%’
- 中间一致:LIKE ‘%DD%’
- 后方一致:LIKE ‘%DD’
- abc+任意2个字符:LIKE ’abc__‘
BETWEENT:范围查询
例:’WHERE tanka BETWEENT 100 AND 1000;’
IS NULL、IS NOT NULL:判断是否为NULL
例:’WHERE tanka IS NULL;’
IN、NOT IN :OR的简便用法
例:’WHERE tanka IN (320, 500, 50000);’
EXIST、NOT EXIST
大部分可以使用IN、NOT IN替换
CASE表达式
简单CASE和搜索CASE,搜索CASE包含简单CASE的所有功能。
CASE WHEN 判断表达式1 THEN 表达式1
WHEN 判断表达式2 THEN 表达式2
...
ELSE 表达式n
END
例:
SELECT shohin_mei,
CASE WHEN shohin_bunrui = '衣服'
THEN 'A:' || shohin_bunrui
WHEN shohin_bunrui = '办公用品'
THEN 'B:' || shohin_bunrui
WHEN shohin_bunrui = '厨房用具'
THEN 'C:' || shohin_bunrui
ELSE NULL
END AS abc_shohin_bunrui
FROM Shohin;
集合运算
集合运算注意事项:
- 记录的列数必须相同
- 记录中列的类型必须一致
- ORDER BY子句只能在最后使用一次
表的加减法
- UNION(并集)
SELECT shohin_id, shohin_mei FROM Shohin
UNION
SELECT shohin_id, shohin_mei FROM Shohin2;
默认UNOIN是去除重复项的,如果不去除重复项,在UNION
后添加ALL
选项。
- INTERSECT(交集)
SELECT shohin_id, shohin_mei FROM Shohin
INTERSECT
SELECT shohin_id, shohin_mei FROM Shohin2
ORDER BY shohin_id;
默认INTERSECT是去除重复项的,如果不去除重复项,在INTERSECT
后添加ALL
选项。
- EXCEPT(差集)
SELECT shohin_id, shohin_mei FROM Shohin
EXCEPT
SELECT shohin_id, shohin_mei FROM Shohin2
ORDER BY shohin_id;
EXCEPT 被减数和减数的位置不同,结果可能不同。
联结
大体分为内联结和外联结两大类。
内联结(INNER JOIN)
FROM 表1 INNER JOIN 表2 ON 联结条件 WHERE ...;
将表1的列作为桥梁将表2中满足同样条件的列汇集到同一结果中,选取同时存在与两表中的数据。
外联结(OUTER JOIN)
外联结关键字LEFT或RIGHT指定那个表是主表,LEFT左表为主表,RIGHT右表为主表。
FROM 表1 LEFT OUTER JOIN 表2 ON 联结条件 WHERE ...;
多表联结
例:SELECT TS.id, S.id, ZS.id FROM TS INNER JOIN S ON TS.id = S.id INNER JOIN ZS ON TS.id = ZS.id;
交叉联结(CROSS JOIN)
结果为笛卡儿积;
SQL高级处理
窗口函数
窗口函数也称OLAP函数,意为对数据库进行实时分析处理。
能够作为窗口函数使用的函数;
- 聚合函数(SUM、AVG、COUNT、MIN、MAX)
- RANK、DENSE_RANK、ROW_NUMBER等专用窗口函数
窗口函数语法:
窗口函数 OVER ([PARTITION BY 列清单] ORDER BY 排序用列清单)
, []中内容可以省略。
PARTITION BY
:对表的横向进行分组,ORDER BY
:决定纵向的排序规则。
窗口兼具分组和排序两种功能。
例:SELECT shohin_mei, shohin_bunrui, shohin_tanka, RANK() OVER (PARTITION BY shohin_bunrui ORDER BY shohin_tanka) AS ranking
专用窗口函数的分类:
- RANK:计算排序时,如果存在相同位次的记录,则会跳过之后的位次。例:有三条记录排在第一位时,第1位,第1位,第1位,第4位。。。
- DENSE_RANK:即使存在相同位次的记录,也不会会跳过之后的位次。例:有三条记录排在第一位时,第1位,第1位,第1位,第2位。。。
- ROW_NUMBER:赋予唯一的连续位次。例:有三条记录排在第一位时,第1位,第2位,第3位,第4位。。。
索引
几乎所有的索引都是建立在字段之上的。
系统根据某种算法,将已有或未来可能增加的数据,单独建立一个文件,文件能够实现快速的匹配数据,并且能够快速找到对应表的记录。
索引的意义:
- 提升查询效率
- 约束数据有效性(唯一性等)
增加索引的前提条件:索引本身会产生索引文件(有时候可能比数据还大),会非常的耗费磁盘空间。
如果某个字段作为查询条件经常使用,那么可以增加索引。
如果某个字段需要进行数据的有效性约束,也肯能增加索引(主键、唯一键)
MySQL提供的几种索引:
- 主键索引(primary key)
- 唯一索引(unique key)
- 全文索引(fulltext index):针对文章内部的关键字进行索引,全文索引最大的问题在于如何确定关键字,英文很简单,单词与单词之间有空格,中文很难,没有空格并且中文可以随便组合(分词:sphinx)
- 普通索引(index)