SQL基础语法总结(基于sqlzoo练习)
https://sqlzoo.net/wiki/SELECT_from_WORLD_Tutorial
基础查询结构
SELECT 列名1, 列名2 AS 别名FROM 表名WHERE 条件;1. SELECT 和 FROM
-
定义:
SELECT用于指定要查询的列,FROM用于指定要查询的表。 -
使用条件:每个查询都必须包含
SELECT和FROM。 -
示例:
SELECT name, population -- 选择特定列SELECT * -- 选择所有列SELECT area*2 AS doubled_area -- 计算并命名2. WHERE
-
定义:
WHERE用于过滤记录,只有满足条件的记录才会被返回。 -
使用条件:放在
FROM子句之后,可以配合比较运算符(=, <>, >, <等)和逻辑运算符(AND, OR, NOT)使用。 -
示例:
SELECT name FROM world WHERE population > 100000000;3. LIKE 和 通配符 %
-
定义:
-
LIKE用于模式匹配,常与通配符结合使用。 -
%代表任意长度的任意字符(包括0个字符)。 -
使用条件:当需要模糊匹配字符串时使用。注意:
LIKE是大小写敏感的,某些数据库可能需要使用函数(如LOWER)来忽略大小写。 -
示例:
-- 匹配以'Al'开头的国家
SELECT name FROM world WHERE name LIKE 'Al%';
-- 匹配包含'united'的国家(不区分大小写)
SELECT name FROM world WHERE LOWER(name) LIKE '%united%';4. LENGTH
-
定义:返回字符串的字符长度(字符数)。
-
使用条件:需要获取字符串长度时使用。注意:在MySQL中,
LENGTH返回字节数,而CHAR_LENGTH返回字符数。在其他数据库中(如PostgreSQL),LENGTH返回字符数。 -
示例:
SELECT name, LENGTH(name) AS name_length FROM world;WHERE LENGTH(capital) > 105. ROUND
-
定义:用于对数值进行四舍五入。
-
使用条件:需要控制数值的小数位数时使用。可以指定保留的小数位数(正数表示小数位,负数表示整数位)。
-
示例:
-- 将人均GDP四舍五入到整数
SELECT name, ROUND(gdp/population) AS per_capita_gdp FROM world;
-- 将面积四舍五入到千位(精确到千)
SELECT name, ROUND(area, -3) AS area_rounded FROM world;6. LEFT
-
定义:从字符串左侧开始提取指定数量的字符。
-
使用条件:需要提取字符串的前缀时使用。
-
示例:
-- 提取国家名称的前3个字符
SELECT name, LEFT(name, 3) AS prefix FROM world;7. 比较运算符:<> 和 !=
-
定义:两者都表示“不等于”。
<>是标准SQL运算符,!=是非标准但广泛支持的运算符。 -
使用条件:比较两个值是否不相等。可以用于数值、字符串、日期等。
-
注意:比较时注意大小写敏感问题,以及NULL值(NULL与任何值比较都返回NULL,需要使用
IS NULL或IS NOT NULL)。 -
示例:
-- 排除欧洲国家
SELECT name FROM world WHERE continent <> 'Europe';
-- 排除人口为0的国家
SELECT name FROM world WHERE population != 0;8. 逻辑运算符:AND 和 OR
例题:早期医学奖与后期文学奖
题目:
展示1910年前(不含1910)的医学奖得主和2004年后(含2004)的文学奖得主的年份、奖项和姓名。
SQL语句:
SELECT yr, subject, winner
FROM nobel
WHERE
(subject = 'Medicine' AND yr < 1910) -- 条件组A:早期医学奖
OR -- 逻辑或
(subject = 'Literature' AND yr >= 2004) -- 条件组B:后期文学奖解释:
-
条件组A:
subject = 'Medicine' AND yr < 1910筛选出1910年前的医学奖。 -
条件组B:
subject = 'Literature' AND yr >= 2004筛选出2004年及以后的文学奖。 -
用 OR 连接这两组条件,表示满足任意一组条件的记录都会被选中。
9. AS(别名)
-
定义:为列或表指定临时名称(别名),使结果更易读。
-
使用条件:在
SELECT子句中为列重命名,或在FROM子句中为表指定别名(简化引用)。 -
示例:
-- 为列指定别名
SELECT name AS country, population AS pop FROM world;
-- 为表指定别名(用于自连接或多表查询)
SELECT w.name, w.continent FROM world AS w;10. IN
-
核心功能: 筛选匹配多个值的数据
-
IN 的语法:
SELECT 列名1, 列名2, ...FROM 表名WHERE 列名 IN (值1, 值2, 值3, ...);-
WHERE 列名 IN (...): 这是关键部分。它告诉数据库:“请找出列名的值等于括号(...)中列出的任何一个值的那些行” -
(值1, 值2, 值3, ...): 这是一个你指定的值列表。这些值可以是:-
数字:
WHERE StudentID IN (1001, 1005, 1010) -
文本(字符串):
WHERE City IN ('北京', '上海', '广州')(注意:字符串必须用单引号''括起来!) -
日期:
WHERE OrderDate IN ('2023-10-01', '2023-11-11')(日期格式取决于数据库) -
列表中的值用逗号
,分隔。
-