Mysql基础语法

分页

Limit语法:

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT接受一个或两个数字参数。参数必须是一个整数常量。 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。

支持 limit # offset # 语法:

SELECT * FROME table LIMIT 5,10;	//检索记录行6-15
// 检索指定偏移量到数据库表记录行结束的位置,可指定第二个参数为 -1
SELECT * FROM table LIMIT 100,-1		// 检索table中 100 - last 的数据
// 检索table中前五个的数据   LIMIT 5 等价于 0,5
SELECT * FROM table LIMIT 5

不同数据量的读取效率对比:

  1. offset数据比较小的时候

    SELECT * FROM table LIMIT 5,10
    

    多次运行,时间保持在0.0004-0.0005之间

    SELECT * FROM table WHERE id >= (
    	SELECT id FROM table ORDER BY id LIMIT 10,1
    ) LIMIT 10
    

    多次运行,时间保持在0.0005-0.0006之间。所有,在offset较小的时候,直接使用limit效率会高点!

  2. offset数据比较大的时候

    SELECT * FROM table LIMIT 10000,10
    

    多次运行,时间保持在0.0187秒左右。

    SELECT * FROM table WHERE id >=(
    	SELECT id FROM table ORDER BY id LIMIT 10000,1
    ) LIMIT 10
    

    多次运行,时间保持在0.0061秒左右,是前者的1/3左右。所以,offset较大时,使用后者效率会高!这是用了id做索引的结果。


LIMIT性能优化:

method 1:

SELECT * FROM table WHERE id>=(
	SELECT Max(id) FROM (
    	SELECT id FROM table ORDER BY id LIMIT 90001
    ) AS tmp
) LIMIT 100

method 2:

SELECT * FROM table WHERE id>=(
	SELECT Max(id) FROM(
    	SELECT id FROM table ORDER BY id LIMIT 90000,1
    ) AS tmp
) LIMIT 100;

同样是取90000条后的100条数据,第2种方法会快点。因为第1种方法是先取前90001条记录,取其中最大一个id值作为起始标识,然后利用它快速定位下100条数据;

然后第2种方法是只取最后一条记录,然后取id值作为起始标识定位100条记录。

第二种方法缩减:

SELECT * FROM table WHERE id >= (
	SELECT id FROM(
		SELECT id FROM table ORDER BY ID LIMIT 90000,1
	)As tmp
) LIMIT 100

省去Max运算,一般id都是递增


分页数据性能优化:

1、对于数据量较大数据表,可以建立主键和索引字段建立索引表,通过索引表查询相应的主键,在通过主键查询数据量的数据表;

2、如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!这样能提高读取速度

3、利用in:先通过where条件取得相应的主键值,然后利用主键值查询相应的字段值。

数据表添加默认值
CREATE TABLE student(
	stu_id int indentity(1,1) primary key,   -- 设置主键
	stu_name varchar(10) unique not null,	 -- 添加唯一约束
	stu_age int Check(stu_age between 18 and 100),	-- 添加检查约束 18~100
	stu_addr varchar(20) default 'chain',	 -- 添加默认约束值 chain
	stu_deal varchar(20)
)
go
数据表列的整理
use City;

go

CREATE TABLE A(
	id int identity(1,1) primary key not null,
    name nvarchar(100)
)
go 
-- 添加列
Alter Table A add number nvarchar(100)
-- 修改列的类型
Alter table A alter COLUMN number int
-- 删除列
ALTER TABLE A DROP COLUMN number