MySQL查询语句语法使用

一、基本查询

select 字段1,字段2,… from 表名;

查询返回的是一张虚拟表,查询对原表数据没有任何影响,默认查询的全表数据

-- 基本查询
-- 查询所有列
select sid,sname,age,sex,score,cid groupLeaderId from stu;
-- 查询所有列,在测试,练习时可以使用*代替
select * from stu;
-- 查询指定 列
select sid,sname,sex from stu;
-- 查询的列名可以取别名,使用as,但是一般as不写
select sid as 学号,sname as 姓名,score 成绩 from stu

-- 年龄+1
select age+1 from stu;
算数运算符描述
+两列做加法运算
-两列做减法运算
*两列做乘法运算
/两列做除法运算

二、条件查询

MySQL 中的条件查询主要用于从数据库表中筛选出符合特定条件的记录。条件通过 WHERE 子句来指定,可以结合多种运算符和函数来构建复杂的查询条件。以下是一些基本的条件表达式类型及其示例:

2.1 简单条件表达式

  • 等于 (=): 查询某一列值等于特定值。
    SELECT * FROM employees WHERE salary = 8000;
    
  • 不等于 (!=<>): 查询某一列值不等于特定值。
    SELECT * FROM employees WHERE salary != 8000;
    
  • 大于 (>), 小于 (<), 大于等于 (>=), 小于等于 (<=):
    SELECT * FROM employees WHERE age > 30;
    

2.2 逻辑表达式

  • AND: 用于组合多个条件,所有条件必须同时满足。
    SELECT * FROM employees WHERE department = 'Sales' AND salary > 5000;
    
  • OR: 用于组合条件,任一条件满足即可。
    SELECT * FROM employees WHERE department = 'Sales' OR department = 'Marketing';
    
  • NOT: 对条件取反。
    SELECT * FROM employees WHERE NOT (salary >= 5000);
    

2.3 模糊查询 (LIKE)

  • 用于匹配包含特定模式的字符串。
    SELECT * FROM employees WHERE name LIKE 'J%'; -- 开头为 J 的名字
    SELECT * FROM employees WHERE name LIKE '%a%'; -- 包含字母 a 的名字
    SELECT * FORM employees WHERE name LIKE '李_'; -- 两个字的李姓
    

2.4 范围查询 (BETWEEN ... AND ...)

  • 用于查询值在指定范围内的记录。
    SELECT * FROM employees WHERE hire_date BETWEEN '2000-01-01' AND '2010-12-31';
    

2.5 列表查询 (IN)

  • 用于匹配列值是否在给定的值列表中。
    SELECT * FROM employees WHERE department IN ('HR', 'IT');
    

2.6 空值查询 (IS NULLIS NOT NULL)

  • 用于查询某列值是否为空或非空。
    SELECT * FROM employees WHERE email IS NULL;
    

三、排序查询

在MySQL中,排序查询主要通过ORDER BY子句来实现。以下是一些关于如何使用ORDER BY进行排序的关键点和示例:

3.1 基本语法

SELECT column1, column2, ...
FROM table_name
ORDER BY column_to_sort [ASC|DESC], [another_column_to_sort [ASC|DESC]];
  • column_to_sort是要根据其值进行排序的列名。
  • ASC表示升序排序,默认值,可以省略。
  • DESC表示降序排序。

3.2 单列排序

-- 按照年龄升序排序
SELECT * FROM students ORDER BY age ASC;

-- 按照分数降序排序
SELECT * FROM scores ORDER BY score DESC;

3.2 多列排序

当有多列参与排序时,先按照第一个列排序,如果第一个列有相同值,则按照第二个列排序,以此类推。

-- 先按班级升序,班级相同则按学号降序
SELECT * FROM students ORDER BY class ASC, student_id DESC;

3.3 使用表达式排序

可以在ORDER BY中使用表达式,比如计算列或函数。

-- 计算年薪并按其降序排序
SELECT *, (salary * 12) AS year_salary -- AS 也可以省略
FROM employees 
ORDER BY year_salary DESC;

注意:ORDER BY子句通常置于查询的末尾,但在LIMIT子句之前。

四、分组查询

在MySQL中,分组查询是通过GROUP BY子句来实现的,它允许你根据一个或多个列的值将查询结果分成多个组,以便于进行聚合操作,如计算每个组的总数、平均值、最大值、最小值等。以下是进行分组查询的基本概念和示例:

分组查询通常配合聚合函数进行查询,下面先讲一下聚合函数

聚合函数

MySQL支持多种聚合函数,以下是一些常用的聚合函数及其用途:

  1. COUNT():

    • 功能:计算行数。
    • 用法COUNT(*) 计算所有行,包括 NULL 值;COUNT(column_name) 计算指定列中非 NULL 值的数量。
  2. SUM():

    • 功能:计算一列的总和。
    • 用法SUM(column_name) 返回指定列所有值的和。
  3. AVG():

    • 功能:计算平均值。
    • 用法AVG(column_name) 返回指定列所有值的平均数。
  4. MAX():

    • 功能:找出最大值。
    • 用法MAX(column_name) 返回指定列中的最大值。
  5. MIN():

    • 功能:找出最小值。
    • 用法MIN(column_name) 返回指定列中的最小值。

注意,聚合函数不能直接嵌套调用,例如,不能直接写成AVG(SUM(column_name))的形式,如果需要这样的复合聚合操作,通常需要使用子查询或者临时变量。

分组查询-基础语法

SELECT column1,column2...
FROM table_name
WHERE conditions
GROUP BY column1 [ASC|DESC], column2...;
  • column1, column2 是用于分组的列名。
  • table_name 是表的名称。
  • WHERE conditions 是可选的,用于在分组前过滤数据。
  • ASCDESC 可用于指定分组的排序顺序,但不常用,因为通常是在聚合后对结果进行排序。

示例

假设有一个销售订单表orders,包含product_id(产品ID)、quantity(数量)和order_date(订单日期)字段,你想要按产品ID分组并计算每个产品的总销售数量:

SELECT product_id, SUM(quantity) AS total_quantity
FROM orders
GROUP BY product_id;

多列分组

如果你需要根据多个列进行分组,只需在GROUP BY后面列出这些列名,例如,同时按产品ID和订单日期分组:

SELECT product_id, order_date, SUM(quantity) AS daily_total_quantity
FROM orders
GROUP BY product_id, order_date;

使用HAVING子句

HAVING子句用于在分组后对结果进行过滤,通常与聚合函数一起使用:

SELECT product_id, SUM(quantity) AS total_quantity
FROM orders
GROUP BY product_id
HAVING SUM(quantity) > 100;

这将只显示总销售数量超过100的产品。

注意

  • GROUP BY必须出现在WHERE子句之后,ORDER BY之前。
  • 未包含在聚合函数中的、且不在GROUP BY子句中的列不能出现在SELECT列表中,除非该列也在GROUP BY子句中。
  • ORDER BY可以用来对最终的分组结果进行排序。

五、限制查询【LIMIT

在MySQL中,限制查询结果数量通常使用LIMIT子句。LIMIT允许你指定从查询结果中返回的行数。其基本语法如下:

SELECT column1, column2, ...
FROM table_name
LIMIT [offset,] row_count;
  • offset 是一个可选参数,表示从哪一行开始返回结果,第一行的索引是0。如果省略,默认从0(即第一行)开始。
  • row_count 是必需的,指定了想要返回的最大行数。

例如,如果你想从employees表中获取前5条记录,可以这样写:

SELECT * FROM employees LIMIT 5;

如果你想从第10条记录开始,获取接下来的10条记录,可以这样写:

SELECT * FROM employees LIMIT 10, 10;

这里,10是索引,表示从第10条记录开始,10是行数,表示需要获取10条记录。

注意

  • 限制查询通常用于实现分页功能
    例如:假如 student 表中有50个学生
    如果在页面显示所有学生信息,50个学生全部都显示在一页上,显然是不可能的,就算显示出来,也很难找到想要查看的信息。
  • 那么,就要通过实现分页显示功能,来进行显示信息
    假设 一页显示10个学生,也就是十条数据,那就分成5页
  • 页数:pageNum = 5
  • 单页数据量:pageSize = 10
  • 查询第n页数据:
select * from student limit (n-1) * pageSize , pageSize 

六、多表查询

MySQL中的多表查询主要用于从两个或更多表中联合检索数据,主要通过以下几种方式实现:

  1. 内连接(INNER JOIN)
    内连接只返回两个表中匹配的行。如果表A的某行在表B中没有匹配,或者反过来,那么这行就不会出现在结果集中。

    SELECT columns
    FROM table1
    INNER JOIN table2
    ON table1.column = table2.column;
    

    也可以这样写:

     SELECT columns
      FROM table1 , table2
      where table1.column = table2.column;
    
  2. 外连接(OUTER JOIN)

    • 左连接(LEFT JOIN/LEFT OUTER JOIN):返回左表的所有行,即使在右表中没有匹配项。如果右表中没有匹配,则结果为NULL。
      SELECT columns
      FROM table1
      LEFT JOIN table2
      ON table1.column = table2.column;
      
    • 右连接(RIGHT JOIN/RIGHT OUTER JOIN):与左连接相反,返回右表的所有行,即使左表中没有匹配项。
      SELECT columns
      FROM table1
      RIGHT JOIN table2
      ON table1.column = table2.column;
      
    • 全连接(FULL JOIN):返回左表和右表中的所有行。如果某一边没有匹配,则另一边的结果为NULL。MySQL本身不直接支持FULL JOIN,但可以通过UNION来模拟实现。
  3. 交叉连接(CROSS JOIN)
    返回左表的每一行与右表的每一行的笛卡尔积,即所有可能的组合。如果不带ON子句,那么就是一个交叉连接。

    SELECT columns
    FROM table1
    CROSS JOIN table2;
    
  4. 子查询(Nested Select或Subquery)
    在一个查询内部嵌套另一个查询,外部查询可以使用内部查询的结果。

    SELECT column
    FROM table1
    WHERE column IN (SELECT column FROM table2);
    
  5. 使用表别名(Aliases)
    为表指定别名可以简化复杂的查询,提高代码的可读性。

    SELECT a.column1, b.column2
    FROM table1 AS a
    INNER JOIN table2 AS b
    ON a.id = b.id;
    

    其中 AS可以省略:

    SELECT a.column1, b.column2
    FROM table1  a
    INNER JOIN table2  b
    ON a.id = b.id;
    

最后当然还需要配合一些题目练习查询语句的技巧,下面的链接是一些比较经典的题目,可以尝试着写一下

MySQL查询练习题目


最后

如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍在这里插入图片描述

  • 31
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值