![e89997373da5293e4bd3459504cbd18c.png](https://i-blog.csdnimg.cn/blog_migrate/6b9d2a74be0a36a70c43e66db9139ac2.png)
最近在b站学习sql,在这里做笔记。感兴趣的同学可以一起学习呀~
![ae406e0c56f31f8ceb6a404262ddb0c1.png](https://i-blog.csdnimg.cn/blog_migrate/5ced6c580c8fae4a75149fa9c6a537c5.jpeg)
1. 基本介绍
![3569a323446c7c9b1e0224463707c176.png](https://i-blog.csdnimg.cn/blog_migrate/c81963b9854e6530d3a2b8bbb066e5f4.png)
sql_store是一个数据库,而customers是数据库中的一个表格。
1.1 如何选择一个数据库
最简单的操作就是双击图中的数据库,另一种方式是输入命令:
use sql_store;
注:显示为粗体的数据库为当前选定的数据库;输入命令调用数据库需要用“;”结束命令。
1.2 如何选择一个表格
在选定数据库后,需要选择特定的表格:
(1)选择表格所有的列
selcet *
from customers
(2)选择表格特定的列
例如,选择客户的id以及姓氏的两列:
select customer_id, first_name
from customers
1.3 如何选定特定条件的行
在选定表格之后,选择客户id为1的行:
where customer_id = 1
1.4 如何排序
例如,选定表格后,按照姓氏排序
order by first_name
1.5 如何写注释
只需要"-- "
-- where customer_id = 1
1.6 语法顺序
select *
from customers
where customer_id = 1
order by first_name
最好的逻辑顺序是select-from-where-order by
注:上述四行命令可以写成一行,只需要用空格隔开,但分成四行更清晰直观
2. select语句
select语句是用于调用所选表格的特定的列,因为数据库的数据可能成千上万,如果我们调用无关的列,将会浪费运行的时间和空间。
2.1 命令行排序决定输出的排序
例如:
select first_name, last_name, points
from customers
返回结果如下
![9c5d213f8993cbfdfd0ad927e87f6a73.png](https://i-blog.csdnimg.cn/blog_migrate/92927b2824f475dd508166159bb7daf3.png)
若将姓氏与名字调换顺序,则
select last_name, first_name, points
from customers
返回结果如下
![3cf7014e242888ac183333c8743a04ac.png](https://i-blog.csdnimg.cn/blog_migrate/00a830442334faa3a5d15ab6d81afa99.png)
2.2 对列进行算术运算
例如我们需要得到“用户积分×10+100”的列
select
last_name,
first_name,
points,
points * 10 + 100
from customers
结果如下
![be0a3df5e6d601a4e7fc3c3c44e27121.png](https://i-blog.csdnimg.cn/blog_migrate/c684a007ab98a6b70bf85f7b710bd668.png)
注:选择的四列也可写成一行
(1)加减乘除基本运算
select
last_name,
first_name,
points,
points + 10,
points - 10,
points * 10,
points / 10,
points % 10
from customers
![6cd7421d1b835b081dc89d77b7e354be.png](https://i-blog.csdnimg.cn/blog_migrate/64ad45c8e25b6bb5ae9b587cdccf74ca.png)
(2)运算顺序
对列进行算术运算,优先进行乘除,再进行加减。但我们可以用括号改变运算顺序
select
points,
(points + 10) * 100
from customers
![98a5e531d92e5902f8ca8e169d4db696.png](https://i-blog.csdnimg.cn/blog_migrate/e56d47d971047b829cacfaf26d506d2a.png)
2.3 为新的列命名
上述产生的新的列的列名没有表达明确的意义,我们可以为新列重新命名
select
last_name,
first_name,
points,
(points + 10) * 100 as discount_factor
from customers
“as”语法可以为新的列命名,结果如下
![b6031816cf850a2f531a3d4b028d757f.png](https://i-blog.csdnimg.cn/blog_migrate/70b81ef4ef703636abc34fada5fd772f.png)
如果我们希望列名中包含空格,我们可以用如下的命令
select
last_name,
first_name,
points,
(points + 10) * 100 as 'discount factor'
from customers
结果如下
![df51b345c05ce9cbe6d602959f7ec2f8.png](https://i-blog.csdnimg.cn/blog_migrate/1838c876268ff6798fa573e38efa54e7.png)
2.4 显示一列中不同值
例如客户来自不同的州,我们想要知道哪些州有我们的客户,即不查看重复值。
我们发现有重复的州
select state
from customers
![c3ee30e8720cff8f154afaa9ea5fd01e.png](https://i-blog.csdnimg.cn/blog_migrate/884974fd138adeb30bb528d881ceaf3e.png)
我们想要查看非重复的,只需要加入“distinct”语法
select distinct state
from customers
![6b130cccbd6813620046279261a8e974.png](https://i-blog.csdnimg.cn/blog_migrate/765380690649b4d3d85e8e4ff171cd98.png)
2.5 小结
在select语句中, 我们可以:
(1)用 * 来选择所有的列,
(2)输入列名选择特定的列,
(3)运用算术运算获得新的列,
(4)用 as 给列重新命名,
(5)用distinct获得五重复值的结果。
【小练习】
选择products表格中的产品的名字,单位价格以及新的价格,新的价格需要自己创建,它是单位价格的1.1倍。
答案可以在评论区查看噢~
3. where语句
where语句是用于调用满足特定条件的行,在这一节的例子中我们仍旧采用sql_store的数据库中customers表格的数据。
以下是常用的符号
![9add3d1886ffe25a2cc65dc075fa6ec5.png](https://i-blog.csdnimg.cn/blog_migrate/5fe6ddc2bae68ddc476a84d8c422adc7.png)
如果所需要筛选的条件是字符串,需要用引号括起来。
例如,我们需要调取生活在弗吉尼亚州的客户的所有数据:
select *
from customers
where state = 'VA'
![466fda428c37b1e33fffb4f05c38b172.png](https://i-blog.csdnimg.cn/blog_migrate/253a2068af2e866fd0e53a5ec064350c.png)
注:使用小写的va也是可以的
如果所需要筛选的条件是日期,也是只需要用引号括起来。
例如,我们需要调取1990年及以后出生的客户的所有数据:
select *
from customers
where birth_date > '1990-01-01'
![e060c56b2168bcb981d0dc784f1cbc99.png](https://i-blog.csdnimg.cn/blog_migrate/58723669946ae643c505498a3aad99c4.png)
3.1. and,or以及not语句
如果我们调用满足多种条件的数据,我们需要使用逻辑运算符号and,or和not。
select *
from customers
where birth_date > '1990-01-01' or points > 1000 and state = 'VA'
请问最后一行代码是筛选出生于1990年及以后或积分大于1000的客户,且在满足前面两种情况的同时,必须满足顾客生活在弗吉尼亚州;还是筛选出生于1990年及以后的顾客或积分大于1000且生活在弗吉尼亚州的顾客呢?
答案是后者,因为and运算符号具有更高的优先级。虽然如此,但加上括号可以使得命令更清晰明。
![e25c45f4363a782395cf7b31be57fe71.png](https://i-blog.csdnimg.cn/blog_migrate/bd4d4100a44f1b8a68743cb7a34eceb5.png)
3.2 in语句
如果我们需要找生活中特定几个州的顾客,运用上一节的知识,我们可以这样写:
select *
from customers
where state = 'VA' or state = 'GA' or state = 'FL'
![7925aba9f27b80271b2bbdee3b79c602.png](https://i-blog.csdnimg.cn/blog_migrate/6d0cdb1d58172c61b8896b7bdbefcf34.png)
但是我们不能写成如下形式:
select *
from customers
where state = 'VA' or 'GA' or 'FL'
or语句只能并列多个条件,而‘GA’和‘FL’只是字符串,state = ‘VA’则是一个布尔值,因此这行命令是错误的。
如果or语句并列的条件是对于同一列的值进行判断,则可以用in语句来简化命令:
select *
from customers
where state in ('VA','FL','GA')
我们可以对in语句使用not逻辑运算:
select *
from customers
where state not in ('VA','FL','GA')
3.3 between语句
当我们需要调用积分在1000到3000的顾客的信息,我们可以使用and逻辑运算符号:
select *
from customers
where points >= 1000 and points <= 3000
![e71dd63d13c6c7da0d9e651363ad4bf6.png](https://i-blog.csdnimg.cn/blog_migrate/c4a7ac58279214e3ee619b3e2c0a69a9.png)
当我们需要选取一定范围内的数值时,我们可以用between来简化命令:
select *
from customers
where points between 1000 and 3000
【小练习】
我们需要调用出生日期在1990年至2000年之间的顾客的信息。
3.4 like语句
当我们想要调用具有特定字符串的顾客的信息时,我们可以用like语句。
例如,我们需要调用姓氏以b开头的客户:
select *
from customers
where last_name like 'b%'
![77119933d8fefc86c04de3cb596cafd8.png](https://i-blog.csdnimg.cn/blog_migrate/f16398e3691683a93c5b67c3d898d037.png)
![b3a282c5ae067f0c3e08e22fbf191215.png](https://i-blog.csdnimg.cn/blog_migrate/7bdcedf1b0b30e6936abe013839526f2.png)
注:b可以用多个字符串代替,如abc;数字也可以使用,当然是对于电话号码之类的
%-代表多个字符串
_-代表一个字符串
3.5 regexp语句
like的使用范围有限,类似于python中的正则表达式,在mysql中也有类似的正则表达式。
![c15704a6140e57308c452dc04aed7430.png](https://i-blog.csdnimg.cn/blog_migrate/81da01082092f5d92e5d6b3cc7eba0d9.png)
正则表达式对于满足多种条件的查询非常方便。
![5a72b146468c9b96aac700ec72db5013.png](https://i-blog.csdnimg.cn/blog_migrate/165e9c892f5b7da696087eb43ac08d5c.jpeg)
例如:
select *
from customers
where last_name regexp 'field|mac|rose'
![46e277ee04616e978f4b3df913535067.png](https://i-blog.csdnimg.cn/blog_migrate/f48e9f36f2a161e0ed432ee95b8b8838.png)
虽然这并不是正则表达的所有内容,但是以上语法足够适用于日常生活。
【小练习】
- 选择用户的名字含有ELKA或者AMBUR的
- 选择用户的姓氏以EY或者ON结尾的
- 选择用户的姓氏以MY开始或者包含SE的
- 选择用户的姓氏包含BR或者BU的
3.6 is null语句
查询某列值为空值的行
select *
from customers
-- 查询电话信息为空的行
where phone is null
-- 不为空值则使用
where phone is not null
-- 注:这两行命令只能执行其中一个,否则报错
3.7 小结
![0ed5c00351d6c3b379b4178e058f1dbb.png](https://i-blog.csdnimg.cn/blog_migrate/f61dc8e71ec7e4ec7afc358ab3d144ca.jpeg)
注:日期和字符串一样,引用时需要用括号括起来,但是在筛选日期区间时,与数字区间一样使用between语句。
4. order by语句
4.1 查看排序的依据
目前顾客表格customers是根据customer_id排序的
![fa8918aa698938e8f1a87150df3a405e.png](https://i-blog.csdnimg.cn/blog_migrate/3e0a7df332516528adb0e3a21e41d5cc.jpeg)
怎么知道是按照customer_id排序的呢?
![ea7961f8801c9f353a0ba763e704a4a1.png](https://i-blog.csdnimg.cn/blog_migrate/fb482a6c357f4dbfc6dd37d4fb9fb191.png)
我们可以点击左栏中小工具图标后,出现以下内容
![ac348bd29e0846c492b46f372800679d.png](https://i-blog.csdnimg.cn/blog_migrate/fbd253824fd47aa641c22ea2384f1249.jpeg)
列名中有黄色标志的列为默认排序所依据的列,一般此类列具有可识别性,例如你的学号,在学校不会有人与你的学号重复,那么我们就可以用学号来代替每一个人并且不会一个学号对应两个人的情况。
如果我们希望表格按名字字母排序:
select *
from customers
order by first_name
-- 注:一定要选择数据库,类似于use sql_store
![1f7db2a83a98839074695e2e8a82e99d.png](https://i-blog.csdnimg.cn/blog_migrate/3d445be54aadc276112f1cdf971add52.png)
4.2 倒序
如果我们希望按名字字母倒序排序(若数字,则变成从大到小):
order by first_name desc
![13848a074e75d9da93651872ef044f1d.png](https://i-blog.csdnimg.cn/blog_migrate/6f52113348519293341ac16eed809bf0.jpeg)
4.3 多重排序
若要进行多重排序,则按照顺序依次写在order by后面:
order by state desc, first_name desc
该命令指:先根据state的倒叙排序,在state相同的情况下再根据first_name的倒叙排序
![ea3db691772f704eb09d758c67adc727.png](https://i-blog.csdnimg.cn/blog_migrate/903c3a8e116f69cb899df766aa2d347b.png)
4.4 所选择的列与排序所依据的列的关系
即使我们所选择的列中并不包含排序依据的列,但也是行得通的
-- 按照州的名称排序后选择city的信息
select city
from customers
order by state
![c01997fb6dad80dacfd67148d92388ba.png](https://i-blog.csdnimg.cn/blog_migrate/ed402267157525a2a47c2162b6637304.png)
我们也可以根据新建的列进行排序
-- 根据新建的列排序,再根据first_name
select first_name, 10 as points
from customers
order by points, first_name
一种简便的排序方式
select birth_date, first_name, last_name, 10 as points
from customers
order by 1, 2
![d42cd3d5974b08f7134701d4e428dacf.png](https://i-blog.csdnimg.cn/blog_migrate/ba3b725c47474d2a5877089acf5b0505.png)
该命令会根据所选的第一列和第二列依次进行排序,但这种排序的缺点是如果所选的列的先后顺序改变,则排序规则也会改变
注:select *也可以使用这种简便的方法噢。
4.5 根据运算结果排序
我们可以根据列表进行运算后的结果排序
对于order_items表格,如果我们需要对order_id为2的订单根据总价格(列表中没有)从低到高排序。
![457b137ab702371f722963ff54d739c8.png](https://i-blog.csdnimg.cn/blog_migrate/a52f0d2de6d36e54c21a651cc3f4653c.png)
select *
from order_items
where order_id = 2
order by quantity * unit_price desc
![6d25ebdca982384a3159b5c7765654d2.png](https://i-blog.csdnimg.cn/blog_migrate/73c35b3bc9e471cd77e9c9f179b3a608.png)
4.6 小结
![10e348fe48829e8d9015bffdd7a784bd.png](https://i-blog.csdnimg.cn/blog_migrate/5daa6379ad35df51253eb91e781e462b.jpeg)
5. limit语句
之前我们学习的都是根据列的信息进行筛选,如果我们需要选择特定行,例如我们选择列表前三行的数据,可以执行这样的命令:
select *
from customers
limit 3
![c80b9700a345682e34baed02c4b6ce42.png](https://i-blog.csdnimg.cn/blog_migrate/6b1e6598b8f9c91ec2b24a581575b560.png)
如果我们需要第六行开始的三行数据,则
select *
from customers
limit 6, 3
![276e640ad2cb3e1cbc1fbda0a808c29b.png](https://i-blog.csdnimg.cn/blog_migrate/64601b75f0906edbc4c6dc45fb73b6db.png)
学习了这些基本语法后,就是最基础的sql入门啦~
语法结构必须按照以下顺序:select, from, where, order by, limit