当前位置: 首页 > news >正文

数据库--SQL语言-1

练习网站:自学SQL网

Select 查询语法复习
SELECT column, another_column, …FROM mytableWHERE condition AND/OR another_condition AND/OR …;
操作符号:

如果属性是字符串, 我们会用到字符串相关的一些操作符号,其中 LIKE(模糊查询) 和 %(通配符) 需要重点学习。 

=完全等于 eg.col="abc"
!=or<>不等于
like没有用通配符等价于 =
not like没有用通配符等价于 !=
%通配符,代表匹配0个以上的字符
-和% 相似,代表1个字符
in 在列表
not in不在列表

注意通配符%、-的使用,前面不适用=,而要使用like

col_name LIKE "%AT%"
(matches "AT", "ATTIC", "CAT" or even "BATS") "%AT%" 代表AT 前后可以有任意字符

例如表格:

Table(表): movies
IdTitleDirectorYearLength_minutes
1Toy StoryJohn Lasseter199581
2A Bug's LifeJohn Lasseter199895
3Toy Story 2John Lasseter199993
4Monsters, Inc.Pete Docter200192
5Finding NemoFinding Nemo2003107
6The IncrediblesBrad Bird2004116
7CarsJohn Lasseter2006117
8RatatouilleBrad Bird2007115
9WALL-EAndrew Stanton2008104
10UpPete Docter2009101
11Toy Story 3Lee Unkrich2010103
12Cars 2John Lasseter2011120
13BraveBrenda Chapman2012102
14Monsters UniversityDan Scanlon2013110

 

  1. 【复杂条件】找到所有Toy Story系列电影 
    SELECT * FROM movies
    where Title like"Toy Story%";

    这里要使用like而不能使用 =

  2. 【复杂条件】找到所有John Lasseter导演的电影
  3. 【复杂条件】找到所有不是John Lasseter导演的电影
  4. 【复杂条件】找到所有电影名为 "WALL-" 开头的电影
  5. 【复杂条件】有一部98年电影中文名《虫虫危机》请给我找出来
2.
SELECT * FROM movies
where Director="John Lasseter";3.
SELECT * FROM movies
where Director!="John Lasseter";
4.
SELECT * FROM movies
where Title like "WALL-%";
5.
SELECT * FROM movies
where year=1998;
 去重:DISTINCT

 DISTINCT 关键字来指定某个或某些属性列唯一返回,原理:DISTINCT 语法会直接删除重复的行

SELECT DISTINCT column, another_column, …
FROM mytable
WHERE condition(s);
结果排序:ORDER BY col_name 
SELECT column, another_column, …
FROM mytable
WHERE condition(s)
ORDER BY column ASC/DESC;

其中ASC是升序 ,DESC 降序

选取部分结果:Limit

LIMIT 和 OFFSET 子句通常和ORDER BY 语句一起使用,当我们对整个结果集排序之后,我们可以 LIMIT来指定只返回多少行结果 ,用 OFFSET来指定从哪一行开始返回

你可以想象一下从一条长绳子剪下一小段的过程,我们通过 OFFSET 指定从哪里开始剪,用 LIMIT 指定剪下多少长度。

SELECT column, another_column, …
FROM mytable
WHERE condition(s)
ORDER BY column ASC/DESC
LIMIT num_limit OFFSET num_offset;

 

task:

  1. 【结果排序】按导演名排重列出所有电影(只显示导演),并按导演名正序排列
  2. 【结果排序】列出按上映年份最新上线的4部电影
  3. 【结果排序】按电影名字母序升序排列,列出前5部电影
  4. 【结果排序】按电影名字母序升序排列,列出上一题之后的5部电影
  5. 【结果排序】如果按片长排列,John Lasseter导演导过片长第3长的电影是哪部,列出名字即可
1.
SELECT distinct Director FROM movies 
order by Director ASC;
2.
SELECT * FROM movies 
order by Year DESC limit 4;
3.
SELECT * FROM movies 
order by  Title ASC limit 5;
4.
SELECT * FROM movies 
order by  Title ASC  limit 5 offset 5;
5.
SELECT Title FROM movies 
where Director="John Lasseter"
order by  Length_minutes DESC 
limit 1 offset 2;

注意:offset 其实是从零开始排,如第五题出第三个,但需要offset2;

按片长排列,John Lasseter导演的电影
Title
Cars 2
Cars
A Bug's Life
Toy Story 2
Toy Story
SELECT Title FROM movies 
where Director="John Lasseter"
order by  Length_minutes DESC ;

但若加上最后一句,显示的是 Cars 2

SELECT Title FROM movies 
where Director="John Lasseter"
order by  Length_minutes DESC 
limit 1 offset 0;
查询综合练习:
Table(表): North_american_cities
CityCountryPopulationLatitudeLongitude
GuadalajaraMexico150080020.659699-103.349609
TorontoCanada279506043.653226-79.383184
HoustonUnited States219591429.760427-95.369803
New YorkUnited States840583740.712784-74.005941
PhiladelphiaUnited States155316539.952584-75.165222
HavanaCuba210614623.05407-82.345189
Mexico CityMexico855550019.432608-99.133208
PhoenixUnited States151336733.448377-112.074037
Los AngelesUnited States388430734.052234-118.243685
Ecatepec de MorelosMexico174200019.601841-99.050674
MontrealCanada171776745.501689-73.567256
ChicagoUnited States271878241.878114-87.629798

 

  1. 【复习】列出所有加拿大人的Canadian信息(包括所有字段)
  2. 【复习】列出所有在Chicago西部的城市,从西到东排序(包括所有字段)
  3. 【复习】用人口数population排序,列出墨西哥Mexico最大的2个城市(包括所有字段)
  4. 【复习】列出美国United States人口3-4位的两个城市和他们的人口(包括所有字段)

需要注意的地方都#啦

1.
SELECT * FROM north_american_cities
where Country="Canada";
#注意这里Canada是字符串要“ ”2.
SELECT * FROM north_american_cities
where Longitude<(SELECT Longitude  FROM north_american_citieswhere City="Chicago")
order by Longitude ASC
;#嵌套需要括号3.
SELECT * FROM north_american_cities
where Country="Mexico"
order by population DESC
limit 2
;
4.
SELECT * FROM north_american_cities
where Country="United States"
order by population DESC
limit 2 offset 2
;#offset 2

 用JOINs进行多表联合查询:

连接INNER JOIN.:

主键(primary key): 一般关系数据表中,都会有一个属性列设置为 主键(primary key)。主键是唯一标识一条数据的,不会重复(想象你的身份证号码)。

借助主键(primary key)(当然其他唯一性的属性也可以),我们可以把两个表中具有相同 主键ID的数据连接起来(因为一个ID可以简要的识别一条数据,所以连接之后还是表达的同一条数据)(你可以想象一个左右连线游戏)。

INNER JOIN.:

SELECT column, another_table_column, …
FROM mytable (主表)
INNER JOIN another_table (要连接的表)ON mytable.id = another_table.id (想象一下刚才讲的主键连接,两个相同的连成1条)
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;

INNER JOIN 先将两个表数据连接到一起. 两个表中如果通过ID互相找不到的数据将会舍弃。

其实就是数据库里面常说的连接啦。

INNER JOIN 可以简写做 JOIN. 两者是相同的意思

例题:

Table: Movies (Read-Only)

IdTitleDirectorYearLength_minutes
1Toy StoryJohn Lasseter199581
2A Bug's LifeJohn Lasseter199895
3Toy Story 2John Lasseter199993
4Monsters, Inc.Pete Docter200192

Table: Boxoffice (Read-Only)

Movie_idRatingDomestic_salesInternational_sales
58.2380843261555900000
147.4268492764475066843
88206445654417277164
126.4191452396368400000

 

  1. 【联表】找到所有电影的国内Domestic_sales和国际销售额
  2. 【联表】找到所有国际销售额比国内销售大的电影
  3. 【联表】找出所有电影按市场占有率rating倒序排列

【联表】每部电影按国际销售额比较,排名最靠前的导演是谁,国际销量多少

1.
SELECT  Domestic_sales,International_sales 
FROM movies
join Boxoffice on movies.id=Boxoffice.Movie_id
;#这个如果过不了得话,把select后面换为*
2.
SELECT  *
FROM movies
join Boxoffice on movies.id=Boxoffice.Movie_id
where Domestic_sales<International_sales 
;
3.
SELECT  *
FROM movies
join Boxoffice on movies.id=Boxoffice.Movie_id
order by Rating desc
;
4.
SELECT Director,International_sales
FROM movies
join Boxoffice on movies.id=Boxoffice.Movie_id
order by International_sales desc
limit 1
;#排名最靠前
外连接(OUTER JOINs)

INNER JOIN 只会保留两个表都存在的数据,意味着一些数据的丢失,在某些场景下会有问题.

于是就有了:左连接LEFT JOIN,右连接RIGHT JOIN 和 全连接FULL JOIN

#用LEFT/RIGHT/FULL JOINs 做多表查询
SELECT column, another_column, …
FROM mytable
INNER/LEFT/RIGHT/FULL JOIN another_tableON mytable.id = another_table.matching_id
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;

ps:这些Join也可以写作 LEFT OUTER JOINRIGHT OUTER JOIN, 或 FULL OUTER JOIN, 和 LEFT JOINRIGHT JOIN, and FULL JOIN 等价.

 

LEFT JOIN 
RIGHT JOIN 

左外链接就是保留左边,右外链接就是保留右边,全链接就是都要 

例题:

Table: Employees (Read-Only)

RoleNameBuildingYears_employed
EngineerBecky A.1e4
EngineerDan B.1e2
EngineerSharon F.1e6
EngineerDan M.1e4

Table: Buildings (Read-Only)

Building_nameCapacity
1e24
1w32
2e16
2w20
  1. 【复习】找到所有有雇员的办公室(buildings)名字
  2. 【复习】找到所有办公室里的所有角色(包含没有雇员的),并做唯一输出(DISTINCT)
  3. 【难题】找到所有有雇员的办公室(buildings)和对应的容量
1.
SELECT  distinct Building
FROM   employees
where Years_employed>0
;#千万注意去重!!
2.
SELECT distinct Building_name, Role
FROM   Buildings 
left join employees on Building=Building_name
;#这个着重讲一下
3.
SELECT distinct Building_name, Capacity
FROM  employees 
left join Buildings on Building=Building_name
where Years_employed>0

ps:因为这个练习DB的限制,只可以用 LEFT JOIN来解决问题.

读第二题:找到所有办公室里的所有角色,不难看出我们是需要输出所有办公室的(输出结果应该如下图),所以Buildings (Read-Only)需要全部保存。即Buildings left join employees。

另外唯一输出(DISTINCT) :如果有【A,B】和【A,C】这两个算是不同的,都需要输出,

即distinct Building_name, Role (类似【 Building_name, Role】)

关于特殊关键字 NULLs:

 在数据库中,NULL表达的是 "无"的概念,或者说没有东西。而某个属性列是 NULL的情况, 这种特殊性会造成编写SQL的复杂性,所以没有必要的情况下,我们应该尽量减少 NULL的使用,让数据中尽可能少出现 NULL的情况。

如果某个字段你没有填写到数据库,很可能就会出现NULL 。所有一个常见的方式就是为字段设置默认值,比如 数字的默认值设置为0,字符串设置为 ""字符串. 但是在一些NULL 表示它本来含义的场景,需要注意是否设置默认值还是保持NULL。 (比如, 当你计算一些行的平均值的时候,如果是0会参与计算导致平均值差错,是NULL则不会参与计算).还有一些情况很难避免 NULL 的出现, 比如之前说的 outer-joining 多表连接,A和B有数据差异时,必须用 NULL 来填充。

NULL的查询:可以用IS NULL和 IS NOT NULL 来选在某个字段是否等于 NULL.

WHERE column IS/IS NOT NULL

例题:(前面的图)

  1. 【难题】找到还没有雇员的办公室 ✓
SELECT Building_name
FROM Buildings
left join employees on Building=Building_name
where Name is NULL 
;

相关文章:

  • 深入了解二叉搜索树:原理、实现与应用
  • C语言-写一个简单的Web服务器(一)
  • uniapp+node.js前后端做帖子模块:发布帖子评论(社区管理平台的小程序)
  • 链表中的经典问题——反转链表
  • C#拾遗补漏之goto跳转语句
  • Centos安装mysql8
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • 部署LVS+Keepalived高可用群集(抢占模式,非抢占模式,延迟模式)
  • MySQL利用逻辑备份恢复误删的数据库
  • vue 总结
  • redis使用笔记
  • 【Linux】线程封装_互斥
  • 怎么看待Groq
  • Redis缓存三大问题-穿透、击穿、雪崩
  • html地铁跑酷
  • Android系统模拟器绘制实现概述
  • Angular 响应式表单之下拉框
  • C语言笔记(第一章:C语言编程)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • HTML5新特性总结
  • interface和setter,getter
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript 基本功--面试宝典
  • js如何打印object对象
  • Python学习笔记 字符串拼接
  • react-native 安卓真机环境搭建
  • SQLServer插入数据
  • supervisor 永不挂掉的进程 安装以及使用
  • Travix是如何部署应用程序到Kubernetes上的
  • 使用agvtool更改app version/build
  • 译米田引理
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ###C语言程序设计-----C语言学习(3)#
  • #控制台大学课堂点名问题_课堂随机点名
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $.ajax中的eval及dataType
  • $NOIp2018$劝退记
  • (02)vite环境变量配置
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C#)获取字符编码的类
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)mysql使用Navicat 导出和导入数据库
  • .cfg\.dat\.mak(持续补充)