MYSQL数据库 初学笔记3-SELECT

1、SELECT:

SELECT 
    column_1, column_2, ...
FROM
    table_1
[INNER | LEFT |RIGHT] JOIN table_2 ON conditions
WHERE
    conditions
GROUP BY column_1
WITH ROLLUP
HAVING group_conditions
LIMIT offset, length;
SELECT语句由以下列表中所述的几个子句组成:
SELECT之后是逗号分隔列或星号(*)的列表,表示要返回所有列。
FROM指定要查询数据的表或视图。
JOIN根据某些连接条件从其他表中获取数据。
WHERE过滤结果集中的行。
GROUP BY将一组行组合成小分组,并对每个小分组应用聚合函数。
HAVING过滤器基于GROUP BY子句定义的小分组。
ORDER BY指定用于排序的列的列表。
LIMIT限制返回行的数量。
with rollup 对分类聚合后的结果进行再汇总
union 和union all
语句中的SELECT和FROM语句是必须的,其他部分是可选的。

①、建议显式获取数据的列,原因如下:使用星号(*)可能会返回不使用的列的数据。 它在MySQL数据库服####务器和应用程序之间产生不必要的I/O磁盘和网络流量。

如果明确指定列,则结果集更可预测并且更易于管理。 想象一下,当您使用星号(*)并且有人####通过添加更多列来更改表格数据时,将会得到一个与预期不同的结果集。

使用星号(*)可能会将敏感信息暴露给未经授权的用户。

②、JOIN:多表查询

JOIN 按照功能大致分为如下三类:
INNER JOIN(内连接,或等值连接)(在MYSQL中和JOIN等价):获取两个表中字段匹配关系的记录。
outer JOIN :外连接,选出其他不匹配的记录。分为左右连接。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

JOIN测试:

SELECT a.user_id FROM usertable a JOIN testtable b ON a.username = b.username;

等同于:用where

SELECT a.user_id FROM usertable a, testtable b WHERE a.username = b.username;

LEFT JOIN测试:MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
在使用left jion时,on和where条件的区别如下:

1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉

SELECT a.user_id ,a.username,b.score FROM usertable a LEFT JOIN testtable b ON a.username = b.username;

MYSQL数据库 初学笔记3-SELECT_第1张图片

③、WHERE:查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件,可以使用 AND 或者 OR 指定一个或多个条件,可以在 WHERE 子句中指定任何条件;子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令,子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。使用主键来作为 WHERE 子句的条件查询是非常快速的。

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....

MySQL 的 WHERE 子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。

④、GROUP BY:GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)参考1:例子说明WITH ROLLUP 参考2:例子2

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
SELECT username FROM usertable GROUP BY age;
SELECT username,COUNT(*) FROM usertable GROUP BY age;

⑤、HAVING:在SELECT语句中使用HAVING子句来指定一组行或聚合的过滤条件。HAVING子句通常与GROUP BY子句一起使用,以根据指定的条件过滤分组。如果省略GROUP BY子句,则HAVING子句的行为与WHERE子句类似。HAVING子句可以让我们筛选成组后的各组数据. WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前. 而 HAVING子句在聚合后对组记录进行筛选。

Select username,age  from usertable having age>25 AND username!='Joy';
但是
Select username  from usertable having age>25 AND username!='Joy';
会报错Unknown column 'age' in 'having clause'
说明条件字段必须在查询的字段中
但是where就不用

和where

Select username,age  from usertable where age>25 AND username!='Joy';
Select username from usertable where age>25 AND username!='Joy';#不会报错;

where和having的区别

请注意,HAVING子句将过滤条件应用于每组分行,而WHERE子句将过滤条件应用于每个单独的行。

⑥、OREDR BY: ORDER BY 子句将查询数据排序后再返回数据:你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。你可以设定多个字段来排序。你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。你可以添加 WHERE…LIKE 子句来设置条件。

SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]

升序排列按年龄大小

 SELECT username,age FROM usertable ORDER BY age ASC;

⑦、limit:对排序后的结果只显示一部分,不是全部。经常和order by 结合使用,实现分页效果。

SELECT...[LIMIT offset_start,row_count]
offset_start 是其实偏移量,row_count 是显示的行数

⑧、查询不重复的记录:distinct

⑨、union 和union all :union all 把两个表查询出来的结果合并在一起, union 把union all 合并出来的结果去重复。

2、SELECT 子查询:

子查询总结

MYSQL数据库 初学笔记3-SELECT_第2张图片

Select username from usertable where age>ANY(SELECT age from usertable);
Select username from usertable where age>=ALL(SELECT age from usertable);
Select username from usertable where age<=ALL(SELECT age from usertable);

用于子查询的关键字包括:in、not in、=、!=、exits、not exists等。

你可能感兴趣的:(MYSQL数据库)