《MySQL必知必会》[01] 基本查询

“mysql必知必会”的图片搜索结果
《MySQL必知必会》(点击查看详情)


1、写在前面的话

这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐。之前自己学习的时候是啃的清华大学出版社的计算机系列教材《数据库系统概论》,基础也算是半罐水,糊里糊涂,知识点欠缺梳理。于是,也算是借此机会,从这本书对数据库和SQL部分的知识点进行梳理,记录一下基础的关键的东西,也便于以后翻阅查询,好了,就不叨叨了。



2、MySQL基本操作

  • 命令输入在 mysql> 之后;
  • 命令用;或 \g 结束,仅按Enter不执行命令;
  • 输入 help 获得帮助;
  • 输入 quit 或 exit 退出命令行实用程序

{ }花括号中的内容表示实际内容,而非此处的固定字符。
操作命令
进入MySQL    安装目录的bin下打开命令行,输入mysql -u {yourAccountName} -p
显示现有数据库    show databases;
选择数据库    use {databaseName};
显示已选数据库的表show tables;
显示列(字段)show columns from {tableName}; 或 describe {tableName};
显示授权用户的安全权限show grants;



3、基本查询 SELECT

操作    语法
查询单列    SELECT {columnName} FROM {tableName};
查询多列    SELECT {columnName1, columnName2} FROM {tableName};
查询所有列    SELECT * FROM {tableName};

其他关键字:
  • AS
  • 放在字段名后或表名后,表示别名
  • e.g. SELECT {newTableName}.{columnName} AS {newColumnName} FROM {tableName} as {newTableName};
  • e.g. SELECT b.author as 'zuozhe' FROM books as b;

  • DISTINCT
  • 放在SELECT之后,字段名之前,表示互异,使SQL对任何元组只生成一份副本,且应用于所有列
  • e.g. SELECT DISTINCT {columnName} FROM {tableName};

  • ORDER BY
  • 排序,BY后面跟字段名,默认为升序(从小到大)排列,多个排序规则用逗号隔开依次满足条件
  • e.g. SELECT * FROM fruits ORDER BY price;

  • DESC
  • 配合ORDER BY,表示降序排列,放在字段名后,限制单列
  • e.g. SELECT * FROM fruits ORDER BY price DESC;

  • LIMIT beginColumnNum, ColumnAmount
  • 限制结果,指定输出从beginColumnNum开始的(索引从0开始而不是1)的ColumnAmount行记录(常用于分页)
  • e.g. SELECT * FROM {tableName} LIMIT 5, 10  (输出表中包括第6行开始的10条数据)

另外:
  • SQL语句不分大小写,为了便于阅读可以将所有关键字大写,列和表名采用小写;
  • SQL语句可以分一行给出,也可以分成多行;
  • 不需要查询出明确的列时尽量采用通配符 * 可以提高性能。



4、条件查询 WHERE

为了获取特定的结果而指定条件,SQL中根据WHERE子句中指定的搜索条件进行过滤,WHERE跟在表名(FROM子句)之后。
基本操作符(1)说明
=等于    
<>不等于    
!=不等于    
<小于    
<=小于等于    
>大于    
>=大于等于    
BETWEEN指定两值之间(含开始和结束),配合AND(BETWEEN valA AND valB)
IS NULL    空值检查
注意:
  • 表示要查询某字段为空值,不能使用"=NULL"或"<>NULL",而是"IS NULL"或"IS NOT NULL"

基本操作符(2)说明
AND    “与”,同时过滤多个条件子句
OR    “或”,配合检索匹配任一条件的记录
NOT  “非”,否定它之后所跟着的条件(常配合IN、BETWEEN、EXISTS等)
IN    指定条件范围,多值之间逗号隔开(功能类似OR)
注意:
  • NOT优先级高于AND,AND优先级高于OR



5、模糊查询 LIKE

用于查询包含某个关键字的记录。
操作符说明
LIKE     表示搜索模式利用通配符匹配
通配符说明
%不限长度的字符序列匹配
_单个字符的序列匹配
转义符说明
\表示某些特殊符号,如‘\%’表示匹配百分号字符,而不是通配符



6、分组查询 GROUP BY 

关键字说明
GROUP BY根据字段进行分组,必须在WHERE子句之后,ORDER之前
HAVING过滤分组,用法类似于WHERE,但分组只能用HAVING不能用WHERE
注意:
  • GROUP BY 可以包含多列,即分组嵌套,且嵌套后数据在最后规定的分组上进行汇总
  • 分组列如果有NULL,则NULL会作为一个分组返回(多行NULL将分为一组)
  • GROUP BY 如果用于输出,实际只会输出每组首行,而不是全部



7、聚合函数

函数说明
COUNT()求行数,在使用 * 通配符时才不会忽略NULL值的行
AVG() 求平均值,自动忽略NULL值的行
MAX()求最大值,自动忽略NULL值的行
MIN()    求最小值,自动忽略NULL值的行
SUM()    求和,自动忽略NULL值的行
注意:
  • 以上的算值函数,可以利用算术符作用多列,其含义是类似 “SELECT MAX(price*amount) FROM fruits” 如此用法
  • 以上5种聚合函数,在MySQL 5.0 版本之后,其括号中的表达式可以使用前缀关键字DISTINCT
  • 聚合函数多配合分组GROUP BY使用



8、子查询

子查询,即嵌套在其他查询中的查询。在SELECT语句中,子查询总是从内向外分步进行处理。

8.1 子查询过滤

SELECT  cust_id
FROMorders
WHEREorder_num IN 
(
SELECTorder_num
FROMorderitems
WHEREprod_id = 'TNT2'
)
14
1
SELECT  
2
  cust_id
3
FROM
4
  orders
5
WHERE
6
  order_num IN 
7
(
8
SELECT
9
  order_num
10
FROM
11
  orderitems
12
WHERE
13
  prod_id = 'TNT2'
14
)
  • 子查询应与WHERE匹配相同数量的列,通常是单个列匹配,结合IN等关键字使用

8.2 子查询作为计算字段

SELECTcust_name,cust_state,(SELECTCOUNT(*)FROMordersWHEREorders.cust_id = customers.cust_id) AS orders
FROMcustomers
ORDER BY cust_name
14
1
SELECT
2
  cust_name,
3
  cust_state,
4
  (
5
  SELECT
6
    COUNT(*)
7
  FROM
8
    orders
9
  WHERE
10
    orders.cust_id = customers.cust_id
11
  ) AS orders
12
FROM
13
  customers
14
ORDER BY cust_name
  • 涉及外部查询的子查询叫做相关子查询,每次取外部查询的值和子查询所有行分别匹配,再取外部查询下一行和子查询匹配,循环至结束
  • 子查询可以逐步建立用来进行测试和调试,这是很有技巧性的



9、创建计算字段

直接从数据库中检索出转换、计算或格式化过后的数据,而不是检索出数据然后再到客户机程序中重新格式化。

9.1 拼接字段

输出指定格式,如vendors供应商表包含name和location,希望name按照name(location)格式输出,使用Concat函数:
多数DBMS使用 + 或 || 实现拼接,而MySQL使用Concat()实现
SELECTConcat(vend_name, '(', vend_country, ')')
FROMvendors
ORDER BY vend_name;
5
1
SELECT
2
  Concat(vend_name, '(', vend_country, ')')
3
FROM
4
  vendors
5
ORDER BY vend_name;

Concat()拼接串,把多个串连接起来形成长串,各串之间用逗号隔开。

还可以用类似去空格函数对数据进行进一步的整理,RTrim()删除数据右侧多余的空格,同理LTrim()删除左侧多余的空格,Trim()删除两端的空格:
SELECTConcat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title
FROMvendors
ORDER BY vend_name;
5
1
SELECT
2
  Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title
3
FROM
4
  vendors
5
ORDER BY vend_name;

9.2 执行算术计算

可以针对检索出来的数据直接进行基本的算术计算(加减乘除),如:

SELECTprod_id,quantity,item_price,quantity*item_price AS expanded_price
FROMorderitems
WHEREorder_num = 20005;
9
1
SELECT
2
  prod_id,
3
  quantity,
4
  item_price,
5
  quantity*item_price AS expanded_price
6
FROM
7
  orderitems
8
WHERE
9
  order_num = 20005;



10、处理数据的函数

写在前面的话,SQL语句的通用性很强,可以说是可移植的,虽然部分数据库之间存在差异,可是通常并不是那么难以处理。但是函数的可移植性就比较差了,几乎每种主要的DBMS的实现都支持其他实现不支持的函数,有时候差异还很大。

如果你决定在SQL中使用函数,应该确保做好代码注释,以便将来你或者他人能确切地知道SQL代码的含义。

10.1 文本处理函数

Left()    返回串左边的字符
Length()    返回串的长度    
Locate()    找出串的一个子串
Lower()    将串转换为小写    
LTrim()    去掉串左边的空格    
Right()    返回串右边的字符    
RTrim()    去掉串右边的空格    
Soundex()    返回串的soundex值(将任何文本串转换为描述其语音表示的字母数字模式,你可以理解为,变成读音)p70
SubString()    返回子川的字符    
Upper()将串转换为大写

10.2 日期和时间处理函数

写在前面的话,MySQL使用的日期格式,无论什么时候都必须为 yyyy-mm-dd,虽然其他日期格式可能也行,但是这个是首选日期格式。
AddDate()    增加一个日期(天、周等    )
AddTime()    增加一个时间(时、分等    )
CurDate()    返回当前日期    
CurTime()    返回当前时间
Date()     返回日期时间的日期那部分 
DateDiff()    计算两个日期之差        
Date_Add()    高度灵活的日期运算函数    
Date_Format()    返回一个格式化的日期或时间串    
Day()    返回一个日期的天数部分    
DayOfWeek()    对于一个日期,返回对应的星期几    
Hour()    返回一个时间的小时部分    
Minute()    返回一个时间的分钟部分    
Month()    返回一个日期的月份部分    
Now()    返回当前日期和时间    
Second()    返回一个时间的秒部分    
Time()    返回一个日期时间的时间部分    
Year()    返回一个日期的年份部分    

WHERE order_date = '2005-09-01' 可靠吗?假如时间是 2005-09-01 11:30:05,则该匹配会失败;如果我们使用Date()提取日期部分,则 WHERE Date(order_date) = '2005-09-01' 则更可靠了。

检索某年2月的所有数据,WHERE Date(order_date) BETWEEN '2005-02-01' AND '2005-02-28',这种方式可行,但是需要你自己去计算是闰年还是平年,以确定这个月份到底有多少天,比较麻烦,实际上你可以用更简单的方式:WHERE Year(order_date) = 2005 AND Month(order_date) = 9;

10.3 数值处理

数值处理一般用于代数、三角或几何运算,使用并不频繁:
Abs()    返回一个数的绝对值    
Cos()    返回一个角度的余弦    
Exp()    返回一个数的指数值    
Mod()    返回除操作的余数    
Pi()    返回圆周率π    
Rand()    返回一个随机数    
Sin()    返回一个角度的正弦    
Sqrt()    返回一个数的平方根    
Tan()    返回一个角度的正切



11、用正则表达式进行搜索

正则表达式的作用是匹配文本,其概念和基本使用,可以参考在JS篇中的一篇博客《03标准对象-02-RegExp 正则表达式》,这跟在JS还是在SQL里都没有关系,因为几乎所有种类的程序设计语言、文本编辑器和操作系统等,都支持正则表达式。

正则表达式在SQL中使用时要使用REGEXP关键字(Regular Expression,正则表达式),用法类似LIKE:
SELECTprod_name
FROMproducts
WHEREprod_name REGEXP '.000'
ORDER BY prod_name;
7
1
SELECT
2
  prod_name
3
FROM
4
  products
5
WHERE
6
  prod_name REGEXP '.000'
7
ORDER BY prod_name;

上条SQL你可以得到价格尾数带000的记录,如1000或2000都会得到匹配返回。

除了在延伸阅读的博客里的内容,还有一些需要提到的不同的:
(1)匹配特殊字符
用\\为前导,如希望查找 '-',要使用\\- (正则一般只用一个\做转义,但MySQL要求两个,因为它自己要解释一个,正则要解释一个)

(2)匹配字符类
[:alnum:]    任意字母和数字,同[a-zA-Z0-9]
[:alpha:]    任意字符,同[a-zA-Z]
[:blank:]    空格和制表
[:cntrl:]ASCII控制字符
[:digit:]任意数字
[:graph:]与print相同但不包括空格
[:lower:]任意小写字母
[:print:]任意可打印字符
[:punct:]既不在[:alnum:]也不在[:cntrl:]中的任意字符
[:space:]包括空格在内的任意空白字符
[:upper:]任意大写字母
[:xdigit:]任意十六进制数字,同[a-fA-F0-9]

一个例子:
SELECTprod_name
FROMproducts
WHEREprod_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY prod_name;
1
SELECT
2
  prod_name
3
FROM
4
  products
5
WHERE
6
  prod_name REGEXP '\\([0-9] sticks?\\)'
7
ORDER BY prod_name;

输出结果:
TNT (1 stick)
TNT (5 sticks)



12、其他

12.1 SELECT子句的顺序

  • SELECT
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY
  • LIMIT


转载于:https://www.cnblogs.com/deng-cc/p/6534872.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(七)立体标定与立体校正 【计算机视觉学习笔记--双目视觉几何框架系列】

七、立体标定与立体校正 这篇博文中&#xff0c;让玉米和大家一起了解一下&#xff0c;张氏标定是怎样过渡到立体标定的&#xff1f;在这里主要以双目立体视觉进行分析。对于双目立体视觉&#xff0c;我们有两个摄像头。它们就像人的一双眼睛一样&#xff0c;从不同的方向看世界…

让 jQuery UI draggable 适配移动端

背景&#xff1a; 在移动端&#xff0c;本人要实现对某个元素的拖动&#xff0c;想到使用 jQuery UI 的 draggable 功能。但是发现此插件的拖动只支持PC端&#xff0c;不支持移动端。 原因&#xff1a; 原始的 jQuery UI 里&#xff0c;都是mousedown、mousemove、mouseup来描述…

LAMP(7限定某个目录禁止解析php、 限制user_agent、 PHP相关配置、PHP扩展模块

限定某个目录禁止解析php防止***上传一个目录文件php&#xff0c;网站会从而解析php,对我们的网站有很大的危险。因此&#xff0c;我们需要在能上传文件的目录直接禁止解析PHP代码禁止步骤1.编辑虚拟主机配置文件&#xff1a;增添内容核心配置文件内容<Directory /data/wwwr…

编译器的功能是什么

1、编译器就是将“一种语言&#xff08;通常为高级语言&#xff09;”翻译为“另一种语言&#xff08;通常为低级语言&#xff09;”的程序。一个现代编译器的主要工作流程&#xff1a;源代码 (source code) → 预处理器(preprocessor) → 编译器 (compiler) → 目标代码 (obje…

八、走向三维

八、走向三维 我们前面花了七篇博文做铺垫&#xff0c;我们所做的一切努力都是为了最后的这一击——立体成像。因为玉米的这个系列文章是对双目视觉几何框架的总结。此处跳过匹配&#xff0c;假设左右图像点的完美匹配的。只看在几何上&#xff0c;三维坐标是如何被还原的。相对…

L~M方法

L~M方法&#xff1a; L~M&#xff08;Levenberg-Marquardt&#xff09;方法有些让人摸不清头脑。玉米觉得L~M让人困扰的主要原因有两点&#xff1a;一是L~M从何而来、二是L~M怎么样用&#xff1f;因为玉米也不是研究最优化理论的&#xff0c;所以玉米在这里用较为通俗的观点&a…

IDEA将项目上传至码云/GitHub托管

前言 好久都没有写博客了&#xff0c;由于博主之前一直都在上班处于加班的阶段&#xff0c;所以根本就没有时间去学习。现在请假回到学校写论文&#xff0c;有时间来学习了。 所以会不断的进行博客的更新&#xff0c;以及分享我在公司学到的一些新的技术&#xff0c;希望大家多…

cocos2dx游戏--欢欢英雄传说--添加攻击按钮

接下来添加攻击按钮用于执行攻击动作。同时修复了上一版移动时的bug。修复后的Player::walkTo()函数&#xff1a; void Player::walkTo(Vec2 dest) {if (_seq)this->stopAction(_seq);auto curPos this->getPosition();if (curPos.x > dest.x)this->setFlippedX(t…

Ceph分布式存储系统-性能测试与优化

测试环境 部署方案&#xff1a;整个Ceph Cluster使用4台ECS&#xff0c;均在同一VPC中&#xff0c;结构如图&#xff1a; 以下是 Ceph 的测试环境&#xff0c;说明如下&#xff1a; Ceph 采用 10.2.10 版本&#xff0c;安装于 CentOS 7.4 版本中&#xff1b;系统为初始安装&…

阅读好书依然是提升自己的高效方法:兼以作者的身份告诉大家如何选择书,以及高效学习的方法...

国内技术网站多如牛毛&#xff0c;质量高的网站也不少&#xff0c;博客园也算一个&#xff0c;各类文章数以百万计&#xff0c;我随便输入一个关键字&#xff0c;比如Spring Cloud&#xff0c;都能看到大量的技术文章和教学视频&#xff0c;我无意贬低技术文章和教学视频的作用…

TCP/IP 协议簇的逐层封装

在使用 TCP 协议的网络程序中&#xff0c;用户数据从产生到从网卡发出去一般要经过如下的逐层封装过程&#xff1a; 从下往上看&#xff1a; 1&#xff09;链路层通过加固定长度的首部、尾部来封装 IP 数据报(Datagram) 产生以太网帧(Frame)。 其中首部存在对封装数据的…

【开源程序(C++)】获取bing图片并自动设置为电脑桌面背景

众所周知&#xff0c;bing搜索网站首页每日会更新一张图片&#xff0c;张张漂亮&#xff08;额&#xff0c;也有一些不合我口味的&#xff09;&#xff0c;特别适合用来做电脑壁纸。 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是&#xff1a; 上网&#xff0c;搜…

UIProgressView 圆角

里面外面都变成圆角 不用图片 直接改变layer 重点是里面外面都是圆角哦 for (UIImageView * imageview in self.progress.subviews) { imageview.layer.cornerRadius 5; imageview.clipsToBounds YES; } 转载于:https://www.cnblogs.com/huoran1120/p/5563991.html

DataTables warning: Requested unknown parameter '0' from the data source for row '0'

问题&#xff1a;DataTables warning: Requested unknown parameter 0 from the data source for row 0 代码&#xff1a; <script type"text/javascript">var data [{"Name":"UpdateBootProfile","Result":"PASS",&…

我与Linux系统的交集

2019独角兽企业重金招聘Python工程师标准>>> 一、初识Linux 第一次知道Linux还是在我刚进大学的时候&#xff0c;从开始聊QQ、玩斗地主的时候起我就是用的Windows&#xff0c;从Windows2000一直到Windows7&#xff0c;当时我已经完全习惯了使用Windows&#xff0c;而…

IP头、TCP头、UDP头详解以及定义

一、MAC帧头定义 /*数据帧定义&#xff0c;头14个字节&#xff0c;尾4个字节*/ typedef struct _MAC_FRAME_HEADER { char m_cDstMacAddress[6]; //目的mac地址 char m_cSrcMacAddress[6]; //源mac地址 short m_cType;      //上一层协议类型&#xff0c;如…

基本 TCP 套接字编程讲解

基于 TCP 的套接字编程的所有客户端和服务器端都是从调用socket 开始&#xff0c;它返回一个套接字描述符。客户端随后调用connect 函数&#xff0c;服务器端则调用 bind、listen 和accept 函数。 使用套接口客户机服务器的的例子 sever.c #include <stdio.h> #include &…

怎样屏蔽微信朋友圈视频?局域网如何禁止员工看朋友圈视频?

上班时间刷刷朋友圈&#xff0c;一眨眼半小时就过去了。不但会影响工作效率&#xff0c;而且朋友圈的视频会占用大量的带宽。所以对企业管理人员来说&#xff0c;很多时候需要禁止员工在工作时段刷朋友圈。但是行政手段要和技术手段配合&#xff0c;才可以发挥真正的作用。本文…

cf414B(dp)

题目链接&#xff1a;http://codeforces.com/problemset/problem/414/B 题意&#xff1a;定义所有元素是其前一个元素的倍数的数列为good sequence&#xff0c;给出 n, 和 k&#xff0c;求1....n组成的长度为k的good sequence 的数目&#xff1b; 思路&#xff1a;dp 用dp[i][j…

增量值编码器、单圈绝对值编码器、多圈绝对值编码器

主流的伺服电机位置反馈元件包括增量值编码器&#xff0c;单圈绝对值编码器&#xff0c;多圈绝对值编码器&#xff0c;旋转变压器等。下面分别介绍&#xff1a; 增量值编码器增量式编码器是将位移转换成周期性的电信号&#xff0c;再把这个电信号转变成计数脉冲&#xff0c;用…