MySQL基础学习笔记

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进行分析与可视化。
  1. CURD操作:增删改查操作
  2. SQL 语句分类
  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:数据库、表、列等。
  • DML(Data Manipulation Language):数据操作语言,用来对数据库中的表记录进行增、删、改。
  • DCL(Data Control Language):数据控制语言,用来定义数据库的访问权限和安全级别,还有创建用户。
  • DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录。(这个是重点!)

注意:sql语句以;结尾。mysql中的关键字不区分大小写

1.2 下载安装、变量配置过程(略)

网上有很多安装配置过程记录,这边就不记了,注意安装时,卸载其他版本的mysql数据库。
cmd窗口的版本查询命令 mysql -Vmysql --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 intovalues(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 表名;
#查询指定列
SELECT1,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱工作_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值