MySQL进阶sql语句①

一.MySQL进阶查询

1.1排序(order by)

①使用order by 语句进行排序

  • ASC:升序,默认的排序,使用order by时,会默认该排序
  • DESC:降序
  • 排序可针对对一个或多个字段,多字段要第一个字段有重复,第二个字段的排序才会生效

order by  语法结构:对单或多字段进行升序或降序排序

select 字段1,字段2,... from  表名  order by   排序字段1,排序字段2, ... ASC|DESC;
select id,name,hobbid from test order by hobbid desc,id desc; //当第一个字段重复时,第二个字段的排序才生效

多字段排序

order by  语法结构:结合where条件进行过滤

select name,score from test where address='hangzhou' order by score desc;

order by  语法结构:结合and或者or进行区间判断

select 字段名  from 表名 where 条件1 (and|or) 条件2 (and|or)条件3;
select
* from test where score >70 and score <=90; //70到90包括90区间

order by  语法结构:结合嵌套查询,优先子嵌套

select * from 表名 where 条件1 or 条件2 (条件3 and 条件4);  //有括号会先执行括号里的内容然后再去执行括号外的
select
* from test where score >70 or (score >75 and score <90); //优先子子查询

1.2去重(distinct)

distinct 查询不重复记录

select distinct 字段 from 表名;

1.3分组(group by)

通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现 ,GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。

select conut(字段) from 表名 group by 字段;
select
count(name),hobbid from test group by hobbid; //对hobbid进行分组,并进行计数统计

 

#筛选分数大于等于80的分组,并计算个数
select
count(name),hobbid from test where score>=80 group by hobbid;

 

#结合order by把计算出的个数按升序排列
select count(name),score,hobbid from test where score>=80 group by hobbid order by count(name);

 

1.4限制条目(limit)

  • limit 限制输出的结果记录
  • 在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录(行)。
  • 有时候仅 需要返回第一行或者前几行,这时候就需要用到 LIMIT 子句。
select 字段 from 表名 limit  限制条件;
select * from test limit 3; //显示前4行信息,属性行属于0,也算作一条

select * from test limit 32;   //显示前3行记录的后2行

 

select * from test order by id desc limit 3//显示最后三行,可以先进行排序再限制

 

1.5 别名(alias | as)

  • 在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者 多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性。
  • 在使用 AS 后,可以用 alias_name 代替 table_name,其中 AS 语句是可选的。AS 之后的别名,主要是为表内的列或者表提供临时的名称,在查询过程中使用,库内实际的表名 或字段名是不会被改变的。
  • 如果表的长度比较长,可以使用 AS 给表设置别名,在查询的过程中直接使用别名。

#不用as也可以,一样显示,使用空格
对于列的别名:select 字段名 as 你想要设置的别名 from 表名; 对于表的别名:select 表的别名.字段 as 字段的别名 from 表名 as 设置的表的别名;

使用场景:
①对复杂的表进行查询的时候,别名可以缩短查询语句的长度
②多表相连查询的时候(通俗易懂、减短sql语句)

 

  • AS 还可以作为连接语句的操作符。
  • 创建t1表,将test表的查询记录全部插入t1表。

①创建了一个新表t1 并定义表结构,插入表数据(与info表相同)
②但是”约束“没有被完全”复制“过来 #但是如果原表设置了主键,那么附表的:default字段会默认设置一个0

create table t1 as select * from test;
select * from t1;

 

 注意:

  • 在为表设置别名时,要保证别名不能与数据库中的其他表的名称冲突。
  • 列的别名是在结果中有显示的,而表的别名在结果中没有显示,只在执行查询时使用。

1.6通配符( _   % )

  • 通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。
  • 通常通配符都是跟 LIKE 一起使用的,并协同 WHERE 子句共同来完成查询任务。常用的通配符有两个
  • %:百分号表示零个、一个或多个字符 
  • _ :下划线表示单个字符
select id,name from test where name like '张%';  //查询name以张开头的记录

 

 

 

 

1.7子查询 (in)

子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。
PS: 子语句可以与主语句所查询的表相同,也可以是不同表。

select 字段 from 表名 where 条件 in (select 字段 from 表名 where 条件);

  select name,score from test where id in (select id from test where score >80); //同表查询

 

子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。

select name,score from test where id in (select id from test where score>80);  //查询分数大于80的记录

#子查询还可以用在 INSERT 语句中。子查询的结果集可以通过 INSERT 语句插入到其 他的表中
insert into t1 select * from test where id in (select id from test); //通过子查询数据插入数据

#UPDATE 语句也可以使用子查询。UPDATE 内的子查询,在 set 更新内容时,可以是单独的一列,也可以是多列。
update test set score=50 where id in (select * from t2 where id=2); //子条件id=2的test表内的score更新为50

#DELETE 也适用于子查询
delete from test where id in (select id where score>80); //删除分数大于80的数据

 

二.MySQL数据库函数

可以对 MySQL 常用函数进行简单的分类,大概包括数值型函数、字符串型函数、日期时间函数、聚合函数等。

2.1MySQL 数值型函数

函数名称作 用
ABS 求绝对值
SQRT 求二次方根
MOD 求余数
CEIL 和 CEILING 两个函数功能相同,都是返回不小于参数的最小整数,即向上取整
FLOOR 向下取整,返回值转化为一个BIGINT
RAND 生成一个0~1之间的随机数,传入整数参数是,用来产生重复序列
ROUND 对所传参数进行四舍五入
SIGN 返回参数的符号
POW 和 POWER 两个函数的功能相同,都是所传参数的次方的结果值
SIN 求正弦值
ASIN 求反正弦值,与函数 SIN 互为反函数
COS 求余弦值
ACOS 求反余弦值,与函数 COS 互为反函数
TAN 求正切值
ATAN 求反正切值,与函数 TAN 互为反函数
COT 求余切值

2.2MySQL字符串函数

函数名称作 用
LENGTH 计算字符串长度函数,返回字符串的字节长度
CONCAT 合并字符串函数,返回结果为连接参数产生的字符串,参数可以使一个或多个
INSERT 替换字符串函数
LOWER 将字符串中的字母转换为小写
UPPER 将字符串中的字母转换为大写
LEFT 从左侧字截取符串,返回字符串左边的若干个字符
RIGHT 从右侧字截取符串,返回字符串右边的若干个字符
TRIM 删除字符串左右两侧的空格
REPLACE 字符串替换函数,返回替换后的新字符串
SUBSTRING 截取字符串,返回从指定位置开始的指定长度的字符换
REVERSE 字符串反转(逆序)函数,返回与原始字符串顺序相反的字符串

3.3时间和日期函数

函数名称作 用
CURDATE 和 CURRENT_DATE 两个函数作用相同,返回当前系统的日期值
CURTIME 和 CURRENT_TIME 两个函数作用相同,返回当前系统的时间值
NOW 和  SYSDATE 两个函数作用相同,返回当前系统的日期和时间值
UNIX_TIMESTAMP 获取UNIX时间戳函数,返回一个以 UNIX 时间戳为基础的无符号整数
FROM_UNIXTIME 将 UNIX 时间戳转换为时间格式,与UNIX_TIMESTAMP互为反函数
MONTH 获取指定日期中的月份
MONTHNAME 获取指定日期中的月份英文名称
DAYNAME 获取指定曰期对应的星期几的英文名称
DAYOFWEEK 获取指定日期对应的一周的索引位置值
WEEK 获取指定日期是一年中的第几周,返回值的范围是否为 0〜52 或 1〜53
DAYOFYEAR 获取指定曰期是一年中的第几天,返回值范围是1~366
DAYOFMONTH 获取指定日期是一个月中是第几天,返回值范围是1~31
YEAR 获取年份,返回值范围是 1970〜2069
TIME_TO_SEC 将时间参数转换为秒数
SEC_TO_TIME 将秒数转换为时间,与TIME_TO_SEC 互为反函数
DATE_ADD 和 ADDDATE 两个函数功能相同,都是向日期添加指定的时间间隔
DATE_SUB 和 SUBDATE 两个函数功能相同,都是向日期减去指定的时间间隔
ADDTIME 时间加法运算,在原始时间上添加指定的时间
SUBTIME 时间减法运算,在原始时间上减去指定的时间
DATEDIFF 获取两个日期之间间隔,返回参数 1 减去参数 2 的值
DATE_FORMAT 格式化指定的日期,根据参数返回指定格式的值
WEEKDAY 获取指定日期在一周内的对应的工作日索引

3.4聚合函数

函数名称作用
MAX 查询指定列的最大值
MIN 查询指定列的最小值
COUNT 统计查询结果的行数
SUM 求和,返回指定列的总和
AVG 求平均值,返回指定列数据的平均值

3.5MySQL 流程控制函数

函数名称作用
IF 判断,流程控制
IFNULL 判断是否为空
CASE 搜索语句

 

三.总结

本章介绍了select 的高阶语句

order by 降序升序排序

order by 分组

and和or的使用

distinct的去重查询

limit 限制输出

as的别名设置

通配符_和% 的使用

函数的了解:对函数分类==》数值型函数、字符串型函数、日期时间函数、聚合函数

posted @ 2022-12-04 20:39  索罗大魔王  阅读(78)  评论(0编辑  收藏  举报