# 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 默认升序排序,所以这个排序会把化学和物理的奖项排到输出列表的最后。