点击蓝字“程序员考拉”欢迎关注!
一.FROM子句
1.新建一个database EXTRA,在EXTRA中新建一个表CITIES.
如果一个表表达式包含FROM子句,处理过程从这个子句开始。
2.FROM子句中的表指定。
当前数据库是EXTRA,显示MOVIE数据库中的GENRE表的所有数据。
3.FROM子句中的列指定。
当前数据库是EXTRA,显示MOVIE数据库中的GENRE表genre_name列。
4.FROM子句中的多个表指定。
如果想要在结果表中显示来自不同表的数据,必须在FROM子句中指定多个表。并且如果想要显示不同表中的相同名字的列,必须在列之前指定对应的表。
5.FROM子句的子查询
FROM子句后面的子查询为一个中间结果的表,必须加AS 表名的简称,否则报错:Every derived table must have its own alias.
6.表的链接
不同列的数据组合到一个表中。
内链接
隐式链接:
SELECT TEAMNO,NAME
FROM TEAMS,PLAYERS
WHERE TEAMS.PALYERNO=PLAYERS.PLAYERNO
显式链接:
SELECT TEAMNO,NAME
FROM TEAMS INNER JOIN PLAYERS
ON TEAMS.PALYERNO=PLAYERS.PLAYERNO
外链接
左外链接:
SELECT PLAYERS.PLAYERNO,NAME,AMOUNT
FROM PLAYERS LEFT OUTER JOIN PENALITIES
ON PLAYERS.PLAYERNO=PENALITIES.PLAYERNO
ORDER BY PLAYERS.PLAYERNO
使用左外链接,左表的所有链接都出现在FROM子句的中间结果中。
右外链接:
SELECT PLAYERS.PLAYERNO,NAME,AMOUNT
FROM PENALITIES RIGHT OUTER JOIN PLAYERS
ON PLAYERS.PLAYERNO=PENALITIES.PLAYERNO
ORDER BY PLAYERS.PLAYERNO
与左外链接相似,右表的所有链接都出现在FROM子句的中间结果中。
二.WHERE子句
在WHERE子句中,使用一个条件从FROM子句的中间结果中选取行,这些选取的行构成了WHERE子句的中间结果。WHERE子句相当于一个中间过滤器,它过滤了条件不为true的行。
1.子查询
在处理主查询之前,它会处理子查询,然后把中间的结果传递给主查询。
2.不带比较比较运算符的条件
mysql中,false值用0来表示,其他值都代表true。
获取球队号不等于0的球队:
SELECT TEAMNO FROM TEAMS WHERE TEAMNO-1
3.IN运算符
如果查看一个指定的值是否出现在一个很长的给定值的列表中,这个条件会变得很长,就要用到IN运算符。
对于那些有两局获胜或两局输掉的比赛,获取比赛号码,获胜的局数和输掉的局数:
SELECT MATCHNO,WON,LOST FROM MATCHES WHERE 1 IN (WON,LOST)
找出居住在北京,南京,上海或杭州的每个球员的号码,名字和城市:
SELECT PLAYERNO,NAME,TOWN FROM PLAYERS WHERE TOWN IN ('北京','南京','上海','杭州')
4.BETWEEN运算符
确定一个值是否在给定的范围内。
获取赢得的和输掉的局数之和等于2,3,或4 的比赛号码:
SELECT MATCHNO FROM MATCHES WHERE WON+LOST BETWEEN 2 AND 4
5.LIKE运算符
LIKE运算符使用一种特殊的模式和掩码来选择字符值,用来查找一段文本中的字符串。
“%”表示0个,1个或多个字符。
找出名字以B开头的球员的号码和所在队伍的号码:
SELECT PLAYERNO,MATCHNO FROM PLAYERS WHERE NAME LIKE 'B%'
获取名字以小写字母r结尾的球员的名字和号码:
SELECT NAME,PLAYERNO FROM PLAYERS WHERE NAME LIKE '%r'
获取名字中包含小写字母r的球员的名字和号码:
SELECT NAME,PLAYERNO FROM PLAYERS WHERE NAME LIKE '%e%'
6.REGEXP运算符
正则表达式运算符,用来查找一段文本中的字符串。
获取名字以’ba’开头的球员的名字和号码:
SELECT NAME,PLAYERNO FROM PLAYERS WHERE NAME REGEXP '^ba'
对于名字以自己所居住的街道名字的第一个字母作为结尾的球员,获得其名字,所居住的街道和号码:
SELECT NAME,STREET,PLAYERNO FROM PLAYERS WHERE NAME REGEXP CONCAT(SUBSTR(STREET,1,1),'$')
》SUBSTR(STR,POS,LENGTH)–SUBSTR(被截取字段,从第几位开始截取,截取长度)
》CONCAT(STR1,STR2..)返回结果为连接参数产生的字符串,如有任何一个STR为NULL,则结果为NULL。
获取包含了字母a,b或c的每个球员的名字和号码:
SELECT NAME,PLAYERNO FROM PLAYERS WHERE NAME REGEXP '[abc]'
对于名字模式由m.n的每个玩家,获取其名字和号码,点可以是任意单个字符:
SELECT NAME,PLYERNO FROM PLAYERS WHERE NAME REGEXP 'm.n'
对于名字中有men三个字母中的一个,且这种情况连续出现两次,获取球员的名字和号码:
SELECT NAME,PLAYERNO FROM PLAYERS WHERE NAME REGEXP '[men][men]'
获取邮政编码中以3作为第三个字母的球员的号码和邮政编码:
SELECT PALYERNO,POSTCODE FROM PLAYERS WHERE POSCODE REGEXP '^[0-9][0-9]3'
获取所居住的街道以St开始并且以Road结尾的每个球员所居住的街道和号码:
SELECT STREET,PLAYERNO FROM PLAYERS WHERE STREET REGEXP '^St.*Road$'
找出邮政编码包含一个或多个数字后面跟着一个或多个字母的每个球员的号码和邮政编码:
SELECT PLAYERNO,POSTCODE FROM PLAYERS WHERE POSCODE REGEXP '[0-9]+[A-Z]+'
》”+”表示一个或多个字符
获取名字不以A到M之间的大写字母开头的每个球员的名字和号码:
SELECT NAME,PLAYERNO FROM PLAYERS WHERE NAME REGEXP '^[^A-Z]'
获取名字由7个字母或更多字母组成的每个球员的名字和号码:
SELECT NAME,PLAYERNO FROM PLAYERS WHERE NAME REGEXP '^[a-z]{7}'
获取名字不以A到M之间的大写字母开头的每个球员的名字和号码:
SELECT NAME,PLAYERNO FROM PLAYERS WHERE NAME REGEXP '^[^A-M]'
7.MATCH运算符
用来查找一个文本片段中的单词。
创建TABLE表:
CREATE TABLE BOOKS(
BOOKNO INTEGER NOT NULL PRIMARY KEY,
AUTHORS TEXT NOT NULL,
TITLE TEXT NOT NULL,
YEAR_PUBLICTION YEAR NOT NULL,
SUMMARY TEXT NOT NULL
)
ENGINE=MyISAM
在CREATE TABLE中必须声明ENGINE=MyISAM,否则不能使用MATCH运算符。
为了能够在指定的列上使用MATCH运算符,(MATCH(列))必须在指定的列上定义一个特殊的索引:
CREATE FULLTEXT INDEX INDEX_TITLE ON BOOKS(TITLE)
CREATE FULLTEXT INDEX INDEX_SUMMARY ON BOOKS(SUMMARY)
获取书名中包含单词database的图书的号码和书名:
SELECT BOOKNO,TITLE FROM BOOKS WHERE MATCH(TITLE) AGAINST ('database')
对于distributed出现在内容提要中的图书,获取其编号和相关性值:
SELECT BOOKNO,MATCH(SUMMARY) AGAINST('distributed') FROM BOOKS
8.IS NULL运算符
选取在指定列中没有值的行。
选取联盟会员号码不等于8467的每个球员的名字,号码和联盟会员号码:
SELECT NAME,PALYERNO,LEAGUENO FROM PLAYERS WHERE LEAGUENO '8467' OR LEAGUENO IS NULL
9.EXISTS运算符
EXISTS运算符可以将主查询和子查询连接起来。
获取不是队长的球员的名字和首字母:
SELECT NAME,INITIALS FROM PLAYERS WHERE NOT EXITS(SELECT * FROM TEAMS WHERE PLAYERNO=PLAYERS.PLAYERNO)
10.ALL运算符
获取最老的球员的号码,名字和生日,最老的球员是出生日期小于或等于其他球员的球员:
SELECT PLAYERNO,NAME,BIRTHDATE FROM PLAYERS WHERE BIRTHDATE = ALL(SELECT BIRTHDATE FROM PLAYERS)
给出最大的联盟会员以及相应的球员编号:
SELECT LEAGUENO,PLAYERNO FROM PLAYERS WHERE LEAGUENO = ALL(SELECT LEAGUENO FROM PLAYERS)
11.带有否定的条件
所查找的列不包含一个列中的指定的值,这样的条件叫做带有否定的条件。可以通过在肯定条件前放置not来实现。
获取没有居住在北京的球员的号码和名字: