查询相关

union去相同记录查询

select column1 from table1
union 
select column2 from table2

union all直接聚合查询

select column1 from table1
union all
select column2 from table2

WARNING

  1. column1column2应有相同的数据类型。当然它们可以相同。
  2. union all关键字并不去除重复值,如果需要去除,你可以使用union替代它。
  3. 为什么说伪集合呢,因为你并没有去除重复值(没有保证从table1 select出来的是不重复,也没有保证table2,更没有保证并之后的结果是不重复的)。

distinct去重复查询

select distinct 字段名 from 表名;

order by查询结果进行排序

select * from 表名 order by 字段名 desc// 降序,从大到小
select * from 表名 order by 字段名 asc// 升序,asc默认可以不写

判断产品是否过期,有效期30天

select * from product where datediff(day, getdate(), productTime)< 30

TIP

datediff() 这个函数是取得2个日期之前的差,第一个参数是表示返回的是天数(day),月数(month)、年(year)等等 ;

getdate() 表示取得当前日期

分页限制查询

# 查出符合条件的记录总数
SELECT COUNT(*) from 表名 WHERE  ......;  

# 查询当页要显示的数据
SELECT * FROM 表名  WHERE ...... limit M,N; 

# 但是从 Mysql4.0.0 开始,我们可以选择使用另外一个方式:
SELECT SQL_CALC_FOUND_ROWS * FROM 表名 WHERE ......  limit M, N;
SELECT FOUND_ROWS();

TIP

SQL_CALC_FOUND_ROWS 告诉 MySQL 将sql所处理的行数记录下来。

FOUND_ROWS() 则取到了这个纪录。

虽然也是两个语句,但是只执行了一次主查询,所以效率比原来要高很多。

SELECT语句中经常可能用LIMIT限制返回行数。有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句。那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:

SELECT SQL_CALC_FOUND_ROWS * FROM 表名 WHERE id > 100 LIMIT 10;

SELECT FOUND_ROWS();

第二个SELECT将返回第一条SELECT如果没有LIMIT时返回的行数。

WARNING

  1. 如果在前一条语句中没有使用SQL_CALC_FOUND_ROWS选项,FOUND_ROWS()将返回前一条语句实际返回的行数。

  2. FOUND_ROWS()得到的数字是临时的,执行下一条语句就会失效。如果想要这个数字,就要将它保存下来:

SELECT SQL_CALC_FOUND_ROWS * FROM ... ;

SET @rows = FOUND_ROWS();
  1. 如果使用 SELECT SQL_CALC_FOUND_ROWSMySQL必须计算所有结果集的行数。尽管这样,总比再执行一次不使用LIMIT的查询要快多了,因为结果集不需要返回客户端。

  2. 当你想要限制查询的返回行数的同时又想得到查询的完整结果集合的行数,但又不想重复执行一次查询,那么SQL_CALC_FOUND_ROWS and FOUND_ROWS() 是非常有用的!

inner join 内连接查询

INNER JOIN(内连接:inner可以省略),也称为自然连接。与select a.* , b.* from 表a, 表b where a.id = b.id 等效,也是内连接(推荐使用join)

WARNING

内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。

学生表信息(Students):

ID Name Age City MajorID
101 Tom 20 Beijing 10
102 Lucy 18 Shanghai 11

专业信息表(Majors):

ID Name
10 English
11 Computer
SELECT Students.ID,Students.Name,Majors.Name AS MajorName FROM Students INNER JOIN Majors ON Students.MajorID = Majors.ID

查询结果:

ID Name MajorName
101 Tom English

LEFT JOIN(左连接)查询

结果集保留左表的所有行,但只包含第二个表与第一表匹配的行。第二个表相应的空行被放入NULL值。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFT JOIN Majors
ON Students.MajorID = Majors.ID

查询结果:

ID Name MajorName
101 Tom English
102 Lucy Null

right join (右连接)查询

右外连接保留了第二个表的所有行,但只包含第一个表与第二个表匹配的行。第一个表相应空行被入NULL值。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students RIGHT JOIN Majors
ON Students.MajorID = Majors.ID

查询结果:

ID Name MajorName
101 Tom English
Null Null Computer

FULL JOIN (全外连接)查询

会把两个表所有的行都显示在结果表中

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students FULL JOIN Majors
ON Students.MajorID = Majors.ID

查询结果:

ID Name MajorName
101 Tom English
102 Lucy Null
Null Null Computer

cross join(交叉连接)查询

交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。 简单查询两张表组合,这是求笛卡儿积,效率最低。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors

查询结果:

ID Name MajorName
101 Tom English
102 Lucy English
101 Tom Computer
102 Lucy Computer
上次更新时间: 2020-03-24 20:27:00