# 8 月 12 日
# 基础查询语法
SELECT * FROM world
(输出整个 world 表格)
SELECT name , gdp FROM world WHERE population >5000000
(输出表格 world 中的 name 和 gdp 两列,筛选条件是 population 数量大于五百万)
SELECT name FROM world
WHERE name LIKE 'C%ia'
(输出表格 world 中的 name 一列,筛选条件是名称由 C 开头,ia 结尾)
% 是万能占位符,可以代表一个或多个字符,比如 “% d” 就是代表所有结尾是字母 d 的单词
同时,"__" 下划线也是万能占位符,表示一个字符,比如 “% o__o%” 代表所有包含 o 什么什么 o 这四个字母的单词
多重筛选
美國、印度和中國 (USA, India, China) 是人口又大,同時面積又大的國家。排除這些國家。
顯示以人口或面積為大國的國家,但不能同時兩者。顯示國家名稱,人口和面積
SELECT name, population ,area
FROM world
WHERE area >3000000 AND population <250000000
OR area<3000000 AND population>250000000
因为 AND 的优先级高于 OR,所以会先运算 AND 再运算 OR,正好可以筛选出来只符合两个条件中一个的国家
# ROUND 函数:
ROUND(1000.22222,2)
输出为: 1000.22 在 mysql 中是四舍五入到两位小数,但是别的数据库系统可能是直接截取到两位小数
如果想保留一千为单位的整数,例如本来是 123300,编程 123000,你可以使用
ROUND(float,-3)
如果 3 表示保留三位小数(千分位),那么 - 3 是不是就代表千位呢?(我真聪明)
或者可以用数学的办法
ROUND(gdp/population/1000,0)* 1000 AS THOGPP
gdp/population :计算人均 gdp
ROUND(gdp/population/1000,0) 人均 GDP 除以一千保留整数
ROUND(gdp/population/1000,0)* 1000 人均 GDP 保留千位数
最后随便命了个名,起名为千 G 每人 :THOusand Gdp Per Person 抽象
SQL 报错又找不到问题的时候,想一想有没有少用括号或者用中文的字符
# 8 月 14 日
SELECT yr,subject,winner
FROM nobel
WHERE (yr between 1980 AND 1989 )AND (subject = 'literature')
- 上面 sql 指令的意思是,罗列出 1980 年至 1989 年诺贝尔文学奖的年份,学科和获奖人
between 并没有左闭右开之类,直接说什么就是什么。爽
WHERE subject NOT IN (‘literature’,‘peace’)
WHERE NOT subject IN (‘literature’,‘peace’)
上面两行代码具有相同的效力,但是意思不完全相同
第一行是说,subject 不在 文学奖或和平奖里
第二行是说,否定了 subject 在文学奖或者和平奖里
# 非 ascll 编码
- 好烦。看不懂维基百科上的介绍
- 太好了直接复制粘贴就可以
# 字符串中带单引号
EUGENE O'NEILL 这是一个诺贝尔奖获得者的名字,里面带一个单引号
表示方式一: name = ‘EUGENE O'’NEILL‘ (把字符串中的单引号变成两个单引号)
表示方式二: name =“EUGENE O'NEILL” (外边用双引号括起来)
# 排序
ORDER BY xx 以 xx 为条件排序,
ORDER BY year DESC 以年份为条件降序排序(显示最新的)
ORDER BY year DESC ,winner 以年份为条件降序排序,同年份的用获奖者名字排序 ORDER BY -year ,winner 和上面那句一样的效果
# 布尔值
subject in (‘literature’,‘chemistry’)算是一种布尔值,放到 select 语句中会生成一列 0 或者 1,判断这个诺贝尔奖获奖者的学科是不是属于化学或者物理。可以用这个来排序
ORDER BY
CASE WHEN subject IN (‘literature’,‘chemistry’)THEN 1
ELSE 0
因为 0 比 1 打,sql 默认升序排序,所以这个排序会把化学和物理的奖项排到输出列表的最后。
# 筛选这一块
- 题目要求筛选出:物理学和化学没有颁诺贝尔奖的年份
SELECT yr FROM nobel
WHERE subject NOT IN(SELECT subject
FROM nobel
WHERE subject IN ('Chemistry','Physics'))
乍一想挺对,想了很久也没发现问题,最后发现括号里选出来的是 subject 的列,后面根本就没法再让 year 选了
正确答案是:
SELECT yr FROM nobel
WHERE yr NOT IN(SELECT yr
FROM nobel
WHERE subject IN ('Chemistry','Physics'))
# 表格中的两个属性相等,直接写就行
SELECT name, capital
FROM world
WHERE LEFT(name,1)=LEFT(capital,1)
AND NOT name = capital
- 这串代码的含义是选出所有国家名字首字母和首都首字母相同的,但是排除首都和国家名字一样的
直接 name=capital 就是代表着国家名字的字符串和首都的字符串一样 - 其中的 LEFT 函数可以读取字符串的左起几个字母
比如 LEFT(‘name',2)的意思是输出‘name’这个字符串的前两个字母
# LIMIT
题目:以大洲的名字排序,再以国家名字在每个洲内排序,最后每个洲只保留第一个国家
SELECT name
FROM world
ORDER BY continent
# 保留整数
CAST (float AS INT)把一个浮点数直接砍成整数
CAST (ROUND (float,3) AS INT) 把一个浮点数四舍五入保留三位小数之后砍成整数