MySQL 基础(一)- 查询语句
SQL是什么?MySQL是什么?
SQL是结构化查询语言(Structured Query Language)的缩写,是一种专门用来与数据库通信的语言。
MySQL是一种DBMS(数据库管理系统),即它是一种数据库软件。
查询语句 SELECT FROM
- 语句解释:
是指从products中检索一个名为 prod_name 和 prod_id 的列;SELECT prod_name, prod_id FROM products;
- 去重语句:
SELECT DISTINCT vend_id FROM products;
SELECT DISTINCT vend_id 告诉MySQL只返回不同(唯一)的vend_id行。
- 前N个语句
SELECT prod_name FROM products LIMIT 5;
为了返回第一行或前几行剁使用LIMIT子句;LIMIT 5,5 指示MySQL返回从行5开始的5行,第一个数为开始位置,第二个数为检索的行数;检索出来的第一行为0而不是1;
- CASE...END判断语句
-
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 WHEN 条件3 THEN 结果3 WHEN 条件N THEN 结果N END
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ELSE 其他 END
- 筛选语句 WHERE 语句解释
SELECT prod_name, prod_price FROM produces WHERE prod_price = 2.50;
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出
- WHERE子句运算符/通配符/操作符
操作符
操作符 | 说明 |
= |
等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= |
小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
通配符,是用来匹配值的一部分的特殊字符。
通配符 | 说明 |
% | 在搜索串中,表示任何字符出现任意次数 |
_ | 用途与%一样,但下划线只匹配单个字符而不是多个字符 |
[charlist] |
字符列中的任何单一字符 |
[!charlist] 或 [^charlist] | 不在字符列中的任何单一字符 |
运算符,限于篇幅,这篇文章讲的比较详细
分组语句 GROUP BY
- 聚集函数,是指从多个输入行中计算出一个结果,如,我们有在一个行集合上计算 count(数目), sum(和),avg(均值), max(最大值)和min(最小值)的函数。
SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM Products
- 语句解释,分组允许把数据分为多个逻辑组,以便能对每个组进行聚焦计算。
SELECT ven_id, count(*) AS num_prods FROM products GROUP BY vend_id;
GROUP BY 字句指示MySQL按vend_id 排序并分组数据,这导致对每个vend_id而不是整个表计算num_prods一次。
- HAVING子句,WHERE过滤行,HAVING过滤分组;WHERE在数据分组进行过滤,HAVING在数据分组后进行过滤。HAVING 支持所有WHERE的操作符。
SELECT cust_id,COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;
排序语句 ORDER BY
- 语句解释, 排序产生的输出
SELECT order_num, SUM(quantity*item_price) AS ordertotal FROM orderitems GROUP BY order_num HAVING SUM(quantity*item_price) >= 50 ORDER BY ordertotal;
- 正序、逆序,DESC表示降序,ASC表示升序,默认升序。
- 函数 时间函数 数值函数 字符串函数,菜鸟教程有详细讲解。
SQL注释,支持3种注释风格:
- ‘#’字符;
- ‘-- ’符号;
- '/*balabala*/',允许注释跨越多行
mysql> SELECT 1+1; # This comment continues to the end of line
mysql> SELECT 1+1; -- This comment continues to the end of line
mysql> SELECT 1 /* this is an in-line comment */ + 1;
mysql> SELECT 1+
/*
this is a
multiple-line comment
*/
1;
SQL代码规范
- [SQL编程格式的优化建议] SQL编程格式的优化建议 - 知乎
- [SQL Style Guide] SQL style guide by Simon Holywell
项目一:查找重复的电子邮箱(难度:简单)
创建 email表,并插入如下三行数据
Id | |
1 | [email protected] |
2 | [email protected] |
3 | [email protected] |
编写一个 SQL 查询,查找 email 表中所有重复的电子邮箱。
根据以上输入,你的查询应返回以下结果:
[email protected] |
说明:所有电子邮箱都是小写字母。
1. 直接用Navicat创建email表
2.因为MySQL中不止一个数据库,在进行下一步时,需要指定所用到的数据库,email表存放在new_schema中
USE new_schema
接着系统显示 Database changed
3.查询代码
SELECT Email
FROM (SELECT Email, COUNT(*) AS Num FROM email GROUP BY Email Having Num > 1) AS table_alias;
结果如下 :
注意,当我用以下代码时,即未给派生表别名时,会报错。
SELECT Email
FROM (SELECT Email, COUNT(*) AS Num FROM email GROUP BY Email Having Num > 1);
报告内容为:ERROR 1248 (42000): Every derived table must have its own alias
这句话的意思是说每个派生出来的表都必须有一个自己的别名
项目二:查找大国(难度:简单) 创建如下
name | continent | area | population | gdp |
Afghanistan | Asia | 652230 | 25500100 | 20343000 |
Albania | Europe | 28748 | 2831741 | 12960000 |
Albania | Europe | 28748 | 2831741 | 12960000 |
Albania | Europe | Europe | 2831741 | 12960000 |
Albania | Europe | 28748 | 2831741 | 12960000 |
如果一个国家的面积超过300万平方公里,或者(人口超过2500万并且gdp超过2000万),那么这个国家就是大国家。 编写一个SQL查询,输出表中所有大国家的名称、人口和面积。 例如,根据上表,我们应该输出:
name | population | area |
Afghanistan | 25500100 | 652230 |
Algeria | 37100000 | 2381741 |
1-2步与上相同;
3.查询代码
SELECT name, population, area
FROM World
WHERE (area > 3000000) OR (population > 25000000 and gdp > 20000000);
做这道题目收获是:以往,我一直以为WHERE条件中的字段必须出现在SELECT中,做了这道题,可以知道SELECT 的字段是要在表格展示的字段,虽然gdp在表中未展示,但是仍然可以用在where中。