MySQL 基础(一)- 查询语句

SQL是什么?MySQL是什么?

SQL是结构化查询语言(Structured Query Language)的缩写,是一种专门用来与数据库通信的语言

MySQL是一种DBMS(数据库管理系统),即它是一种数据库软件

查询语句 SELECT FROM

  • 语句解释:
    SELECT prod_name, prod_id 
    FROM products;
    是指从products中检索一个名为 prod_name 和 prod_id 的列;
  • 去重语句:
    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种注释风格:

  1. ‘#’字符;
  2. ‘-- ’符号;
  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代码规范

 


 

项目一:查找重复的电子邮箱(难度:简单)

创建 email表,并插入如下三行数据

Id Email
1 [email protected]
2 [email protected]
3 [email protected]

编写一个 SQL 查询,查找 email 表中所有重复的电子邮箱。

根据以上输入,你的查询应返回以下结果: 

Email
[email protected]

说明:所有电子邮箱都是小写字母。

1. 直接用Navicat创建email表

2.因为MySQL中不止一个数据库,在进行下一步时,需要指定所用到的数据库,email表存放在new_schema中

USE new_schema

接着系统显示 Database changed

MySQL 基础(一)- 查询语句

3.查询代码

SELECT Email 
  FROM (SELECT Email, COUNT(*) AS Num FROM email GROUP BY Email Having Num > 1) AS table_alias;

结果如下 :

MySQL 基础(一)- 查询语句

注意,当我用以下代码时,即未给派生表别名时,会报错。

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);

MySQL 基础(一)- 查询语句

       做这道题目收获是:以往,我一直以为WHERE条件中的字段必须出现在SELECT中,做了这道题,可以知道SELECT 的字段是要在表格展示的字段,虽然gdp在表中未展示,但是仍然可以用在where中。