一、常用查询
1.1、orderby按关键字排序
实用select语句可以讲需要的数据从mMySQL数据库中查询出来,如果对插叙的结果进行排序,可以实用orderby语句来对语句实现排序,并最终讲排序的结果返回给用户,这个语句的排序不光可以针对某一个字段,也可以针对多个字段
语法:
select字段1,字段2...from表名orderby字段1,字段2...asc#查询结果以升序方式显示,asc可以省略
select字段1,字段2...from表名orderby字段1,字段2,...desc#查询结果以降序方式显示
1、ASC是按照升序进行排序,是默认的排序方式,即ASC可以省略。
2、select语句中如果没有制定具体的排序方式,即默认按ASC方式进行排序
3、DESC是按照降序方式进行排列,当然orderby前面也可以实用where子句对查询结果进一步过滤。
升序排序
selectname,powerfromnameorderbypower;
降序排序
selectname,powerfromnameorderbypowerdesc;
结合where进行条件过滤在排序
selectname,power,phonefromnamewherephone=1234566777orderbypower;
多字段排序
ORDERBY语句也可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,ORDERBY后面跟多个字段时,字段之间使用英文逗号隔开,优先级是按先后顺序来定,但是orderby之后的第一个参数只有再出现相同值时,第二个字段才有意义。
selectname,power,phonefromnameorderbyphone,powerdesc;
1.2、and/or判断
在大型数据库中,有时查询数据需要数据符合某些特定条件
AND/OR且/或和shell脚本中一样的使用方法
and/or使用
mysql>selectname,address,powerfromnamewherepower>66andpower<999;
selectname,address,powerfromnamewherepower>66orpower<999;
1.3、distinct查询不重复记录
selectdistinct字段from表名﹔
distinct必须放在最开头
distinct只能使用需要去重的字段进行操作
distinct去重多个字段时,含义是:几个字段同时重复时才能被过滤,会默认按左边第一个字段为依据。
1.4、GROUPBY对结果进行分组
通过SQL查询出来的结果,还可以对其进行分组,使用GROUPBY语句来实现,GROUPBY通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUPBY分组的时候可以按一个或多个字段对结果进行分组处理
1、对groupby后面的字段的查询结果进行汇总分组,通常是结合聚合函数一起使用的
2、groupby有一个原则,就是select后面的所有列中,没有使用聚合函数的列必须出现在groupby的后面
1
select字段,聚合函数from表名(where字段名(匹配)数值)groupby字段名;
1.5、limit限制结果条目
limit限制输出的结果记录
在使用MySQLselect语句进行查询时,结果集返回的是所有匹配的记录(行)。有时候仅需要返回第一行或者前几行,这时候就需要limit子句
语法格式:
select字段from表名limit[offset,]number
limit的第一个参数是位置偏移量(可选参数),是设置mysql从哪一行开始
如果不设定第一个参数,将会从表中的第一条记录开始显示。
第一条偏移量是0,第二条为1
offset为索引下标
number为索引下标后的几位
1.6、设置别名(alias-as)
在mysql查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者多次使用相同的表,可以给字段列或表设置别名,方便操作,增强可读性
列的别名select字段as字段别名表名
表的别名select别名.字段from表名as别名
as可以省略
使用场景:
对复杂的表进行查询时,别名可以缩短查询语句的长度
夺标相连查询的时候(通俗易懂,减短sql语句)
在为表设置别名时,要保证别名不能与数据库中的其他表的名称冲突
列的别名在结果中有显示的,而表的别名在结果中没有显示,只在执行查询时使用
查询表的记录数量,以别名显示
利用as,将查询的数据导入另一个表内
createtabletest2asselect*fromname;
select*fromtest2;
select*fromname;
这里as起到的作用
1、创建了一个新表,并定义表结构,插入表数据(与school表相同)
2、但是约束没有被完全复制过来,但是如果原表设置了主键,那么附表的:default字段会默认设置一个0
1.7、通配符
1、通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来
2、通常通配符都是跟LIKE一起使用的,并协同WHERE
3、子句共同来完成查询任务,常用的通配符有两个,分别为
%:百分号表示零个、一个或多个字符
_:下划线表示单个字符
二、子查询
1、自查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句
2、子查询语句是先于主查询进行下一步的查询过滤
3、在自查询中可以与主语句查询相同的表,也可以是不同的表‘
2.1、select查询
子语句可以与主语句所查询的表相同,也可以是不同表
语法格式
select字段1,字段2from表名1where字段in(select字段from表名where条件);
主语句:select字段1,字段2from表名1where字段
in:将主表和子表关联/连接的语法
子语句(集合):select字段from表名where条件
相同表查询
selectname,addressfromtest2whereidin(selectidfromtest2wherepower>0);
多表查询
selectname,powerfromtest2whereidin(selectidfromtest1wherepower<100);
NOT取反,将子查询的结果,进行取反操作
selectname,powerfromtest2whereidnotin(selectidfromtest1wherepower<100);
2.2、insert插入
子查询还可以用在insert语句中,子查询的结果集可以通过insert语句插入到其它表中
createtabletest3liketest2;
desctest3;
insertintotest3select*fromtest2whereidin(selectidfromtest2wherepower<100);
2.3、update更新
update语句也可以使用子查询,update内的子查询,在set更新内容时,可以是单独的一列,也可以是多列
updatetest2setpower=555whereidin(selectidfromtest3wherepower<0);
2.4、delete删除
selete也使用与子查询
deletefromtest2whereidin(selectidfromtest3wherepower<50);
2.5、exists
exists这个关键字在子查询时,主要用于判断子查询的结果集是否为空,如果不为空,则返回ture,反之则返回false
注:在使用exists时,当子查询有结果时,不关心子查询的内容,执行主查询操作,当子查询没有结果时,则不执行主查询操作
三、MySQL视图
视图是一张虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射
功能:
1、简化查询结果集、灵活查询,可以针对不同用户呈现不同结果集,相对有更高的安全性
2、本质而言,视图是一种select(结果集的呈现)
注意:视图适合于多表浏览时使用,不适合增,删,改
3.1、视图与表的区别
视图是语句编译好的sql语句,而表不是
视图没有实际的物理记录,而表有
表占用物理空间而视图不占用物理空间
视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些sql语句的集合
从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构
表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表
视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的)
3.2、视图与表的联系
视图(view)是在基本表之上建立的表,它的结构(即定义的列)和内容(即所有数据行)都来自基本表
一个视图可以对应一个基本表,也可以对应多个基本表
视图是基本表的抽象和在逻辑意义上建立的新关系。
#创建视图
createview视图表名saselect*from表名where条件;
#查看视图
select*from视图表名
#查看表状态
showtablestatus\G
#查看视图结构
desc视图表名
修改视图表数据
当数据发送变化时,若数据与之前创建视图表时的关联条件不一致时,视图表的数据将会发送改变
updatename_viewsetpower=300whereid=4;
select*fromname_view;
select*fromname;
更改源表数据
updatename_viewsetpower=100whereid=2;
select*fromname_view;
select*fromname;
四、NULL值
在SQL语句使用过程中,接触会碰到NULL这几个字符。通常使用NULL来表示缺失的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用NOTNULL关键字,不使用则默认可以为空。在向表内插入记录或者更新记录或者更新记录时,如果该字段没有NOTNULL并且没有值,这时候新记录的该字段将被保存为NULL。需要注意的是,NULL值与数字0或者空白(spaces)的字段是不同的,值为NULL的字段是没有值的。在SQL语句中,使用ISNULL可以判断表内的某个字段是不是NULL值,相反的用ISNOTNULL可以判断不是NULL值。
4.1、NULL值与空值区别
空值长度为0,不占空间,NULL值得长度为null,占用空间
isnull无法判断空值
空值使用"=“或者”<>"来处理(!=)
count()计算时,NULL会忽略,空值会加入计算
注:NULL是占用内存空间的,而空值则不占用内存空间
altertablenameaddcardchar(10);
select*fromname;
selectcount(card)fromname;
updatenamesetcard=''whereid=3;
select*fromname;
selectcount(card)fromname;
4.2、查询空值与非空值
select*fromnamewherecardisnull;
select*fromnamewherecardisnotnull;
五、连接查询
MySQL的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。
使用较多的连接查询包括:内连接、左连接和右连接
5.1、内连接
MySQL中的内连接就是两种或多张表中同时符合某种条件的数据记录的组合
通常在FROM子句中使用关键子INNERJOIN来连接多张表,并使用ON子句设置连接条件,
内连接是系统默认的表连接,所以在FROM子句后可以省略INNER关键字,只使用关键字JOIN。
同时有多个表时,也可以连续使用INNERJOIN来实现多表的内连接。
不过为了更好的性能,建议最好不要超过三个表。
内连查询:通过innerjoin的方式将两张表指定的相同字段的记录行输出出来
select表名1.字段1,表名1.字段2from表名1innerjoin表名2on表名1.字段=表名2.字段;
selectname.id,name.name,name.addressfromnameinnerjointest2onname.id=test2.id;
5.2、左连接
左连接也可以被称为左外连接,在FROM子句中使用LEFTJOIN或者LEFTOUTERJOIN关键字来表示。
左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。
select*fromnameleftjointest2onname.id=test2.id;
5.3、右连接
右连接也被称为右外连接,在FROM子句中使用RIGHTJOIN或者RIGHTOUTERJOIN关键字来表示。
右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。
|