1. 基础小知识
1.1 数据库分类
- 关系型(SQL)
- 特点
- 数据以表格形式存储,有严格的字段定义,支持SQL语言查询,适合处理结构化数据。
- 结构清晰,易于维护。但数据结构固定,灵活性低
- 代表产品
- MySQL:免费、适合中小型项目(电商、博客、论坛等需要事务支持的场景)。但处理复杂查询时性能下降,不适合集群扩展。
- PostgreSQL:支持复杂查询(如地理数据、JSON),适合高并发和大数据量(如地理信息系统(GIS)、数据分析、企业级复杂业务系统)。但是内存消耗较大,学习成本高。
- Oracle:适合大型企业核心系统(如银行核心交易系统、电信计费系统)。但贵!授权费用高,运维复杂。
- SQL Server:适合企业级开发(企业内部ERP、CRM系统)。但主要运行在Windows服务器,跨平台支持差。
- 特点
- 非关系型(NoSQL)
- 数据结构灵活,适合高并发、海量数据,弱化事务一致性。
- 代表产品
- 文档型数据库
- MongoDB:数据结构灵活(类似JSON),读写快,适合快速迭代的业务(内容管理系统、用户行为日志存储)。但不支持多表联查,事务支持较弱,不适合复杂的关系型数据模型。
- CouchDB:仅以JSON格式存储数据,支持动态数据结构,适合存储半结构化或非结构化数据(内容管理系统(CMS))。适合分布式应用。支持数据在移动设备和浏览器本地存储,适合需要离线操作的场景(移动应用)。复杂查询能力较弱,尤其是对于动态查询。
- 键值对数据库
- Redis:内存存储,速度极快,但数据量受内存限制,持久化可能丢数据。适合缓存、秒杀库存、实时排行榜
- Memcached:高速缓存,内存读写速度极快,适合高并发场景。且易于集成到各种应用中。功能简单,内存和CPU开销较低。通过一致性哈希算法实现分布式缓存,适合大规模分布式系统。 数据存在内存中,同样受内存限制,重启后数据会丢失,不适合需要持久化存储。服务器故障可能导致缓存数据丢失,需要在应用层处理,缺乏高可用机制。
- 列族数据库
- Apache Cassandra:分布式架构,写入速度快,适合海量数据和高可用、高吞吐量场景。但查询灵活性差,学习成本高。适合物联网设备数据、日志存储,适合时间序列数据、大数据分析、物联网、社交应用等场景。
- 图数据库
- Neo4j:适合关系型数据,支持图形查询和分析,适合复杂关系网络分析(如社交网络分析、推荐系统、网络和IT运营分析等场景)。不适合大规模数据,硬件要求高。
- 搜索引擎数据库
- Elasticsearch:通过HTTP使用JSON进行数据索引,是一个分布式、高扩展、高实时的搜索与数据分析引擎,全文搜索能力强,支持模糊查询和实时分析。写入性能一般,数据一致性弱。适合网页、新闻、商品搜索,适合日志分析、舆情监控等场景。它通常跟 LogStash、Kibana 配合,形成一套对日志系统进行分析反馈的集成解决方案 ELK,LogStash收集日志数据,Kibana进行分析与可视化。
- 文档型数据库
- CURD操作:增删改查操作
- SQL 语句分类
- DDL(Data Definition Language):数据定义语言,用来定义数据库对象:数据库、表、列等。
- DML(Data Manipulation Language):数据操作语言,用来对数据库中的表记录进行增、删、改。
- DCL(Data Control Language):数据控制语言,用来定义数据库的访问权限和安全级别,还有创建用户。
- DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录。(这个是重点!)
注意:sql语句以;结尾。mysql中的关键字不区分大小写
1.2 下载安装、变量配置过程(略)
网上有很多安装配置过程记录,这边就不记了,注意安装时,卸载其他版本的mysql数据库。
cmd窗口的版本查询命令 mysql -V
、mysql --version
1.3 连接命令
mysql -h[数据库服务端IP] -P[数据库服务端口] -u[用户名] -p[密码]
mysql -u[用户名] -p[密码]
#退出
quit 或 exit
#修改账户密码,注意命令尾的分号一定要有,这是mysql的语法
alter user 'root'@'localhost' identified with mysql_native_password BY '新密码';
数据库服务端IP:默认为 127.0.0.1
数据库服务端口:默认为 3306
-u 后面是登录的用户名,mysql安装之后,自带一个root用户
-p 后面是登录用户密码,如果不填写,回车之后,会提示输入密码
我连了一下,报错了,ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)。在 cmd 命令行里启动服务,结果显示 拒绝访问。
去 服务 里找mysql ,启动类型设为自动,然后启动服务,右键刷新后,显示 mysql 服务正在启动。再连一下就连上了。
1.4 连接mysql服务端的软件选择
1.4.1 要求不高的话,选择有很多
- MySQL Workbench:官方提供的免费可视化工具,支持Windows、Linux和MacOS。适合数据库管理员DBA、开发人员。
- Navicat:付费。支持多种数据库(MySQL、PostgreSQL、Oracle 等)。适合企业级数据库管理,适合需要高效管理多个MySQL数据库的开发者和数据库管理员,尤其是注重数据可视化和团队协作的用户。
- DBeaver:开源免费,支持几乎所有数据库(MySQL、SQLite、MongoDB 等)。支持 SQL 编辑、数据可视化、ER 图生成。适合开发者和数据库管理员,尤其是需要管理多种数据库的用户。
- HeidiSQL:免费,适用于多种数据库系统,包括MySQL、MariaDB等。适合小型到中等规模的数据库管理,以及需要简单易用的图形化管理工具的用户。
- SQLyog:支持远程。适合开发人员和数据库管理员进行日常的数据库管理和操作。
- MobaXterm:支持SSH、Telnet、Rlogin、SFTP等多种协议。能够轻松连接远程MySQL数据库,还能进行Redis等其他服务的连接和管理。适合需要同时管理多种远程服务的开发者,特别是那些需要在同一工具中处理多种协议的用户。
- TablePlus:付费,据说体验很棒。适合 Mac 用户,追求 UI 体验的用户。支持多数据库(MySQL、PostgreSQL、Redis 等)。支持 SQL 格式化、数据导出为 CSV/JSON。
1.4.2 适合做企业级管理的工具(适合团队协作)
- phpMyAdmin(Web 版 MySQL 管理):团队共享管理,基于浏览器访问,适合远程管理。适合小团队,但安全性较低,不建议暴露在公网。
- Adminer(轻量级 phpMyAdmin 替代):支持多种数据库。
1.4.3 总结
需求 | 推荐 |
---|---|
图形化管理 | MySQL Workbench、Navicat、DBeaver |
命令行操作 | mysql 原生客户端(就是windows中cmd里头连接服务那一套)、MyCLI |
Python 开发 | PyMySQL、SQLAlchemy |
Java 开发 | JDBC(mysql-connector-java) |
Web 管理 | phpMyAdmin、Adminer |
1.5 编程语言连接 MySQL(编程语言驱动)
1.5.1 Python(PyMySQL / mysql-connector-python)
import pymysql
conn = pymysql.connect(
host="localhost",
user="root",
password="123456",
database="test_db"
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
conn.close()
1.5.2 Java(JDBC)
import java.sql.*;
public class MySQLDemo {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test_db";
String user = "root";
String password = "123456";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while (rs.next()) {
System.out.println(rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
1.5.3 Node.js(mysql2 / Sequelize)
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '123456',
database: 'test_db'
});
connection.query('SELECT * FROM users', (err, results) => {
console.log(results);
});
2. 基本操作语句
通用语法:
- SQL语句以分号 ; 结尾
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 可用 /* */、–、# 的方式写注释
2.1 DDL 操作数据库对象
关键词建议用大写。
2.1.1 DDL 操作数据库
#创建数据库
CREATE DATABASE [数据库名];
CREATE DATABASE IF NOT EXISTS [数据库名];
CREATE DATABASE [数据库名] CHARACTER SET [编码方式];
CREATE DATABASE [数据库名] CHARSET='[编码方式]';
CREATE DATABASE [数据库名] SET [编码方式] COLLATE [排序规则];
#查看当前服务器中所有数据库
SHOW DATABASES;
#查看创建的数据库的定义信息
SHOW CREATE DATABASE [数据库名];
#修改某数据库的编码方式
ALTER DATABASE [数据库名] CHARACTER SET [编码方式];
#删除数据库—— 实际工作中不要删除数据库!!!
DROP DATABASE [数据库名];
#查看当前数据库
SELECT DATABASE();
#使用指定的数据库或切换数据库
USE [数据库名];
2.1.2 DDL 操作表
#建表
CREATE TABLE 表名(
列名1 数据类型 [约束],
列名2 数据类型 [约束],
列名n 数据类型 [约束]
);
表名、列名是自定义,多列之间用逗号间隔,最后一列的逗号不能写,[约束] 按需求添加,类型必须写。若列名与关键字相同,则需在列两边加 ‘ ’
数据类型选取原则:满足需求的前提下,选择取值范围小的,够用就行。
- int:整型,占 4 字节,32 比特;
- tinyint:最小整型,占 1 字节,8 比特;
- bigint:最大整型,占 8 字节,64 比特;
- double:浮点型,如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;默认支持四舍五入;
- char:固定长度字符串类型;char(10) ‘aaa’ 占10位;
- varchar:可变长度字符串类型; varchar(10) ‘aaa’ 占3位;
- text:字符串类型,比如小说信息;
- blob:字节类型,保存文件信息(视频,音频,图片);
- date:日期类型,格式为:yyyy-MM-dd;
- time:时间类型,格式为:hh:mm:ss;
- timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值;
- datetime:日期时间类型 yyyy-MM-dd hh:mm:ss
常见约束:
- 主键 primary key:唯一标识表中的一行记录。 MySQL 建议所有表的主键字段都叫 id, 类型为 int unsigned。
- 非空 not null:此字段不允许填写空值。NULL表示空
- 惟一 unique:此字段的值不允许重复。
- 默认 default:当不填写字段对应的值会使用默认值,如果填写时以填写为准。
- 外键 foreign key:对关系字段进行约束, 当为关系字段填写值时, 会到关联的表中查询此值是否存在, 如果存在则填写成功, 如果不存在则填写失败并抛出异常。
- 自增 auto_increment:1 2 3 这样自增。
#查看当前数据库已有的表
SHOW TABLES;
#查看指定表的字段信息
DESC [表名];
#查看表格创建细节
SHOW CREATE TABLE [表名];
#修改指定表名
RENAME TABLE [旧表名] TO [新表名];
ALTER TABLE [旧表名] RENAME [新表名];
#修改表的字符集
ALTER TABLE [旧表名] CHARACTER SET [编码方式];
#删除指定数据表
DROP TABLE [表名];
#增加列
ALTER TABLE [表名] ADD [新列名] [新数据类型(长度)] [约束];
#修改列字段
ALTER TABLE [表名] MODIFY [列名] [新数据类型];
ALTER TABLE [表名] CHANGE [旧列名] [新列名] [新数据类型(长度)] [约束];
#删除列,一次只能删除一列
ALTER TABLE [表名] DROP [列名];
2.2 DML 操作表中数据
在mysql中,字符串类型和日期类型都要用单引号括起来。
2.2.1 插入操作
- 多列和多个列值间用逗号隔开;
- 列名要和列值一一对应;
- 非数值的列值两侧需要加单引号;
- 给所有列添加数据时,可以省略列名,此时列值的顺序按表中列的顺序执行;
insert into 表名(列名) values(数据值);
#如:
#insert into student(stuname,stuage,stusex,birthday) values('张三1',18,'a','2000- 1-1');
#同时添加多行,列名与列值的类型、个数、顺序要一一对应,插入空值用null,插入的日期和字符一样,都使用引号括起来。
insert into 表名(列名1,列名2,...) values(第一行数据),(第二行数据),(...),(...);
#一次添加多条记录
insert into 表 values(值1,值2,....),(值1,值2,....),...;
2.2.2 修改删除
#修改
UPDATE 表名 SET 列名1=列值1,列名2=列值2 ... WHERE 列名=值;
#改所有行
UPDATE 表名 SET 列名1=列值1,列名2=列值2 ... ;
#删除
DELETE from 表名 [WHERE 列名=值]
#获取当前系统时间
select now();
- DELETE 删除表中的数据,表结构还在,删除后的数据可以找回。且不会重置主键自增序列(不清零)
- TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表,会重置主键自增序列(清零)。删除的数据不能找回。执行速度比DELETE快。
2.3 DCL 控制语句
2.3.1 创建、删除用户
#指定IP
create user 用户名@指定ip identified by 密码;
#任意IP均可登陆
create user 用户名@‘%’ identified by 密码;
#删除 drop user 用户名@IP;
drop user test123@localhost;
2.3.2 用户授权
#给指定用户,授予指定指定数据库指定权限
#grant 权限1,权限2,........,权限n on 数据库名.* to 用户名@IP;
grant select,insert,update,delete,create on chaoshi.* to 'test456'@'127.0.0.1';
#给指定用户授予所有数据库所有权限
#grant all on . to 用户名@IP
grant all on *.* to 'test456'@'127.0.0.1';
2.3.3 权限查询
#show grants for 用户名@IP;
show grants for 'root'@'%';
2.3.4 权限撤销
#revoke 权限1,权限2,........,权限n on 数据库名.* from 用户名@IP;
REVOKE SELECT ON *.* FROM 'root'@'%' ;
2.4 DQL查询语句 !!!
查询返回的结果集是一张虚拟表。
SELECT 要查询的列名称 FROM 表名称
WHERE 限定条件 /行条件/
GROUP BY grouping_columns /对结果分组/
HAVING condition /分组后的行条件/
ORDER BY sorting_columns /对结果分组/
LIMIT offset_start, row_count /结果限定/
案例:
#1> 创建学生表并添加数据
#创建表 stu
CREATE TABLE stu (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50)
);
#添加数据
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
#2>创建雇员表并添加数据
#创建雇员表
CREATE TABLE emp2(
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm decimal(7,2),
deptno INT
);
#添加数据
INSERT INTO emp2 values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp2 values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp2 values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp2 values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp2 values(7654,'MARTIN','SALESMAN',7698,'1981-09- 28',1250,1400,30);
INSERT INTO emp2 values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp2 values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp2 values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp2 values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp2 values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp2 values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
#3> 创建部门表并添加数据
#创建部门表
CREATE TABLE dept(
deptno INT,
dname varchar(14),
loc varchar(13)
);
#添加数据
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');
2.4.1 简单查询
#查所有列
SELECT * FROM 表名;
#查询指定列
SELECT 列1,列2,.. FROM 表名;
2.4.2 条件查询
在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:=、!=、<>、<、<=、>、>=; BETWEEN…AND; IN(set); IS NULL; AND;OR; NOT;
举例:
#查询学生表stu中,性别为女,并且年龄50以内的记录
SELECT * FROM stu WHERE gender='female' AND age<50;
#查询学生表stu中,学号为S_1001,或者姓名为liSi的记录
SELECT * FROM stu WHERE sid ='S_1001' OR sname='liSi';
#查询学生表stu中,学号为S_1001,S_1002,S_1003的记录
SELECT * FROM stu WHERE sid IN ('S_1001','S_1002','S_1003');
#查询学生表stu中,学号不是S_1001,S_1002,S_1003的记录
SELECT * FROM tab_student WHERE sid NOT IN('S1001','S1002','S_1003');
#查询年龄为null的记录
SELECT * FROM stu WHERE age IS NULL;
#查询年龄在20到40之间的学生记录
SELECT * FROM stu WHERE age>=20 AND age<=40;
#列名 between 开始值 and 结束值;//注意:1.开始值<结束值 2.包含临界值的
SELECT * FROM stu WHERE age BETWEEN 20 AND 40;
#查询性别非男的学生记录
SELECT * FROM stu WHERE gender!='male';
SELECT * FROM stu WHERE gender<>'male';
SELECT * FROM stu WHERE NOT gender='male';
#查询姓名不为null的学生记录
SELECT * FROM stu WHERE NOT sname IS NULL;
SELECT * FROM stu WHERE sname IS NOT NULL;
2.4.3 模糊查询
列名 like ‘表达式’ //表达式必须是字符串
通配符:
_: 任意一个字符
%:任意0~n个字符,‘张%’
#查询姓名由3个字构成的学生记录
SELECT * FROM stu WHERE sname LIKE '___';
#查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE '____i';
#查询姓名以“z”开头的学生记录
SELECT * FROM stu WHERE sname LIKE 'z%';
#查询姓名中第2个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE '_i%';
#查询姓名中包含“a”字母的学生记录
SELECT * FROM stu WHERE sname LIKE '%a%';
2.4.4 字段控制查询
(1)去除重复记录
两行或两行以上记录中系列的上的数据都相同。
如emp表中sal字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用 DISTINCT。
#SELECT DISTINCT 字段名 FROM 表名;
SELECT DISTINCT sal FROM emp;
(2)查看两列之和(必须均为数值型)
# SELECT *,列名1+列名2 FROM 表名;
SELECT *,sal+comm FROM emp;
# 若 comm列(列2)中有NULL,任何东西 + NULL 结果均为 NULL,把 NULL转成数值0的函数 IFNULL()
# SELECT *,列名1+IFNULL(列名2,0) FROM 表名;
SELECT *,sal+IFNULL(comm,0) FROM emp;
(3)给列名加别名
如(2)中查询出现 sal+IFNULL(comm,0)列,给他一个别名 total :
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
# 也可省略 AS 关键字:
SELECT *,sal+IFNULL(comm,0) total FROM emp;
2.4.5 排序
order by 列名 asc/desc;
//asc 升序 desc 降序 默认不写的话是升序
例如:
#查询所有学生记录,按年龄升序排序
SELECT * FROM stu ORDER BY age ASC;
SELECT * FROM stu ORDER BY age;
#查询所有学生记录,按年龄降序排序
SELECT * FROM stu ORDER BY age DESC;
2.4.6 聚合函数
- COUNT(列名):统计指定列不为NULL的记录行数;
- MAX(列名):计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
- MIN(列名):计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
- SUM(列名):计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
- AVG(列名):计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
案例如下
#查询emp表中记录数
SELECT COUNT(*) AS cnt FROM emp;
#查询emp表中有佣金的人数:count()函数是comm列,则只统计comm列非NULL的行数。
SELECT COUNT(comm) cnt FROM emp;
#查询emp表中月薪大于2500的人数:
SELECT COUNT(*) FROM emp WHERE sal > 2500;
#统计月薪与佣金之和大于2500元的人数:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(COMM,0) > 2500;
#查询有佣金的人数,以及有领导的人数:
SELECT COUNT(comm), COUNT(mgr) FROM emp;
#SUM 和 AVG
#需要纵向求和时使用sum()函数
#查询所有雇员月薪和
SELECT SUM(sal) FROM emp;
#查询所有雇员月薪和,以及所有雇员佣金和
SELECT SUM(SAL),SUM(IFNULL(comm,0)) FROM emp;
#查询所有雇员月薪+佣金和
SELECT SUM(sal+IFNULL(comm,0)) FROM emp;
#统计所有员工平均工资
SELECT AVG(sal) FROM emp;
#MAX 和 MIN
#查询最高工资和最低工资
SELECT MAX(sal),MIN(sal) FROM emp;
2.4.7 分组查询
GROUP BY 子句
如果查询语句中有分组操作,则select后面能添加的只能是聚合函数和被分组的列名。
#查询每个部门的部门编号和每个部门的工资和
SELECT deptno,SUM(sal) FROM emp GROUP BY deptno;
#查询每个部门的部门编号和每个部门的人数
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
#查询每个部门的部门编号以及每个部门工资大于1500的人数
SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;
HAVING 子句
- having 是在分组后对数据进行过滤,where 是在分组前对数据进行过滤。
- having 后面可以使用分组函数(统计函数),where后面不可以使用分组函数。
- WHERE 是对分组前记录的条件,如果某行记录没有满足 WHERE 子句的条件,那么这行记录不会参加分组;而 HAVING 是对分组后数据的约束。
#查询工资总和大于9000的部门编号以及工资和
SELECT deptno,SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal)>9000;
#多列分组
#统计出stu表中每个班级的男女生各多少人
SELECT gradename,gender,COUNT(*) FROM stu GROUP BY gradename,gender;
2.4.8 LIMIT
限定查询结果的起始行,以及总行数。起始行从0开始,即第一行开始!
limit 开始下标,显示条数;//开始下标从0开始
limit 显示条数;//表示默认从0开始获取数据
#查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0,5;
#查询10行记录,起始行从3开始
SELECT * FROM emp LIMIT 3,10;
(1)分页查询
若一页的记录为10条,要查看第3页记录:
第一页记录起始行为0,一共查询10行; limit 0,10
第二页记录起始行为10,一共查询10行;limit 10,10
第三页记录起始行为20,一共查询10行; limit 20,10
pageIndex 页码值 , pageSize 每页显示条数
limit (pageIndex-1)*pageSize, pageSize;
查询语句的书写顺序
select – from- where- groupby- having- order by-limit
查询语句的执行顺序
from - where -group by -having - select - order by-limit