MySQL学习(查询)

编程学习 2020-10-06 15 次浏览 次点赞

单表查询

基础查询

一、语法

SELECT 查询列表 FROM 表名;

二、特点

  1. 查询列表可以是字段、常量、函数、表达式
  2. 查询结果是一个虚拟表(dual)

三、实例

1、查询单个字段

SELECT 字段名 FROM 表名;

2、查询多个字段

SELECT 字段名,字段名 FROM 表名;

3、查询所有字段

SELECT * FROM 表名;

4、查询常量

SELECT 常量值;

注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要

5、查询函数

SELECT 函数名(实参列表);

6、查询表达式

SELECT 100/25;

7、起别名

SELECT 字段名 AS "别名" FROM 表名;

注意:别名可以使用单引号、双引号引起来,当只有一个单词时,可以省略引号,当有多个单词且有空格或特殊符号时,不能省略,AS可以省略

8、去重复

SELECT DISTINCT 字段名 FROM 表名;

9、做加法

SELECT 数值+数值; 直接运算
SELECT 字符+数值; 首先先将字符转换为整数,如果转换成功,则继续运算,如果转换失败,则默认为0,然后继续运算
SELECT NULL+数值; NULL和任何数值参与运算结果都是NULL

10、【补充】ifnull函数

功能:判断某字段或表达式是否为null,如果为null,返回指定的值,否则返回原本的值

SELECT IFNULL(字段名, 指定值) FROM 表名;

11、【补充】isnull函数

功能:判断某字段或表达式是否为null,如果是null,则返回1,否则返回0

SELECT ISNULL(字段名) FROM 表名;

条件查询

一、语法

SELECT 查询列表 FROM 表名 WHERE 筛选条件;

二、分类

  1. 条件运算符:>、>=、<、<=、=、<=>、!=、<>
  2. 逻辑运算符:and、or、not
  3. 模糊运算符:

    • like:%任意多个字符、_任意单个字符,如果有特殊字符,需要使用escape转义
    • between 数值 and 数值(包括两端的值)
    • not between and
    • in
    • is null
    • is not null

模糊查询

select 查询列表 from 表名 where 字段名 like '';

e.g.

查出student表里姓名中姓张的数据

select * from student where name like '张%';

排序查询

升序

select 查询列表 from 表名 order by 字段名 asc;

降序

select 查询列表 from 表名 order by 字段名 desc;

分组查询

select 聚合函数,用来分组的字段名 from 表名 group by 字段名;

可以在后面添加 asc 和 desc控制升序和降序

group_concat 聚合数据显示

select group_concat(字段名),用来分组的字段名 from 表名 group by 字段名;

聚合函数

(MySQL自带的帮助统计的函数)

求一个字段值的总和

select sum(字段名) from 表名;

求一个字段值的平均值

select avg(字段名) from 表名;

求一个字段值的最值

select max(字段名) from 表名;
select min(字段名) from 表名;

统计表中数据的行数(注意别用count(*) )

select count(字段名) from 表名;

having

(对查询结果再进行筛选)

where的筛选范围是原本表中的数据

select 聚合函数,用来分组的字段名 from 表名 group by 字段名 having 筛选条件;

e.g.

select avg(age) as 'age', address from student group by student having age>25;

limit

(限制查询范围)

limit(int start, int length) 如果不写第一个参数,就默认从0开始,第二个参数是查询数据的个数

(start , start + length]

e.g.

select * from info limit 1,2

从1开始,往后查两条数据(查第2、3条)

select * from info limit 2

查第1、2条数据

多表查询

联合查询

一、语法

查询语句1
union all
查询语句2
union all
...

二、特点

  1. 要查询的结果来自于多个表且多个表没有直接的连接关系,但查询的信息一致时,可以使用联合查询
  2. 要求多条查询语句的==查询列数是一致的==
  3. 要求多条查询语句的查询的每一列的类型和顺序最好一致
  4. union关键字默认去重,如果使用union all可以包含重复项

三、演示

#查询中国用户中男性的信息以及外国用户中年男性的用户信息

SELECT id,cname FROM t_ca WHERE csex='男'
UNION ALL
SELECT t_id,tname FROM t_ua WHERE tGender='male';

连接查询

一、语法

SELECT 
  查询列表 
FROM 表1 别名1 
连接类型 JOIN 表2 别名2 ON 连接条件 
where 分组前筛选条件
group BY 分组列表
having 分组后筛选条件
order BY 排序列表 ;

连接条件中要标明字段属于哪张表

二、注意

笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行

发生原因:没有有效的连接条件
如何避免:添加有效的连接条件

三、连接类型

  1. 内连接:

    • inner 要跟连接条件
    • natural + (left,right)不用跟连接条件,自动寻找公有字段,无公有字段返回笛卡尔积

内连接指的是把表连接时表与表之间匹配的数据行查询出来,就是两张表之间数据行匹配时,要同时满足ON语句后面的条件才行。

  1. 外连接(outer可以省略,不管数据是否匹配,都会显示主表查询的所有数据)
  • 左外连接:left outer(左边的是主表)
  • 右外连接:right outer(右边的是主表)
  • 全外连接:full outer(两边都是主表,但是MySQL不支持全外连接、Oracle支持)
  1. 交叉连接:cross(交叉连接其实是用sql99语法实现笛卡尔乘积)

当两张表有多个公有字段时,可以用using指定使用哪一字段

但是很少用natural和using

四、演示

1、内连接:等值连接

#查询员工名和对应的部门名

SELECT 
  last_name,
  department_name 
FROM
  departments d 
INNER JOIN employees e ON e.`department_id` = d.`department_id` ;

2、内连接:非等值连接

#查询员工的工资和工资级别

SELECT 
  salary,
  grade_level 
FROM
  employees e
INNER JOIN job_grades g ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal` ;

3、内连接:自连接

#查询员工名和它对应上级的名称

SELECT 
  e.last_name,
  m.last_name 
FROM
  employees e 
INNER JOIN employees m ON e.`manager_id` = m.`employee_id` ;

4、外连接:左外连接

#查询哪个部门没有员工

SELECT 
  d.`department_name`
FROM
  departments d 
LEFT OUTER JOIN employees e ON d.`department_id` = e.`department_id` 
WHERE e.`employee_id` IS NULL ;

5、外连接:右外连接

#查询哪个部门没有员工

SELECT 
  d.`department_name`
FROM
  employees e 
RIGHT OUTER JOIN departments d ON d.`department_id` = e.`department_id` 
WHERE e.`employee_id` IS NULL ;

6、交叉连接

#使用交叉连接进行笛卡尔乘积查询

SELECT 
  b.*,
  bo.* 
FROM beauty b 
CROSS JOIN boys bo ;

7、自然连接

SELECT
  *
FROM
  t1
NATURAL JOIN t3;

SELECT
  *
FROM
  t1
NATURAL LEFT JOIN t3;

SELECT
  *
FROM
  t1
NATURAL RIGHT JOIN t3;

子查询

sql语句的嵌套

select * from student where id in (select stuid from score where score>=85)

not in、in

exists、not exists

select * from student where exists (select stuid from score where score>=85)

exists 后( )中的sql语句有返回值就执行外层的sql语句,否则返回NULL


本文由 Haozi 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论