目录
SQL(structured query language)结构化查询语言,是使用关系模型的数据库应用语言,SQL语言的标准最主要的有两个:一个是SQL92(92年颁布),一个是SQL99(99年颁布),今天我们使用的SQL语言依旧是遵循着这些标准的。SQL语言不同于我们的Java语言,Python语言,c语言等,它在功能上是有分类的,有如下三类:
- 数据定义语言--data defintion language(ddl)→创建(create),修改(alter),删除(drop),重命名(rename),清空(truncate);【对数据的结构进行操作】 分享我的记忆技巧:一定要创业删次落空,才修息,信命。(找到适合自己的就行)
- 数据操作语言--data manipulation language(dml)→插入(insert),删除(delete),修改(update),查找(select)【对数据的内容进行操作】 分享我的记忆技巧 :操级插劲,去删除,我们来修改,检查。(增删改查)
- 数据控制语言--data control language(dcl)→提交(submit),取消提交 (rollback),保存点(savepoint),权限(grant),取消权限(revoke);
在MySQL中使用频率最高的非select语句莫属,因为select的使用太频繁了,有些时候它也可以叫做数据查询语言--data query language(dql)。
接下来我们来认识SQL语言里面的select数据查询语言(数据操作语言),使用格式为:
select 字段1,字段2,字段3....from 表名; 具体使用如下
普通的查询语句
普通的查询语句不需要指定查询的表格名字,一般用于运算。如下我们使用select 12 * 12,11*11来计算12的平方与11的平方。
数据去重显示
如下我们可以看到在我们的表中name字段的值有多个null值(表示没有那个人)。
我们可以使用distinct关键字(保留字)来进行去重显示我们的数据。
给列起别名
通常来说,起别名都要使用as(alias别名)关键字,名称需要使用双引号括起来。
常数查询
查询的常数不存在表中,且会在每一行都做常数匹配
显示表结构
着重号的使用
着重号一般是在表名或者字段名(列名)和MySQL的保留字(关键字)冲突的情况下使用。
我们使用键盘左上角的‘~’下的`符号作为一个单着重号,
#普通的查询语句(不用到现有的表格中)
SELECT 12*12,11*11;
#去重查找
SELECT NAME FROM td2;
SELECT DISTINCT NAME FROM td2;
#列别名
SELECT 12*12 AS "12的平方",11*11 AS "11的平方" FROM DUAL;
#查询常数
SELECT "瑞士联邦理工学院" AS school,NAME FROM td2;
#显示表结构
DESC td2;
#着重号
CREATE TABLE PRIMARY;
SELECT * FROM `PRIMARY`;
过滤数据
我们可以在表名后面加上‘where’关键字来过滤我们的表格数据
如下,我们筛选超级为250分的学生:
在过滤数据里面会有许多的非符号运算符,使得我们可以过滤出外面需要的数据。
1,is【not】 null
1, is null :查找值为空的数据 →is not null ,查找值不为空的数据
2,least【greatest】
2, least:在多个值中返回最小值 →greatest,在多个值中返回最大值
3,between...and...
用于两者之间,判断一个值是否在两个值之间
如上筛选工资在8000到50000之间的员工。
4,isnull()
isnull()是一个函数,与is null作用一样判断是否为空
5,【not】in
in表示属于,用于判断一个值是否为列表中的任意一个值,not in相反。
如下我们查找工资在及不在这 5000,8000,500000,400000几个数量的员工
6,like
当我们使用了like的时候就就表明了我们使用的是模糊匹配。后面可以接上模糊匹配规则
(1)select * from 表名 where 字段名 like ‘%字符’------表示以该字符结尾的数据
(2)select * from 表名 where 字段名 like ‘字符%’------表示以该字符开头的数据
【如上我们的模糊匹配中的百分号%表示的‘不确定的多个字符,中间可以为任意的字符’】
7,regexp
regexp后面接的是正则表达式。正则表达式和java中的正则表达式类似,想要深入了解的请点击该博客进行学习→java中的正则表达式
使用正则表达式查找以字符‘张’开头的数据
使用正则表达式查找以字符‘张’结尾的数据时就会发现使用 select * from ContainNull where name regexp '张^'; 是不行的。因此个人认为是因为在不同的计算机语言中正则表达式的使用都不尽相同,如java中就需要写模板写匹配,而mysql中只需要写regexp,然后后面跟上正则表达式的规则就行。所以正则表达式在它们中的使用是有区别的。在java中 使用这个‘张^’是可以匹配到以张结尾的数据的,但是在mysql中我们需要使用的是‘张$’来进行匹配,
select * from ContainNull where name regexp '张$'; 如下
运算符
算术运算符
字符串与数值相加
如果字符串里面是纯数字,那么字符串与数组相加的结果为字符串里面的数字与数值相加
但是如果字符串里面含有字符型变量的话,就会将字符串默认成数值0来进行相加
/与div
在java中a/b是a整除b的意思,得到的结果为整数类型。但是在mysql中a/b得到的结果为浮点型数据,如果是a div b的话,得到的结果才为整数类型
取模
如果两个数取模,a%b(a mod b)取模的结果正负号与被除数的正负号一致。
比较运算符
安全等于运算符
当比较的操作数里面有null空值时,结果都为空值,这个时候我们就可以使用安全等于运算符来对null进行判断,如下【0为false假,1为ture真】:
不等于运算符
逻辑运算符
我们的逻辑运算符有逻辑异或。逻辑与,逻辑或。
逻辑异或(xor)
逻辑异或就像个异类,它不像逻辑或那样只要其中一个是真就为真。两个比较必须要一真一假
如上,当两个比较式的结果都为true,但是中间用逻辑异或时,即使没有假的结果,但是逻辑异或后的结果为0假;
逻辑或(or)(||)
逻辑或的两边只要其中一边为真,结果就为真。
逻辑与(and)(&&)
逻辑与的两边必须都为真结果才为真。
【需要记住的就是:and的优先级高于or】
排序
如果我们没有使用排序操作,那么我们查询数据表返回的顺序就是我们添加的顺序。
如下我们使用:select * from 20student; #查询出来的数据为添加的顺序,stu_id为无序的字段。
在mysql中可以使用order by来进行排序,如果字段后面不加asc的话就是表示为升序排序的,如果加上desc则为降序。
升序
现在我们使用 select * from 20student order by stu_id; #将stu_id按照升序排序。
我们在字段侯后面加上asc也是按照升序排序的:select * from 20student order by stu_id asc;
降序
现在我们使用select * from 20student order by stu_id desc; 来将stu_id进行降序排序。
二级排序
二级排序的作用就是为了一级排序(使用一个条件)后有两条及两条以上的数据有着相同的数值,而进行的再一次排序。打个比方:在高考中的排名,如果有两个人的总成绩相同,那么就会再去比较两个人中谁的三大主科(语数英)总分高,高的就排名在前。
在上图中我们的数据表中有,当数据表中的学生德育分(stu_get1)相同时,我们可以按照学生最终得分(stu_score)来进行排序,用来让两条记录得以区分开。
使用SQL语句: select * from 20student order by stu_get1 desc ,stu_score asc;
【我们的SQL语句帮我们将数据表里面的数据先按照德育分排好序,如果有相同的就依据最终得分来进行排序】
分页
很多时候我们并不需要展示数据表的全部记录,只需要指定范围区间的就行。于是这个时候就可以使用limit来实现分页显示。
select * from 20student limit 6,10; #在我们的这句SQL语句中limit有两个参数,第一个是偏移量,第二个参数是要显示的记录条数。需要注意的就是在mysql中的数据库数据中的数据是从1开始计数的,但是limit函数中的第一个数据的索引为0。因此当我们的偏移量为6时就代表了是从7开始的,即offset+1;我们也可以看成是一个左边是取不到的开区间。
limit
无offset
当然了我们的limit参数也不是一定要两个参数都有的,当我们传入一个参数时,表示的就是要展示的记录条数,而偏移量就默认为从0开始,如下我们使用select * from 20student limit 6; 查看数据
有offset
offset是mysql中的新特性,与不加offset的作用和效果相似。
limit pagesize(显示的记录条数) offset 偏移量;
现在我们要从下标为7的记录取6条记录,使用:select * from 20student limit 6 offset 6;
文章留一个小问题,知道答案的可以在评论区留言。文章有不懂的也可以留言。
问: select 4 > 5 or 4 < 5 and 4 < 5 && 4 > 5;的结果为真还是假(为0或1)?