数据排序的好处
- 一旦数据排序之后,查找的速度就会翻倍,现实世界和程序世界都是如此
如何创建索引
- 创建数据表时就添加
给出示例:
CREATE TABLE t_message (
id INT UNSIGNED PRIMARY KEY,
content VARCHAR ( 200 ) NOT NULL,
type ENUM ( "公告", "通报", "个人通知" ) NOT NULL,
create_time TIMESTAMP NOT NULL,
INDEX idx_type ( type )
);
如何添加和删除索引
给出示例:
DROP INDEX idx_type ON t_message;
CREATE INDEX idx_type ON t_message(type);
SHOW INDEX FROM t_message;
ALTER TABLE t_message ADD INDEX idx_type(type) ;
索引的使用原则
- 数据量很大,经常被查询的数据表可以设置索引
- 索引只添加在经常用作检索条件的字段上面
- 不要在大字段上创建索引
数据操作语言—简单查询
最基本的查询是由SELECT 关键字和 FROM 关键字构成的,
SELECT语句屏蔽了物理层的操作,用户不必关心数据的真
实存储,交由数据库高效的查找数据
给出一个示例语句:
select * from t_emp;
select empno,job from t_emp;
SELECT empno,sal * 12 "income" FROM t_emp;
如上最后一条sql语句所示,当sql语句中出现了表达式的时候,这一列的名字就默认为表达式,因此就需要一种对列名重命名的机制,此时我们可以使用 列名 AS 别名 或者是 列名 别名的方式重命名。
需要注意的是,重命名只会在展示的时候使用,不会影响原本数据。
查询语句的执行顺序
我们需要了解sql的执行原理,首先它是会进行词法分析以及词法的优化,读取到SQL语句后因为FROM 优先级高于 SELECT ,所以会先选择数据来源,在选择输出内容。
数据分页
比如我们查看朋友圈,只会加载少量部分信息,不用一次性加载全部朋友圈,那样只会浪费CPU时间、内存和网络带宽
如果结果集的记录很多,则可以使用LIMIT关键字限定结果集数量。
LIMIT关键字语法如下:
SELECT …… FROM …… LIMIT 起始位置 , 偏移量 ;
给出一个示例代码:
SELECT empno,sal * 12 "income" FROM t_emp limit 0,10;
另外limit语句有简写方式,如果LIMIT子句只有一个参数,它表示的是偏移量,起始值默认为0。
例如:
SELECT empno,sal * 12 "income" FROM t_emp limit 10;
执行顺序:
数据排序
如果不设置,那么查询的结果集是不会有排序的,如果我们想要对数据进行排序,就必须使用 ORDER BY 字句。
SELECT …… FROM …… ORDER BY 列名 [ ASC | DESC ] ;
给出一个示例:
select * from t_emp order by sal desc;
排序关键字
ASC表示升序排列(默认升序),DESC表示降序排列。
如果排序列是数字类型,数据库就按照数字大小排序,如果是日期
类型就按照日期大小排序,如果是字符串就按照字符集序号排序。
此时我们会有一个问题,就是如果按照升序或者降序排序,那么排序字段值相同的情况下,又该怎么排序呢,数据库针对这种排序字段值相同的情况,Mysql会按照主键值的大小来排序两条数据。
多字段排序
同时,Mysql支持多个字段排序,我们可以使用ORDER BY规定首要排序条件和次要排序条件。数据库会先按照首要排序条件排序,如果遇到首要排序内容相同的记录,那么就会启用次要排序条件接着排序。
例如:下列sql会按照部门升序情况排序,当部门值相同时按照工资降序排序。
select deptno,sal from t_emp order by deptno asc,sal desc;
效果如图:
排序加分页
此时我们可以结合排序以及分页得到指定数据,例如查询工资最高的5个人的数据,例如:
select * from t_emp order by sal limit 5;
结果如图所示:
去除重复记录
mysql中去除重复记录使用DISTINCT关键字实现,例如我想要查询员工表中的职位信息,当未取除重复数据时,结果如下:
,而我们需要去除时可以使用以下语句:
select DISTINCT job from t_emp ;
效果如下:
注意事项
使用DISTINCT的SELECT子句中只能查询一列数据,如果查询多列,
去除重复记录就会失效。
例如,我执行下面这个语句时
select DISTINCT job,ename from t_emp ;
效果如下,可以看到job字段并没有去重,其实这个是因为它将job和ename两个字段组装后去重了
另外,DISTINCT字段在sql字句中只能使用一次,类似于下面的语句都是错误的
select DISTINCT job, DISTINCT ename from t_emp ;
select job, DISTINCT ename from t_emp ;