MYSQL(基础语法)

MYSQL

数据库的基本知识

什么是数据库

存储数据的仓库,本质也是一个文件

数据的存储方式

  1. 数据保存在内存
    int[] arr = new int[]{1, 2, 3, 4};
    ArrayList<Integer>list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    
    new出来的对象存储在堆中,堆是内存中的一小块空间
    优点:内存速度快
    缺点:断电/程序退出,数据就清除了,内存价格贵
  2. 数据保存在普通文件
    优点:永久保存
    缺点:查找,增加,修改,删除数据比较麻烦,效率低
  3. 数据保存在数据库
    优点:永久保存,通过SQL语句比较方便的操作数据库,数据库是对大量的信息进行管理的高效的解决方案

常见数据库

Oracle:收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。
MYSQL:开源免费的数据库,小型的数据库,已经被Oracle收购了,MySQL6.x版本也开始收费。
DB2 :IBM公司的数据库产品,收费的。常应用在银行系统中。
SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
SyBase:已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。
SQLite: 嵌入式的小型数据库,应用在手机端。

常用数据库

MYSQLOracle

在web应用中,使用的最多的就是MySQL数据库,原因如下:

  1. 开源、免费
  2. 功能足够强大,足以应付web应用开发(最高支持千万级别的并发访问)

数据库的安装

安装过程:

  1. 文件复制的过程,解压文件到指定的目录下
    在这里插入图片描述

  2. 服务器的配置
    在这里插入图片描述
    端口号是:3306

    管理员名字叫:root

    可以远程访问:在这里插入图片描述

MySQL目录结构

│-- bin:mysql相关的可执行文件*.exe
     │-- MySQLInstanceConfig.exe mysql的配置程序
│-- data: mysql自带的数据库文件(不用关注)
│-- include: c语言的头文件(不用关注)
│-- lib: 存放mysql使用到的dll动态库(相当于jar包,不用关注)
│-- my.ini mysql的配置文件,配置了mysql的相关信息

命令行客户端连接服务器

打开和关闭mysql服务

在这里插入图片描述

DOS命令方式启动

在这里插入图片描述
启动MYSQL: net start mysql

停⽌止MYSQL: net stop mysql

登录mysql服务器

在这里插入图片描述
MySQL是一个需要账户名密码登录的数据库,登陆后使用,它提供了一个默认的root账号,使用安装时设置的密码即可登录

  1. 登录格式1:在DOS命令行:mysql -u用户名 -p密码
    例如:
    mysql -uroot -proot
    

在这里插入图片描述
后输入密码方式:

mysql -uroot -p回车
下一行输入密码
  1. 登录格式2:mysql -hip地址 -u用户名 -p密码
    例如:
    mysql -h127.0.0.1 -uroot -proot
    
  2. 退出MySQL:exit

图形界面SQLyog客户端

在这里插入图片描述
SQLyog是业界著名的Webyog公司出品的一款简洁高效、功能强大的图形化MySQL数据库管理工具。使用SQLyog可以快速直观地让您从世界的任何角落通过网络来维护远端的MySQL数据库

  1. 双击
    在这里插入图片描述
  2. 一直下一步,直到出现下面对话框
    在这里插入图片描述
  3. 输入名称和秘钥
  4. 重启SQLyog即可
  5. 使用SQLyog登录数据库
    在这里插入图片描述

服务器与数据库、表、记录的关系

在这里插入图片描述
关系型数据库的核心单元是表

SQL语句的分类和语法

什么是SQL

(Structured Query Language)结构化查询语言,简称SQL

SQL作用

通过SQL语句可以方便的操作数据库、表、数据。
SQL是数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但都有特有内容。
在这里插入图片描述

SQL语句分类

  1. DDL(Data Definition Language) 数据定义语言
    用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter等
  2. DML(Data Manipulation Language) 数据操作语言
    用来对数据库中表的数据进行增删改。关键字:insert,delete,update等
  3. DQL(Data Query Language) 数据查询语言
    对数据库进行数据查询,关键字select
  4. DCL(Data Control Language)数据控制语言(了解)
    是用来设置或更改数据库用户或角色权限的语句,这个比较少用到

SQL通用语法

  1. SQL语句可以单行或多行书写,以分号结尾。
  2. 可使用空格和缩进来增强语句的可读性。
  3. MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
    SELECT * FROM user;
    
  4. 3种注释
    单行注释:-- 注释
    多行注释:/*注释*/
    MYSQL特有的单行注释:# 注释

DDL创建数据库(重要)

创建数据库

1.直接创建数据库

CREATE DATABASE 数据库名;

2.判断是否存在并创建数据库

CREATE DATABASE IF NOT EXISTS 数据库名;

3.创建数据库并指定字符集(编码表)

CREATE DATABASE 数据名 DEFAULT CHARACTER SET 字符集;

4.具体操作:

  • 直接创建数据库db1
    CREATE DATABASE db1;
    
  • 判断是否存在并创建数据库db2
    CREATE DATABASE IF NOT EXISTS db2;
    
  • 创建数据库db3并指定字符集为gbk
    CREATE DATABASE db2 CHARACTER SET gbk;
    

查看数据库

1.查看所有的数据库

SHOW DATABASES;

2.查看某个数据库的定义信息

SHOW CREATE DATABASE 数据名;

DDL修改和删除数据库(重要)

修改数据库字符集

ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;

具体操作:

  • 将db3数据库的字符集改成utf8
    ALTER DATABASE db3 DEFAULT CHARACTER SET utf8;
    

删除数据库

DROP DATBASE 数据库名;

具体操作:

  • 删除db2数据库
    DROP DATABASE db2;
    

DDL使用数据库

1.查看正在使用的数据库

SELECT DATABASE();

2.使用/切换数据库

USE 数据库名;

具体操作:

  • 查看正在使用的数据库
    SELECT DATABASE();
    
  • 使用db1数据库
    USE db1;
    

DDL创建表(重要)

前提先使用某个数据库(db1)

创建表

CREATE TABLE 表名 (字段名1 字段类型1, 字段名2 字段类型2);

建议写成如下格式:

CREATE TABLE 表名 (
    字段名1 字段类型1, 
    字段名2 字段类型2
);

MySQL数据类型

MySQL中的常使用的数据类型如下:
在这里插入图片描述
详细的数据类型如下
在这里插入图片描述
具体操作:
创建student表包含id、name、birthday字段

CREATE TABLE student (
      id INT,
      name VARCHAR(20),
      birthday DATE
);

DDL查看表(重要)

1.查看某个数据库中的所有表

SHOW TABLES;

2.查看表结构

DESC 表名;

3.查看创建表的SQL语句

SHOW CREATE TABLE 表名;

具体操作:

  • 查看mysql数据库中的所有表
    SHOW TABLES;
    
  • 查看student表的结构
    DESC student;
    
  • 查看student的创建表SQL语句
    SHOW CREATE TABLE student;
    

DDL删除表(重要)

快速创建一个表结构相同的表

CREATE TABLE 表名 LIKE 其他表;

具体操作:

  • 创建s1表,s1表结构和student表结构相同
    CREATE TABLE s1 LIKE student;
    

删除表

1.直接删除表

DROP TABLE 表名;

2.判断表是否存在并删除表

DROP TABLE IF EXISTS 表名;

具体操作:

  • 直接删除表s1表
    DROP TABLE s1;
    
  • 判断表是否存在并删除s1表
    DROP TABLE IF EXISTS s1;
    

DDL修改表结构

所有的修改表结构的语句都是: ALTER TABLE 表名 XXX;

修改表结构使用不是很频繁,只需要了解,等需要使用的时候再回来查即可

1.添加表一列

ALTER TABLE 表名 ADD 字段名 字段类型;

具体操作:

  • 为学生表添加一个新的字段remark,类型为varchar(20)
    ALTER TABLE student ADD remark VARCHAR(20);
    

2.修改字段类型

ALTER TABLE 表名 MODIFY 字段名 新类型;

具体操作:

  • 将student表中的remark字段的改成varchar(100)
    ALTER TABLE student MODIFY remark VARCHAR(100);
    

3.修改字段名

ALTER TABLE 表名 CHANGE 老字段名 新字段名 类型;

具体操作:

  • 将student表中的remark字段名改成intro,类型varchar(30)

    ALTER TABLE student CHANGE remark intro varchar(30);
    

4.删除字段

ALTER TABLE 表名 DROP 字段名;

具体操作:

  • 删除student表中的字段intro

    ALTER TABLE student DROP intro;
    

5.修改表名

RENAME TABLE 表名 TO 新表名;

具体操作:

  • 将学生表student改名成student2,再删除student2表

     RENAME TABLE student TO student2;
     DROP TABLE student2;
    

6.修改表的字符集

ALTER TABLE 表名 DEFAULT CHARACTER SET 新字符集;

具体操作:

  • 将student2表的编码修改成gbk

    ALTER TABLE student2 character set gbk;
    

DML插入记录(重点)

DML是对表中的数据进行增删改

创建student表包含id,name,birthday,sex,address字段。

CREATE TABLE student (
      id INT,
      name VARCHAR(20),
      birthday DATE,
      sex char(2),
      address varchar(50)
);

插入全部字段

  • 所有的字段名都写出来

    INSERT INTO 表名 (字段名1, 字段名2, 字段名3, ...) VALUES (1,2,3, ...);
    
  • 不写字段名

    INSERT INTO 表名 VALUES (1,2,3, ...);
    

插入部分数据

只需要指定要插入数据的字段
INSERT INTO 表名 (字段名1, 字段名2...) VALUES (字段值1, 字段值2);

没有添加数据的字段会使用NULL

1.具体操作:

  • 插入部分数据,往学生表中添加 id, name, age, sex数据
INSERT INTO student (id, NAME, age, sex) VALUES (1, '张三', 20, '男');
  • 向表中插入所有字段

    • 所有的字段名都写出来
    INSERT INTO student (NAME, id, age, sex, address) VALUES ('李四', 2, 23, '女', '广州');
    
    • 不写字段名
    INSERT INTO student VALUES (3, '王五', 18, '男', '北京');
    

注意

  • 值与字段必须对应,个数相同,类型相同
  • 值的数据大小必须在字段的长度范围内
  • 除了数值类型外,其它的字段类型的值必须使用引号引起。(建议单引号)
  • 如果要插入空值,可以不写字段,或者插入null

DOS命令窗口操作数据乱码问题

当我们使用DOS命令行进行SQL语句操作如有有中文会出现乱码,导致SQL执行失败
在这里插入图片描述
错误原因:因为MySQL的客户端设置编码是utf8,而系统的DOS命令行编码是gbk,编码不一致导致的乱码
在这里插入图片描述

解决方案:

  1. 快捷设置
    在DOS命令行输入:
    set names gbk;
    

注意:以上方式为临时方案,退出DOS命令行就失效了,需要每次都配置

  1. 修改MySQL安装目录下的my.ini文件,重启服务所有地方生效。此方案将所有编码都修改了[不建议]
    在这里插入图片描述

DML更新表记录(重要)

1.不带条件修改数据

UPDATE 表名 SET 字段名=字段值;

2.带条件修改数据

UPDATE 表名 SET 字段名=字段值 WHERE 条件;

3.具体操作:

  • 不带条件修改数据,将所有的性别改成女

    UPDATE student SET sex='女';
    
  • 带条件修改数据,将id号为2的学生性别改成男

    UPDATE student SET sex='男' WHERE id=2;
    
  • 一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京

    UPDATE student SET age=26, address='北京' WHERE id=3;
    

DML删除表记录(重要)

1.带条件删除数据

DELETE FROM 表名 WHERE 条件;

2.不带条件删除数据

DELETE FROM 表名;

3.具体操作:

  • 带条件删除数据,删除id为3的记录

    DELETE FROM student WHERE id=3;
    
  • 不带条件删除数据,删除表中的所有数据

    DELETE FROM student;
    

数据库约束的概述

数据库约束的作用

对表中的数据进行进一步的限制,保证数据的正确性有效性完整性

约束种类

  • PRIMARY KEY: 主键约束
  • UNIQUE: 唯一约束
  • NOT NULL: 非空约束
  • DEFAULT: 默认约束
  • FOREIGN KEY: 外键约束

主键约束(重要)

为什么需要主键约束

有些记录的 name、age、score 字段的值都一样时,那么就没法区分这些数据,造成数据库的记录不唯一,这样就不方便管理数据。
在这里插入图片描述
每张表都应该有一个主键,并且每张表只能有一个主键。

主键的作用

通过主键可以区分数据。

哪个字段作为表的主键

通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。

创建主键

主键:PRIMARY KEY
主键的特点

  • 主键必须包含唯一的值
  • 主键不能包含NULL值

创建主键方式

  1. 在创建表的时候给字段添加主键

    CREATE TABLE 表名 (
    	字段名 字段类型 PRIMARY KEY,
    	字段名 字段类型
    );
    
  2. 在已有表中添加主键(不常用)

    ALTER TABLE 表名 ADD PRIMARY KEY (字段名);
    

具体操作:

  • 创建表学生表st5, 包含字段(id, name, age)将id做为主键
CREATE TABLE st5 (
	id INT PRIMARY KEY, -- id是主键
	NAME VARCHAR(20),
	age INT
);

在这里插入图片描述

  • 添加数据
INSERT INTO st5 (id, NAME) VALUES (1, '小明');
INSERT INTO st5 (id, NAME) VALUES (2, '小红');
INSERT INTO st5 (id, NAME) VALUES (3, '小白');
INSERT INTO st5 (id, NAME) VALUES (4, '小黑');
  • 插入重复的主键值
-- 主键是唯一的不能重复:Duplicate entry '1' for key 'PRIMARY'
INSERT INTO st5 (id, NAME) VALUES (1, '小黑2');
  • 插入NULL的主键值
-- 主键是不能为空的:Column 'id' cannot be null
INSERT INTO st5 (id, NAME) VALUES (NULL, '小黑3');

删除主键

ALTER TABLE 表名 DROP PRIMARY KEY;

具体操作:

  • 删除st5表的主键
ALTER TABLE st5 DROP PRIMARY KEY;

在这里插入图片描述

主键自增(重要)

主键让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值

字段名 字段类型 PRIMARY KEY AUTO_INCREMENT

AUTO_INCREMENT 表示自动增长(字段类型必须是数值类型)

具体操作:

  • 创建学生表st6, 包含字段(id, name, age)将id做为主键并自动增长
CREATE TABLE st6 (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT
);
  • 插入数据
-- 主键默认从1开始自动增长
INSERT INTO st6 (NAME, age) VALUES ('小明', 22);
INSERT INTO st6 (NAME, age) VALUES ('小红', 26);
INSERT INTO st6 (NAME, age) VALUES ('小张', 25);
INSERT INTO st6 (NAME, age) VALUES ('小艾', 20);

默认地AUTO_INCREMENT 的开始值是1,如果希望修改起始值,请使用下列SQL语法

ALTER TABLE st6 AUTO_INCREMENT = 10000;

DELETETRUNCATE的区别

  • DELETE 删除表中的数据,但不重置AUTO_INCREMENT的值。
  • TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1。

唯一约束

唯一约束的作用

让字段的值唯一,不能重复

唯一约束的格式

CREATE TABLE 表名 (
	字段名 字段类型 UNIQUE,
	字段名 字段类型
);

具体步骤:

  • 创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生
CREATE TABLE st7 (
	id INT,
	NAME VARCHAR(20) UNIQUE
);
  • 添加一些学生
INSERT INTO st7 VALUES (1, '小明');
INSERT INTO st7 VALUES (2, '小红');
INSERT INTO st7 VALUES (3, '小张');
INSERT INTO st7 VALUES (4, '小艾');

-- 插入相同的名字出现name重复: Duplicate entry '小明' for key 'name'
INSERT INTO st7 VALUES (5, '小明');

-- 出现多个null的时候会怎样?因为null是没有值,所以不存在重复的问题
INSERT INTO st3 VALUES (5, NULL);
INSERT INTO st3 VALUES (6, NULL);

非空约束

非空约束的作用

让这个字段的值不能为空

非空约束的语法格式

CREATE TABLE 表名 (
	字段名 字段类型 NOT NULL,
	字段名 字段类型
);

具体操作:

  • 创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL
CREATE TABLE st8 (
	id INT,
	NAME VARCHAR(20) NOT NULL,
	gender CHAR(2)
);
  • 添加一些完整的记录
INSERT INTO st8 VALUES (1, '小明', '男');
INSERT INTO st8 VALUES (2, '小张', '男');
INSERT INTO st8 VALUES (3, '小白', '男');
INSERT INTO st8 VALUES (4, '小刚', '男');

-- 姓名不赋值出现姓名不能为null: Column 'name' cannot be null
INSERT INTO st8 VALUES (5, NULL, '男');

默认值

默认值的作用

如果这个字段不设置值,就使用默认值。

默认值格式

CREATE TABLE 表名 (
	字段名 字段类型 DEFAULT,
	字段名 字段类型
);

具体步骤:

  • 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州
CREATE TABLE st9 (
	id INT,
	NAME VARCHAR(20),
	address VARCHAR(50) DEFAULT '广州'
);
  • 添加一条记录,使用默认地址
INSERT INTO st9 (id, NAME) VALUES (1, '小明');
  • 添加一条记录,不使用默认地址
INSERT INTO st9 VALUES (2, '小天', '北京');

DQL没有条件的简单查询(重要)

注意:查询不会对数据库中的数据进行修改,只是一种显示数据的方式。

查询表中所有列数据

1.写出查询每列的名称

SELECT 字段名1, 字段名2, 字段名3 FROM 表名;

具体操作:

SELECT id, NAME ,age, sex, address FROM student;

2.使用*表示所有列

SELECT * FROM 表名;

具体操作:

SELECT * FROM student;

查询student表中的name 和 age 列

SELECT NAME, age FROM student;

别名查询

1.查询时给列、表指定别名需要使用AS关键字

2.使用别名的好处是方便观看和处理查询到的数据

   SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名 AS 表别名;

注意

查询给表取别名目前还看不到效果,需要到多表查询的时候才能体现出好处
AS关键字可以省略

3.具体操作:

  • 查询sudent表中name 和 age 列,name列的别名为”姓名”,age列的别名为”年龄”
SELECT NAME AS 姓名, age AS 年龄 FROM student;

清除重复值

1.查询指定列并且结果不出现重复数据

SELECT DISTINCT 字段名 FROM 表名;

2.具体操作:

  • 查询address列并且结果不出现重复的address
SELECT DISTINCT address 城市 FROM student;

查询结果参与运算

1.某列数据和固定值运算

SELECT 字段名 +FROM 表名;

2.某列数据和其他列数据参与运算

SELECT 字段1 + 字段2 FROM 表名;

注意: 参与运算的必须是数值类型

3.需求:

  • 添加数学,英语成绩列,给每条记录添加对应的数学和英语成绩
  • 查询的时候将数学和英语的成绩相加

4.实现:

  • 修改student表结构,添加数学和英语成绩列

    ALTER TABLE student ADD math INT;
    ALTER TABLE student ADD english INT;
    
  • 给每条记录添加对应的数学和英语成绩

  • 查询math + english的和

    SELECT math + english FROM student;
    

    结果确实将每条记录的math和english相加,但是效果不好看

  • 查询math + english的和使用别名”总成绩”

    SELECT math + english 总成绩 FROM student;
    
  • 查询所有列与math + english的和并使用别名”总成绩”

    SELECT *, math + english 总成绩 FROM student;
    
  • 查询姓名、年龄,将每个人的数学增加10分

    SELECT name, math + 10 FROM student;
    

蠕虫复制

什么是蠕虫复制:将一张表的数据复制,插入到另一张表中
语法格式:

INSERT INTO 表名1 SELECT * FROM 表名2;

作用:将表名2中的数据复制到表名1

具体操作:

  • 创建student2表,student2结构和student表结构一样
CREATE TABLE student2 LIKE student;
  • 将student表中的数据添加到student2表中
INSERT INTO student2 SELECT * FROM student;

注意:如果只想复制student表中name,age字段数据到student2表中使用如下格式
INSERT INTO student2(NAME, age) SELECT NAME, age FROM student;

DQL查询语句-条件查询(重要)

语法格式:

SELECT * FROM 表名 WHERE 条件;

流程:取出表中满足条件的记录

准备数据

CREATE TABLE student3 (
  id int,
  name varchar(20),
  age int,
  sex varchar(5),
  address varchar(100),
  math int,
  english int
);

比较运算符

>大于
<小于
<=小于等于
>=大于等于
=等于
<>!=不等于

具体操作:

  • 查询math分数大于80分的学生
SELECT * FROM student3 WHERE math>80;
  • 查询english分数小于或等于80分的学生
SELECT * FROM student3 WHERE english<=80;
  • 查询age等于20岁的学生
SELECT * FROM student3 WHERE age=20;
  • 查询age不等于20岁的学生
SELECT * FROM student3 WHERE age!=20;
SELECT * FROM student3 WHERE age<>20;

逻辑运算符

and(&&) 多个条件同时满足
or(||) 多个条件其中一个满足
not(!) 不满足

具体操作:

  • 查询age大于35且性别为男的学生(两个条件同时满足)
SELECT * FROM student3 WHERE  age>35 AND sex='男';
  • 查询age大于35或性别为男的学生(两个条件其中一个满足)
SELECT * FROM student333 WHERE age>35 OR sex='男';
  • 查询id是1或3或5的学生
SELECT * FROM student3 WHERE id=1 OR id=3 OR i d=5;

in关键字
语法格式:

SELECT * FROM 表名 WHERE 字段名 IN (1,2);

in里面的每个数据都会作为一次条件,只要满足条件的就会显示

具体操作:

  • 查询id是1或3或5的学生
SELECT * FROM student3 WHERE id IN (1,3,5);
  • 查询id不是1或3或5的学生
SELECT * FROM student3 WHERE id NOT IN (1,3,5);

范围

SELECT * FROM 表名 WHERE 字段名 BETWEEN1 AND2;

比如:age BETWEEN 80 AND 100
相当于: age>=80 && age<=100

具体操作:

  • 查询english成绩大于等于75,且小于等于90的学生
SELECT * FROM student3 WHERE english>=75 AND english<=90;
SELECT * FROM student3 WHERE english BETWEEN 75 AND 90;

模糊查询like(重要)

LIKE 像什么什么一样

SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串'

满足通配符字符串规则的数据就会显示出来

MySQL通配符有两个:
%: 表示任意多个字符
_: 表示一个字符

具体操作:

  • 查询姓张的学生
SELECT * FROM student3 WHERE NAME LIKE '张%';
  • 查询姓名中包含’德’字的学生
SELECT * FROM student3 WHERE NAME LIKE '%德%';
  • 查询姓张,且姓名有三个字的学生
SELECT * FROM student3 WHERE NAME LIKE '张__';

DQL查询语句-排序(重要)

通过ORDER BY子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)

SELECT * FROM 表名 ORDER BY 字段名 ASC|DESC;

ASC: 升序
DESC: 降序

单列排序

单列排序就是使用一个字段排序

具体操作:

  • 查询所有数据,使用年龄降序排序
select * FROM student3 order by age DESC;

组合排序

组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。
上面的例子中,年龄是有相同的。当年龄相同再使用math进行排序

SELECT * FROM 表名 WHERE 条件 ORDER BY 字段名 [ASC|DESC], 字段名 [ASC|DESC];

具体操作:

  • 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * FROM student3 ORDER BY age DESC, math DESC;

DQL查询语句-聚合函数(重要)

上面做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值NULL。

五个聚合函数:
count: 统计指定列记录数,记录为NULL的不统计
sum: 计算指定列的数值和,如果不是数值类型,那么计算结果为0
max: 计算指定列的最大值
min: 计算指定列的最小值
avg: 计算指定列的平均值 average

聚合函数的使用:写在 SQL语句SELECT字段名的地方

SELECT 字段名, 字段名 FROM 表名;
SELECT 聚合函数(), 字段名 FROM 表名;

具体操作:

  • 查询学生总数
SELECT COUNT(english) FROM student3;

发现对于NULL的记录不会统计

统计数量常用:

SELECT COUNT(*) FROM student3;
  • 查询年龄大于40的总数
SELECT COUNT(*) FROM student3 WHERE age>40;
  • 查询数学成绩总分
SELECT SUM(math) FROM student3;
  • 查询数学成绩最高分
SELECT MAX(math) FROM student3;
  • 查询数学成绩最低分
SELECT MIN(math) FROM student3;
  • 查询数学成绩平均分
SELECT AVG(math) FROM student3;

DQL查询语句-分组(重要)

分组查询是指使用 GROUP BY语句对查询信息进行分组

SELECT * FROM 表名 GROUP BY 字段名;

GROUP BY怎么分组的?
将分组字段结果中相同内容作为一组

SELECT * FROM student3 GROUP BY sex;

这句话会将sex相同的数据作为一组

GROUP BY将分组字段的相同值作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。

分组后聚合函数的作用?不是操作所有数据,而是分别操作每组数据

SELECT SUM(math), sex FROM student3 GROUP BY sex;

实际上是将每组的math进行求和,返回每组统计的结果

注意事项:当使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的

  • 查询的时候没有查询出分组字段

  • 查询的时候查询出分组字段

具体步骤:

  • 按性别分组
SELECT sex FROM student3 GROUP BY sex;
  • 查询男女各多少人
1.查询所有数据,按性别分组
2.统计每组人数
SELECT sex, COUNT(*) FROM student3 GROUP BY sex;
  • 查询年龄大于25岁的人,按性别分组,统计每组的人数
1.先过滤掉年龄小于25岁的人
2.再分组
3.最后统计每组的人数
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex;
  • 查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据

    • 可能会将SQL语句写出这样:
    SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex WHERE COUNT(*) >2;
    

注意: 并只显示性别人数>2的数据属于分组后的条件,对于分组后的条件需要使用having子句

SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex HAVING COUNT(*) >2;
只有分组后人数大于2``这组数据显示出来

having与where的区别

  • having是在分组后对数据进行过滤
  • where是在分组前对数据进行过滤
  • having后面可以使用聚合函数
  • where后面不可以使用聚合函数

DQL查询语句-limit语句(重要)

LIMIT限制的意思,所以LIMIT的作用就是限制查询记录的条数。

LIMIT语句格式:

SELECT * FROM 表名 LIMIT offset, length;

offset是指偏移量,可以认为是跳过的记录数量,不写则默认为0。
length是指需要显示的总记录数

具体步骤:

  • 查询学生表中数据,跳过前面2条,显示6条
可以认为跳过前面2条,取6条数据
SELECT * FROM student3 LIMIT 2,6;

LIMIT的使用场景:分页

比如登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。假设我们一每页显示5条记录的方式来分页。SQL语句如下:

-- 每页显示5条
-- 第一页: LIMIT 0,5;	跳过0条,显示5条
-- 第二页: LIMIT 5,5;  跳过5条,显示5条
-- 第三页: LIMIT 10,5; 跳过10条,显示5条
SELECT * FROM student3 LIMIT 0,5;
SELECT * FROM student3 LIMIT 5,5;
SELECT * FROM student3 LIMIT 10,5;

注意

  • 如果第一个参数是0可以简写:
    SELECT * FROM student3 LIMIT 0,5;
    SELECT * FROM student3 LIMIT 5;
  • LIMIT 10,5; – 不够5条,有多少显示多少
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值