Sql核心语法—查询
0.创建数据库
一般创建数据库的语法:CREAT DATABASE “数据库名称”
具体创建,以及插入的语法链接:(待完成)
这里创建两个作业的TABLE
TABLE email
-- 创建表
CREATE TABLE email (
ID INT NOT NULL PRIMARY KEY,
Email VARCHAR(255)
)
-- 插入数据
INSERT INTO email VALUES('1','a@b.com');
INSERT INTO email VALUES('2','c@d.com');
INSERT INTO email VALUES('3','a@b.com');
TABLE World
-- 创建表
CREATE TABLE World (
name VARCHAR(50) NOT NULL,
continent VARCHAR(50) NOT NULL,
area INT NOT NULL,
population INT NOT NULL,
gdp INT NOT NULL
);
-- 插入数据
INSERT INTO World VALUES( 'Afghanistan', 'Asia',652230,25500100,20343000);
INSERT INTO World VALUES( 'Albania', 'Europe' ,28748,2831741,12960000);
INSERT INTO World VALUES( 'Algeria', 'Africa' ,2381741,37100000,188681000);
INSERT INTO World VALUES( 'Andorra' , 'Europe' ,468,78115,3712000);
INSERT INTO World VALUES( 'Angola' , 'Africa' ,1246700,20609294,100990000);
1. What is Sql
Sql:一种机器与数据库沟通的语言(相对其它语言,Sql语句较为简单)
任务:
- 从数据库中读写数据
优点:
- Sql几乎使用于所有DBMS,而不是某一个DBMS的特有语言,所以Sql几乎可以访问所有数据库
- Sql简单灵活,但是可以完成很复杂的任务
2.SELECT FROM
关键字: 一般为SQL的语法语句,关键字不能用来作表,列名。
SELECT:SQL语言中最重要的关键字(Keywords)
用法:
- SELECT 是SQL的检索语法,SELECT后面跟的是想要检索的列名,可以跟多个列用“,”来分开,当SELECT后面跟"*" (通配符) 作为一个通配符出现的时候则代表所有列。FROM后面跟的是被检索的表格**(检索数据所在的表格)。
检索所有列
- SELECT后面带*则会检索所有的列
SELECT * FROM World;
这里可以看见World中的所有列的情况
通过上一个语法,我们可以发现几个问题:
- 语法“;”(必须是英文的分号来分割)这个语句是用来分割多条Sql语句,当有多条语言的时候则需要用";"来进行区分
- 所有检索出来的列是无序的,因为我们没有限制它的顺序,现在我们
检索单个列或者多个列
- 检索单个列,SELECT后面直接跟列名
- 检索多个列,SELECT后面跟多个列名,列名利用","来区分(,为英文字母)
SELECT ID,Email FROM email
去重(DISTINCT)
观察上一条语法,我们可以发现,ID不同的两行,但是Email确含有重复值,当我们只想选择一个Email时该如何检索呢?
"DISTINCT 语句"
SELECT DISTINCT ID,Email FROM email
从上面的结果来看,我们好像没有达到去除重复值的目的。
因为DISTINCT语法不能部分使用,而是检索的所有列全部重复时,才会去除重复值,而不仅仅判断跟在DISTINCT后面的值是否为重复。
SELECT DISTINCT Email FROM email
这样就可以观测有多少不同的Email
排序(ORDER BY)
前面我们说过,直接检索没有限制的情况下,检索的列是无序的,现在我们将限制检索列的数据。
"ORDER BY"
ORDER BY是SQL语句的一个子句
- 注意 ORDER BY 是SELECT 语句中最后一个子句(后面会给出子句的简单顺序),如果ORDER BY 不是最后一个子句的情况下,语句会发生报错(条数限制LIMIT子句应该位于该子句后)
SELECT area
FROM WORLD
ORDER BY area
多列排序
SELECT ID,Email
FROM email
ORDER BY Email,ID
这个会依次对列进行排序,先对Email进行排序,然后再对ID进行排序。(若Email之中无重复值,则只会按照Email进行排序)
同时,ORDER BY后面可以跟着检索列的次序,上面的语法可以改为ORDER BY 1,2 对应的查询结构是一致的。
降序排列
我们可以看到上面的排序都是根据升序排序,其实我们可以控制排序是按照升序还是按照降序 来排序,我们用的语法是 ORDER BY columns DESC(这里是降序,正序ORDER BY columns ASC 但是一般情况下默认的是升序,所以就不需要带上ASC)
SELECT ID,Email
FROM email
ORDER BY Email,ID DESC
注意,这里的DESC是只能限制DESC其前面的列,而不能限制其它列(注意跟DISTINCT的区别)
限制条数(LIMIT)
这里主要讲解Mysql语句的限制
看到上面经过排序的内容,我们可能会想得到,升序排序之后,我想要位于前两行的记录怎么办?
这个时候我们就可以借助LIMIT语句
SELECT ID,Email
FROM email
ORDER BY Email
LIMIT 2
这我们就能得到前两行的数据,但是这样会不会不灵活?LIMIT X OFFSET Y可以更灵活的实现限制条数的检索
SELECT ID,Email
FROM email
ORDER BY Email
LIMIT 1 OFFSET 2
从结果图我们可以看到 1是限制的条数,2是从第几行开始(这里第几行是计算机行从0开始计数,也就是我们平时认为的第三行,包括第三行)
- LIMIT X(限制的行数) OFFSET Y(从第几行开始,计算机行数)
- 这里检索的就是从第Y+1(包含Y+1(这里的Y+1是常规认知而非计算机语言的行数),在内的X条记录)
- 这里可以用LIMIT Y,X 注意 LIMIT X OFFSET Y = LIMIT Y,X
CASE WHEN
这个形容起来比较复杂,偷个懒贴一个写的不错的链接:https://blog.youkuaiyun.com/qq_16605855/article/details/78043435
3.WHERE 过滤(有目的的去检索)
一般情况下,我们不需要所有的记录,而是检索我们需要的记录
根据我们的需要,我们为检索加上子句,也就是搜索条件,子句的关键字是WHERE
SELECT ID,Email
FROM email
WHERE ID = 1
根据结果,我们就可以发现,我们只检索ID=1的记录
当然WHERE子句的操作符有很多种,这里列出来
这里操作符都类似于"="使用,不再一一展示
注意:
- 字符串条件需要用 " " 来限制,而数值不用
- 每个DBMS的操作符可能不同,所以具体的DBMS再具体的调用
空值 NULL
空值可以理解没**“无”,没有任何东西,在数据库中用NULL来表示(在python中一般用NONE**来表示)
我们也可以检索某一列为空值的记录
SELECT ID,Email
FROM email
WHERE ID IS NULL
这里有一点不同就是操作符不用"=",而是用"IS",需要注意一下。
多条件检索(and or in)
正常情况下,我们的搜索条件不会是只有一个的,这个时候我们会借助 and,or,in
and为"和",需要两个条件同时满足
or 为"或",两个条件满足其一即可
SELECT name,population,area
FROM world
WHERE population > 25000000 OR gdp > 20000000
注意:
- 当and 和 or 同时调用时,机器会先计算and,然后再计算or,所以建议在and和or同时调用的时候,用"()"来约束条件使用顺序
当检索某一列多个值的时候(例:检索名字是X或者名字是Y),可以用in操作符来替代多个OR
SELECT ID,Email
FROM email
WHERE ID IN (1,2)
其它几个操作符:
1.BETWEEN AND
- 这里一般是数值,和日期的一个范围(范围为闭区间)
2.NOT
- NOT在整个条件的前面,但是not只能限制仅仅在它后面的条件,而不是所有的条件。(in操作符可以在in前面)
这里检索的就是ID为1,2的记录(当条件为字符串的时候,字符串需要添加引号)
字符串检索神器(通配符)
通配符核心关键字:“LIKE” 我们可以简单的理解为"像"
1.(只能替代一个字符串)
当使用WHERE X LIKE "A",则检索条件为以A为开头的两字字符串,_只能替代一个字符串
2.%(可以替代所有字符串)
当使用WHERE X LIKE "A%"则是检索所有以A为开头的字符串,%替代的字符串没有个数要求
SELECT * FROM
world
WHERE name LIKE "A%"
数据分组(GROUP BY)
在讲分组之前,需要讲一下如何汇总数据
汇总数据是对一组数据进行求和,计数,最大最小值等操作
有以下几种函数
可以在函数内添加,DISTINCT 对某一列不同的值进行操作
创建分组
GROUP BY 对某一列(一组列)的相同值进行操作(汇总操作),我们看下面的例子来理解一下分组
SELECT continent,count(*) as continent_count
FROM world
GROUP BY continent
GROUP BY的一些事项:
- GROUP BY 可以包含任意数目的列
- GROUP BY 必须包含所有SELECT的列(聚集函数除外)
- GROUP BY 会将所有NULL默认为一组
过滤分组(HAVING)
我们可以把分组之后的记录也进行过滤,但不能用WHERE,我们使用新的关键字HAVING
HAVING跟WHERE:
- WHERE是在分组前进行操作,HAVING是在分组后进行操作
- HAVING可以使用WHERE所有的操作和运算符
检索出现不止一次的Email
SELECT Email
FROM email
GROUP BY Email
HAVING COUNT(Email) > 1
4.SQL的一些基本语法介绍完了,现在我们给他们的子句排个序
5.其它的一些函数
文本函数
日期&时间函数
图片来源于这个博客,并且这里有更详细的介绍:
http://www.cnblogs.com/geaozhang/p/6740457.html
数值函数
-1.彩蛋—SQL语法的规范(约定俗成)
多行分隔符号“;”
- 用于分隔多条SQL语法,强制执行上一条SQL语句。有些情况下,可以不需要分隔,但是在我们能用分隔符的时候,我们总是用“;”。因为在加上";"的时候没有任何坏处,同时可以更方便阅读
大写&小写
- 为了方便阅读,一般情况下,我们的关键字都使用大写,而其它字母一般使用小写,当然具体的TABLE以及列名,根据其具体情况来判定
空格与行
- 为了我们的代码更加好看,我们一般会用多行来完成语法