SQL语句学习之DQL(一)

284 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

写在前面👀

DQL(Data Query Language),数据查询语言,用来查询表中的记录。关键字:SELECT,WHERE

一、准备工作👓

1️⃣Navicat安装

一款可视化的数据库管理软件

2️⃣建一个学生信息表📋

CREATE TABLE `stu_info` (
  id int NOT NULL AUTO_INCREMENT,  # 学号,自动递增
  name varchar(10),                # 姓名
  age int,                         # 年龄
  gender tinyint,                  # 性别 0代表男生,1代表女生
  math float(4,1),                 # 数学分数
  english float(4,1),              # 英语分数
  hometown varchar(10),            # 家乡
  PRIMARY KEY (id)                 # 将id设置为主键
);

3️⃣为表添加一些数据📜

INSERT INTO stu_info (name,age,gender,math,english,hometown) VALUES 
('大角牛',17,0,null,null,'衢州'),
('倔强的牛角',17,0,60,60,'沈阳'),
('牛丫丫',16,1,99.9,99.9,'衢州'),
('牛秀珠',16,1,88.8,88.8,'绍兴'),
('李子涵',19,0,100,100,'杭州'),
('许祥宇',18,0,78,9,'长春');
  • 创建结果如下👇

image-20220405215527769

二、基础查询🥽

关键字:SELECT

1️⃣查询所有字段👞

  • 用星号*代表所有字段
/* 语法 */
SELECT * FROM 表名;
/* 示例 */
SELECT * FROM stu_info; # 查询学生信息表的所有字段

image-20220405225016509

2️⃣查询指定字段👟

/* 语法 */
SELECT 字段名1,字段名2... FROM 表名;
/* 示例 */
SELECT name,age FROM stu_info; # 查询 stu_info 表中的 name 和 age 列

image-20220406145634267

3️⃣去重🥾

  • 关键字:DISTINCT
/* 语法 */
SELECT DISTINCT 字段名 FROM 表名;
/* 示例 */
-- 查询学生来自于哪些城市
SELECT hometown FROM stu_info;
-- 去掉重复的记录
SELECT DISTINCT hometown FROM stu_info;

image-20220406145510570

4️⃣计算🥿

查询结果也可以参与运算,但并不会修改原来的数据值

  • 注意:参与运算的字段类型必须是数值类型,如 intdouble

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

/* 语法 */
SELECT 列名+固定值 FROM 表名; # 加号也可以替换成其他运算符
/* 示例 */
-- 给所有学生的数学减1分
SELECT name ,math,math-1 FROM stu_info;

image-20220406151622367

  • 可以看到,大角牛由于未参加考试,分数理应0分,显示为null显然不合理

    • 故推荐一个IFNULL(参数1,参数2)函数

    • 参数可以是数值,可以是文字,也可以是表达式、字段名等等

    • 如果参数1为null,则返回参数2的值

    • 如果参数1不为null,则返回参数1的值

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

/* 语法 */
SELECT 列名1 + 列名2 FROM 表名;
/* 示例 */
-- 查询数学与英语的总分
SELECT name, IFNULL(math,0),IFNULL(english,0),IFNULL(math+english,0) FROM stu_info;

image-20220406154310338

5️⃣别名👠

查询结果显示的是新名字,但并不会修改表的结构

  • 关键字:AS,当然其实不用AS也行
  • 表使用别名可以用于多表查询
/* 语法 */
SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名 AS 表别名;
/* 示例 */
SELECT name AS 姓名, IFNULL(math,0) AS 数学,IFNULL(english,0) AS 英语,IFNULL(math+english,0) AS 总分 FROM stu_info AS stu;

image-20220406160040073

三、条件查询👓

关键字:WHERE,如果没有查询条件,则每次查询所有的行。用条件查询,可以对记录进行过滤

1️⃣基本语法👡

流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回

SELECT 字段名 FROM 表名 WHERE 条件;

2️⃣比较运算符👢

MySQL 允许用户对表达式的两侧的操作数进行比较。如果比较的结果为真,则返回 1;结果为假,则返回 0。若比较结果不确定,则返回 NULL,NULL 不能用于比较,会直接返回 NULL

符号描述备注
=等于
<>, !=不等于
大于
<小于
<=小于等于
>=大于等于
BETWEEN a AND ba,b之间相当于[a,b]
NOT BETWEEN a AND b不在a,b两值之间相当于(-∞,a)U(b,+∞)
IN(集合)在集合中集合表示多个值,使用逗号分隔
NOT IN不在集合中
<=>严格比较两个NULL值是否相等两个操作数均为NULL时,其所得值为1;而当一个操作数为NULL时,其所得值为0
LIKE模糊匹配通配符 :%匹配多个字符串;_匹配一个字符串
REGEXP 或 RLIKE正则式匹配
IS NULL或ISNULL判断一个值是否为空
IS NOT NULL判断一个值是否不为空

3️⃣逻辑运算符🩰

在SQL推荐使用前者,因为后者并不通用

符号含义
NOT 或 !逻辑非
AND 或 &&逻辑与
OR 或 ||逻辑或
XOR逻辑异或

4️⃣查询示例🧦

1.多条件查询🍈

-- 查询 age 大于 17 且性别为男的学生(两个条件同时满足)
SELECT * FROM stu_info WHERE age>17 AND gender=0;
-- 查询 age 大于 17 或性别为男的学生(两个条件其中一个满足)
SELECT * FROM stu_info WHERE age>17 OR gender=0;
-- 查询 id 是 1 或 3 或 5 的学生
SELECT * FROM stu_info WHERE id=1 OR id=3 OR id=5;
  • 查询结果演示👇
    • 查询 age 大于 17 且性别为男的学生(两个条件同时满足)image-20220406192702156
    • 查询 age 大于 17 或性别为男的学生(两个条件其中一个满足)image-20220406192739116
    • 查询 id 是 1 或 3 或 5 的学生image-20220406192802172

2.集合查询🍉

  • 关键字:IN
/* 语法 */
SELECT 字段名 FROM 表名 WHERE 字段 IN (数据 1, 数据 2...);
/* 示例 */
-- 查询 id 是 1 或 3 或 5 的学生
SELECT * FROM stu_info WHERE id IN(1,3,5); # 相当于WHERE id=1 OR id=3 OR id=5;
-- 查询 id 不是 1 或 3 或 5 的学生
SELECT * FROM stu_info WHERE id NOT IN(1,3,5);
  • 查询结果演示👇
    • 查询 id 是 1 或 3 或 5 的学生image-20220406193147706
    • id 不是 1 或 3 或 5 的学生image-20220406193152952

3.范围查询🍊

  • 关键字:BETWEEN AND
/* 语法 */
SELECT 字段名 FROM 表名 WHERE 字段 BETWEEN 值 1 AND 值 2
/* 示例 */
-- 查询数学成绩大于等于80,且小于等于90的学生
SELECT * FROM stu_info WHERE math BETWEEN 80 AND 90; # 相当于math>=80 && math<=90
  • 查询结果演示👇
    • 查询数学成绩大于等于80,且小于等于90的学生image-20220406193823605

4.模糊查询🍋

  • 关键字:LIKE
  • 通配符:%(匹配多个字符串);_(匹配单个字符)
/* 语法 */
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
/* 示例 */
-- 查询叫‘牛’的学生
SELECT * FROM stu_info WHERE name LIKE '牛'; # 显然没有叫牛的学生,所以查询结果返回null
-- 查询姓‘牛’的学生
SELECT * FROM stu_info WHERE name LIKE '牛%';
-- 查询姓名中包含'牛'字的学生
SELECT * FROM stu_info WHERE name LIKE '%牛%';
-- 查询姓名有三个字,且第三个字是'牛'的学生
SELECT * FROM stu_info WHERE name LIKE '__牛'
  • 查询结果演示👇
    • 查询叫'牛'的学生image-20220406195259773
    • 查询姓'牛'的学生image-20220406195306752
    • 查询姓名中包含'牛'字的学生image-20220406195317186
    • 查询姓名有三个字,且第三个字是'牛'的学生image-20220406195327518

写在后面🍻

感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗