mysql语法太难记住了_MYSQL语法实例(仅学习)

MySQL是一种DBMS,data base management system,数据库软件,基于客户机-服务器运行

Navicat For MySQL:一款简单好用的数据库可视化软件。

SQL:structured query language,结构化查询语句,专门用来与数据库通信

一、检索数据

| YR | CITY | CONTINENT | | ---- | ------- | ------------- | | 2000 | Sydney | Australia | | 2004 | Athens | Europe | | 2008 | Beijing | Asia | | 2012 | London | Europe | | 2016 | Rio | South America |

SELECT cityFROM games;#限制查询的数量SELECT cityFROM gamesLIMIT 3;#限制查询位置SELECT cityFROM gamesLIMIT 2,2; #指示MySQL返回从行2开始的2行,第一个数为开始的位置,第二个位置为要检索的行数

注:SQL不区分大小写,但对SQL关键字使用大写,对所有列、表名使用小写,这样方便代码阅读和调试。

二、排序检索

1.按字母顺序排列

SELECT cityFROM gamesORDER BY city;

2.按指定方向排列

SELECT yr,cityFROM gamesORDER BY yr DESC; #降序排列

3.寻找最近一届奥运会的举办年份、城市和所在大陆?

SELECT yr,city,continentFROM gamesORDER BY yr DESCLIMIT 1;

三、过滤数据

搜索条件(search criteria),也称为过滤条件(filter condition)

SELECT *FROM gamesWHERE city='Beijing';

常见的 WHERE 子句操作符:

# = 等于 <>不等于 !=不等于 ==大于等于 BETWEEN...AND两者之间 IS NULL检索NULL值

用在 WHERE 子句的逻辑操作符:AND

OR

IN

NOT IN

LIKE

通配符:%通配符代表搜索模式中给定位置的0个、1个或多个字符

_通配符只能匹配单个字符而不是多个字符

注:

- 搜索字段里包含单引号,可以用双引号代替

四、使用函数处理数据

SELECT COUNT(city)FROM gamesGROUP BY continent;#LEFT(s,n) 从字符串s左侧开始截取n个字符>>LEFT('Hello world',4)'Hell'#RIGHT(s,n) 从字符串s右侧开始截取n个字符>>RIGHT('Hello world',4)'orld'#CASE 不同条件返回不同的值,如果所有条件都不允许返回NULLSELECT name,population,

CASE WHEN population<1000000 THEN 'small'

WHEN populaiton<10000000 THEN 'medium'

ELSE 'large'

ENDFROM world;#COALESCE 返回首个不是空值的参数COALESCE(x,y,z) = x if x is not NULLCOALESCE(x,y,z) = y if x is NULL and y is not NULLCOALESCE(x,y,z) = z if x is NULL and y is NULL and z is not NULLCOALESCE(x,y,z) = NULL if x and y and z are all NULL#CONCAT 连接两个或多个字符串>>CONCAT('data',' ','analysis')'data analysis'#TRIM(s) 移除字符串收尾部位的空格>>TRIM('Hello world ')'Hello world'

SQLZOO练习

一、SELECT基础

主要考察WHERE 语句的使用:IN、LIKE、BETWEEN...AND、DISTINCT

SELECT 语句的运算:area*3、population/area、len(name)

二、SELECT world表

主要考察SELECT 语句的运算:gap/population, ROUND函数

WHERE 语句的使用:IN、OR、XOR、LEFT函数

三、SELECT nobel表

难题1:Show the 1984 winners and subject ordered by subject and winner name; but list Chemistry and Physics last.

解析:难在第二句话,如何把化学奖和物理学奖放在最后。再把问题分解,我们可以实现把化学奖和物理学奖单独提取出来,但是如何不改变原始数据只变动顺序?

解决:subject IN ('Chemistry','Physics') 其实有返回值0或1,可以利用这个返回值排序。

SELECT winner, subjectFROM nobelWHERE yr=1984ORDER BY subject IN ('Chemistry','Physics'),subject,winner

难题2:Pick the code that shows the amount of years where no Medicine awards were given. 没有颁发医学奖的年数。

解析:首先有几个坑。1)没有颁发医学奖,如果只是用WHERE subject !='Medicine' ,那么极有可能把所有年份都拎出来了,因为不可能某一年的诺贝尔奖什么奖都没发(包括医学奖)。2)因为每年颁很多奖,筛选出来的年份极有可能重复。

解决:逆向思维,既然无法干净利索地把没有办法医学奖的年份挑出来,那么可以把获得医学奖的年份拿出来,再进行排除(这样我们只要在yr 这一个列中操作)

SELECT COUNT(DISTINCT yr)FROM nobelWHERE yr NOT IN (SELECT DISTINCT yr FROM nobel WHERE subject='Medicine');

四、SELECT嵌套

主要考察SELECT嵌套在 WHERE 语句中

SELECT嵌套在 SELECT 语句中

# 查找全球人口最多的国家SELECT name,populaitonFROM worldWHERE population >= ALL(SELECT population FROM world WHERE population>0)# 查找每个洲面积最大的国家SELECT continent,name,areaFROM world xWHERE area >= ALL(SELECT area FROM world y WHERE x.continent=y.continent AND area>0)# 查找每个洲字母排序第一的国家SELECT continent,nameFROM world xWHERE name <= ALL(SELECT name FROM world y WHERE x.continent=y.continent)# 查找所有国家人口都小于2500万的大洲及其国家SELECT continent,name,populationFROM world xWHERE 25000000 >= ALL(SELECT population FROM world y WHERE x.continent=y.continent)# 查找同一个大洲内,GDP是其他所有国家三倍的国家SELECT name, continentFROM world xWHERE gdp >= (SELECT gdp*3 FROM world y WHERE x.continent=y.continent AND x.name!=y.name)# 查找欧洲国家及其人口,其中人口以占德国人口的百分比展示SELECT name, CONCAT(ROUND(population*100/(SELECT populaiton FROM world WHERE name='Germany')),'%') AS populationFROM worldWHERE continent='Europe'

五、SUM 和 COUNT函数

主要考察SUM函数、COUNT函数在 WHERE 语句中的使用

HAVING 语句的使用

# 查找总人口超过一亿的大洲SELECT continentFROM worldGROUP BY continentHAVING sum(population) > 100000000

六、JOIN操作

JOIN两张表 SELECT * FROM table1 JOIN table2 ON id1=id2

# 查找在对战德国的比赛中进球的球员SELECT DISTINCT playerFROM game JOIN goal ON matchid=idWHERE (team1='GER' OR team2='GER') AND teamid!='GER';# 列出有波兰队参赛的比赛时间和进球数量SELECT matchid, mdate, COUNT(player) AS goalFROM game JOIN goal ON matchid=idWHERE (team1='POL' OR team2='POL')GROUP BY mdate,matchid;# 列出每场球各球队进球的数量SELECT mdate, team1, SUM(CASE WHEN teamid=team1 THEN 1 ELSE 0 END) score1, team2, SUM(CASE WHEN teamid=team2 THEN 1 ELSE 0 END) score2FROM game JOIN goal ON matchid=idGROUP BY mdate,matchid,team1,team2;# 列出在Stadion Miejski (Wroclaw)球馆比赛并进球的球员、队名、进球时间(对阵意大利队除外)SELECT DISTINCT player, teamid, gtimeFROM game JOIN goal ON matchid=idWHERE stadium = 'Stadion Miejski (Wroclaw)' AND ((teamid=team1 AND team2!='ITA') OR (teamid=team2 AND team1!= 'ITA'))

七、更多JOIN操作

JOIN三张表

# 查找John Travolta出演超过2部电影的年份和电影数SELECT yr,COUNT(title)FROM movie JOIN casting ON movie.id=movieid JOIN actor ON actorid=actor.idWHERE name='John Travolta'GROUP BY yrHAVING COUNT(title)>2# 列出有Julie Andrews参演的电影的名字和主角# 不同于由Julie Andrews主演的电影名称SELECT title, actor.nameFROM movie JOIN casting ON movie.id=movieid JOIN actor ON actorid=actor.idWHERE movieid IN (SELECT movieid FROM castingWHERE actorid IN (

SELECT id FROM actor

WHERE name='Julie Andrews')) AND ord=1

八、活用NULL值IS NULL

INNER JOIN 会过滤掉包含NULL值的列

OUTER JOIN 左右都管

LEFT JOIN 管左不管右

RIGHT JOIN 管右不管左

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值