常用和实用的sql语句

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 常用和实用的sql语句,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

前言

在工作有一段时间了,对于sql不能说得心应手,但是也更加的熟练,当然,为了方便自己后续的开发以及方便自己查找,在这里我会整理出一份关于sql的实用的sql语句,如遇到没有写在这里,后续又遇到的sql语句,将会在本文章进行更新

sql语句

建数据库

CREATE DATABASE `数据库名` CHARACTER SET 'utf8';

建表

CREATE TABLE 表名 (列名1 数据类型1, 列名2 数据类型2,... 列名n 数据类型n);

默认值设置

  • 建表时候创建默认值
CREATE COLUMN TABLE 表名 (
列名1 数据类型 DEFAULT 默认值);
  • 建表之后修改默认值
ALTER TABLE 表名 ALTER(列名 数据类型 DEFAULT 默认值) 
  • 设置表注释
ALTER TABLE 表名 COMMENT='注释内容';
  • 设置字段类型和注释
ALTER TABLE 表名 MODIFY COLUMN 列名1 数据类型 DEFAULT 默认值 NOT NULL COMMENT '注释内容';
  • 修改表名
ALTER TABLE表名 RENAME TO 需要修改的表名;
  • 设置字段允许为空
alter table 表名 modify column 字段 数据类型 null;
  • 增加一个字段,设好数据类型,且不为空,添加注释
alter table 表名 add `列名` 数据类型 not null comment '注释内容';
  • 增加主键
    数据类型一般为INTEGER
alter table 表名 add 列名 int(5) not null ,add primary key (列名);
  • 增加自增主键
    数据类型一般为INTEGER
alter table 表名 add 列名 int(整数) not null auto_increment;
  • 修改自增主键
alter table 表名  modify column 列名 int(整数) auto_increment ;
  • 修改字段名字(要重新指定该字段的类型)
alter table 表名 change 原列名 新列名 数据类型;
  • 删除字段
alter table 表名 drop 列名;
  • 数据类型-是列的数据类型,比如char、date、number等

清空表数据

truncate table 表名;
delete * from 表名;

注 : truncate操作中的table可以省略,delete操作中的*可以省略

删除表

drop table 表名;

drop 是直接将表格删除,无法找回。

基础查询

以下为查询某表中所有数据
select * from 表名;
以下为查询某表中特定的列的值
select 列名1, 列名2, 列名3 from 表名;
当创建多个数据库,且多个数据库有同名表
则在查询的时候需要带上数据库名
select * from 数据库名.表名;
表是可以起别名的,如果有别名的话,我们检索数据就可以以别名为开始
select 别名.列名1, 别名.列名2, 别名.列名3 from 表名 别名;
能够给查询到的列名取别名
如果别名是英文,则正常编写
如果别名是中文,则需要带双引号""
select  列名1 as otherName from 表名;
select  列名1 as "别名" from 表名;
当数据量大的时候,可以对查询的条数作限制
limit

示例:返回 表中不多于 5 行的数据(因为有可能数据没有5行)

select 列名1, 列名2, 列名3 from 表名 limit 5; 

示例:从表中 第5行 开始检索 3 行数据

select 列名1, 列名2, 列名3 from 表名 limit 5 , 3;
去重复
distinct关键字能够对数据库表中`一个`或者`多个`字段重复的数据进行过滤,
只返回其中的一条数据给用户,distinct只可以在select中使用 。
select distinct  列名1 from 表名;
  • 在对字段进行去重的时候,要保证distinct在所有字段的最前面
  • 如果distinct关键字后面有多个字段时,则会对多个字段进行组合去重,只有多个字段组合起来的值是相等的才会被去重
计数count
使用count能够对某表中的某列名或多个列名进行统计
select count(列名1) as "计数" from 表名;
使用条件过滤查询的数据
where
select 列名1 from 表名 where 列名2=;
以下为可用于where条件的符号
符号 描述 备注
= 等于
<>, != 不等于
> 大于
< 小于
<= 小于等于
>= 大于等于
BETWEEN 在两值之间 必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分隔
NOT BETWEEN 不在两值之间 必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分隔
IN 在集合中 使用in需要带(),在()内填写值,多个值用,分割
NOT IN 不在集合中 使用not in需要带(),在()内填写值,多个值用,分割
<=> 严格比较两个NULL值是否相等 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0
LIKE 模糊匹配 使用like需要在在查找匹配的字符加%,如:‘%我是需要查询的字符%’ 或’字符%’
IS NULL 为空
IS NOT NULL 不为空

示例:搜索xx字符开头的数据

select 列名1 from 表名 where 列名2 like 'xx%'

示例:搜索列名1有 xx字符的数据

select 列名1 from 表名 where 列名2 like '%xx%'

示例:搜索列名1开头是xx,结尾是z的数据

select 列名1 from 表名 where 列名2 like 'xx%z'

增加

insert into 表名(列名1,列名2,...) values(列名1的值, 列名2的值, .....);

删除

delete from 表名 where 条件;

修改

update表名 set 更新数据的列名 = 新值,更新数据的列名 = 新值... where 条件;

常用函数

1.1 avg(字段)

  • 返回指定字段的数据的平均值
  • avg() 通过对表中行数计数并计算指定字段的数据总和,求得该字段的平均值。
  • avg() 函数忽略列值为 NULL 的行,如果某行指定字段为null,那么不算这一行
select avg(列名1) as "平均数" from 表名;

1.2 count(字段)

  • 返回指定字段的数据的行数(记录的数量)
  • 字段可以为”“,为时代表所有记录数,与字段数不同的时,记录数包括某些字段为null的记录,而字段数不包括为null的记录。
select count(*) as "计数" from 表名;

1.3 max(字段)

  • 返回指定字段的数据的最大值
  • 如果指定字段的数据类型为字符串类型,先按字符串比较,然后返回最大值。
  • max() 函数忽略列值为 null的行
select max(列名1) as "最大值" from 表名;

1.4 min(字段)

  • 返回指定字段的数据的最小值
  • 如果指定字段的数据类型为字符串类型,先按字符串比较,然后返回最小值。
  • min()函数忽略列值为 null的行
select min(列名1) as '最小值' from 表名;

1.5 sum(字段)

  • 返回指定字段的数据之和
  • sum()函数忽略列值为 null的行
select sum(列名1) as "累加值" from 表名 ;

字符串相关

1.1合并字符串函数:concat(str1,str2,str3…)

  • 用于将多个字符串合并成一个字符串,如果传入的值中有null,那么最终结果是null
  • 如果想要在多个字符串合并结果中将每个字符串都分隔一下,可以使用
  • concat_ws(分隔符,str1,str2,str3…),如果传入的分隔符为null,那么最终结果是null(不过这时候如果str有为null不影响结果)
select concat('字符' , '串') ; --字符串

select concat_ws('-' , '字' , '符' , '串'); -- 字-符-串

1.2 比较字符串大小函数:strcmp(str1,str2)

  • 用于比较两个字符串的大小。左大于右时返回1,左等于右时返回0,,左小于于右时返回-1,
  • strcmp类似编程语言中的比较字符串函数(依据ascll码?),会从左到右逐个比较,直到有一个不等就返回结果,否则比较到结尾。
select strcmp('a' , 'b');   ---: -1
select strcmp('ab' , 'ac'); ---: -1
select strcmp('d' , 'a');   ---: 1
select strcmp('a' , 'a');   ---: 0

1.3 获取字符串字符数函数:char_length(str)

  • 用于获取字符串长度
select char_length('hello'); 	---: 5
select char_length('字符串');	  ---: 长度3,但是这个是需要注意编码格式,现在开发时使用的基本都是utf8、utf8mb4

1.4 字母大小写转换函数

大写:upper(x),ucase(x);

select upper('a');		---: A
select upper('abc'); 	---: ABC

小写:lower(x),lcase(x)

select lower('A');		---: a
select lower('B,字符串'); 	---: b,字符串

1.5字符串包含或不包含某字符串

使用like和not like

包含
select 列名1 from 表名 where 列名1 like '%字符串%'
不包含
select 列名1 from 表名 where 列名1 not like '%字符串%'

1.6查找子字符串在字符串的位置

返回字符串1在字符串2中的位置,字符串2包含若干个以逗号分隔的字符串(可以把字符串2看出一个列表,元素是多个字符串,查找结果是字符串1在字符串2这个列表中的索引位置,从1开始)

select find_in_set(列名1(或字符串) , 列名2) from 表名 where 列名="条件";
select find_in_set('abc' , '123,abc,456');---2

field:与find_in_set类似,但字符串2由一个类似列表的字符串变成了多个字符串,返回字符串在字符串1,字符串2,字符串3…中的位置

select field('abc' , '123','abc','456');---2

1.7查找子字符串在字符串中首次出现的位置

select locate(列名1(或字符串) , 列名2);
select locate('a' , '123a123a'); ---: 4

1.8返回子字符串在字符串中第一次出现的位置

select position(字符串 in 列名2);
select position('a' in '123abc456abc'); ---: 4

1.9返回字符串在子字符串首次出现的位置

select instr(列名2 , 字符串);
select instr('123abc456abc' , 'a'); ---: 4

1.10获取指定位置的子字符串

返回指定index下标位置的字符串

select elt( 下标, 字符串1 ,字符串2 ,字符串3);
select elt( 1, 'a' ,'b' ,'c') ; ---: a

1.11截取字符串左边n个字符

select left(字符串(列名) , n);
select left('superman' , 5); ----: super

1.12截取字符串右边n个字符

select right(字符串(列名) , n);
select right('superman' , 3); ----: man

1.13从字符串第n位置截取m个字符串

select substring(字符串(列名) , n, m);
select substring('iamsuperman' , 4, 5) ; ---: super

1.14去除字符串左边空格

select ltrim(字符串(列名));
select ltrim('  hello jack'); ----: hello jack

1.15去除字符串右边空格

select rtrim(字符串(列名));
select rtrim('  hello jack  '); ----:   hello jack

1.16去除字符串两边空格

select trim(字符串(列名));
select trim('  hello jack  '); ----: hello jack

1.17将子字符串从字符串的第n位置替换m个字符

select insert(字符串 , n , m , 子字符串); 
select insert('hello world' , 7 , 5 , 'amy'); ---: hello amy

1.18将字符串包含子字符串1的部分全部替换为子字符串2

select replace(字符串 , 字符串1 , 字符串2);
select replace('123 admin 456admin' , 'admin' , 'jack'); ---: 123 jack 456jack

数值相关

1.1绝对值

select abs(负数数值);

1.2向上取整

select ceil(浮点数);
select ceil(3.14); ---: 3.4

1.3向下取整

select floor(浮点数);
select floor(3.14); ---: 3

1.4随机数

返回0-1内的随机数
如果想对某种情况都使用同一随机值,可以使用rand(x),x相同时返回同样的随机结果

select rand(0); ---: 0.15522042769493574

日期相关

1.1获取当前日期

select curdate(); ---: xxxx-xx-xx(如2022-07-15)

1.2获取当前时间

select curtime(); ---: xx:xx:xx(如07:32:00)

1.3获取当前日期

select now(); ---: xxxx-xx-xx xx:xx:xx(如2022-07-15 08:33:00)

1.4从日期中选择出月份

select month( now() ); ---: 如:7

1.5从日期中选择出周数

select week( now() ); ---: 如:33 从当前年开始计算的周数

1.6从日期中选择年份

select year( now() ); ---: 2022 当前年的年份

1.7从时间选择出小时数

select hour( curtime() ) ; ---: 14 运行时间是 14点

1.8从时间选择出分钟数

select minute( curtime() ) ; ---: 24 运行时间是 14点24分

1.9从时间选择出今天是周几

select weekday( curdate() ); ---:4   从0 开始计算
select dayname( curdate() ); ---: Friday

1.10返回日期时间中的日期部分

select date( now() ); ---: now() 函数也可以替换为表的某个时间格式的列名 如: 2022-07-15 14:27:00

1.11返回一个格式化的日期或时间串

date 参数是合法的日期。format 规定日期/时间的输出格式

格式 描述
%a 缩写星期名
%b 缩写月名
%c 月,数值
%D 带有英文前缀的月中的天
%d 月的天,数值(00-31)
%e 月的天,数值(0-31)
%f 微秒
%H 小时 (00-23)
%h 小时 (01-12)
%I 小时 (01-12)
%i 分钟,数值(00-59)
%j 年的天 (001-366)
%k 小时 (0-23)
%l 小时 (1-12)
%M 月名
%m 月,数值(00-12)
%p AM 或 PM
%r 时间,12-小时(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 时间, 24-小时 (hh:mm:ss)
%U 周 (00-53) 星期日是一周的第一天
%u 周 (00-53) 星期一是一周的第一天
%V 周 (01-53) 星期日是一周的第一天,与 %X 使用
%v 周 (01-53) 星期一是一周的第一天,与 %x 使用
%W 星期名
%w 周的天 (0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位
select DATE_FORMAT(now() , '%Y-%m-%d %H:%i:%S'); ---: 2019-08-21 09:06:18

分组和排序

分组 Group by

SQL聚集函数可用来汇总数据。这使我们能够对行进行计数,计算和与平均数,获得最大和最小值而不用检索所有数据。

如:当你需要在某个表,根据某个字段进行分组区分数据,就可以用到group by

select 列名1 fromwhere 条件 group by 列名1

分组示例:统计表A中列名1中A和B的数据各多少

SELECT  count(列名1) FROM 表A where 条件 group by 列名1
group by 规则
为了能够使用group by应遵循以下原则
1.除了计算聚合函数外,有几个列名,就需要对几个列名进行分组
2.如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
3.GROUP BY子句必须出现在WHERE子句之后 (如果有 WHERE 子句的话 ),ORDER BY子句之前。

过滤分组 having

除了能用GROUP BY分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。例如,可能想要列出至少有两个订单的所有顾客。为得出这种数据,必须基于完整的分组而不是个别的行进行过滤。

之前我们使用 WHERE 子句进行数据过滤。但是过滤指定的是行而不是分组。事实上,WHERE没有分组的概念。

HAVING 非常类似于 WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是
WHERE过滤行,而HAVING过滤分组。

最重要的一点 : having 语句中可以使用函数
SELECT  *  FROM 表名 group by 列名1  having 条件;

Order by 排序

order by位置

1. 在给出ORDER BY子句时,应该保证它位于FROM子句之后
2. 如果使用 LIMIT,它必须位于ORDER BY之后。使用子句的次序不对将产生错误消息。

order by 执行顺序

1. 执行 from
2. 执行 where
3. 执行 select 
4. 执行 order by

order by 可对一个或多个列名进行排序,如按照多个排序用逗号分隔,

单列排序
select * from 表名 order by 列名1
多列排序
select * from 表名 order by 列名1 , 列名2  

升序和降序排序

默认为升序排序,即(从A-Z) 使用ASC,可省略
降序排序(从Z-A) 使用DESC

升序排序
select * from 表名 order by 列名1 asc
降序排序
select * from 表名 order by 列名1 desc

表连接(联结)查询

表连接查询的前提:

至少有两个及以上的表
且这些表有对应至少一个的相同的数据列名字段

内连接(inner join … on …)

假定两个表的各自的列名1是相同关联字段

select * from1 
inner join2 on1.列名1 =2.列名1 
where 条件

也可以有多个对应相同的关联字段

select * from1 
inner join2 on1.列名1 =2.列名1 and1.列名2 =2.列名2
where 条件

左连接 (left join … on …)

假定有两个表,左边的表设定为表1,右边的表设定为表2,
那么左连接为主要查找左边表有的数据

select * from1 
left join2 on1.列名1 =2.列名1 
where 条件

也可以有多个对应相同的关联字段

select * from1 
left join2 on1.列名1 =2.列名1 and1.列名2 =2.列名2
where 条件

右连接 (right join … on …)

假定有两个表,左边的表设定为表1,右边的表设定为表2,
那么右连接为主要查找右边表有的数据

select * from2 
right join1 on1.列名1 =2.列名1 
where 条件

也可以有多个对应相同的关联字段

select * from2 
right join1 on1.列名1 =2.列名1 and1.列名2 =2.列名2
where 条件

组合查询

使用 UNION操作符来组合数条SQL查询。利用UNION,可给出多条SELECT语句,将它们的结果组合成单个结果集

UNION的使用很简单。所需做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION

示例

第一条sql

   select * from1 where 条件;

第二条sql

   select * from1 where 条件;

组合查询

select * from1 where 条件
union
select * from1 where 条件
union使用规则
1. UNION 必须由两条或两条以上的 SELECT 语句组成,语句之间用关键字 UNION 分隔 
2. UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)
3. 列数据类型必须兼容:类型不必完全相同,但必须是数据库可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)

union all 包含或取消重复的行

UNION从查询结果集中自动去除了重复的行,这是UNION的默认行为,但是如果需要,可以改变它。事实上,如果想返回所有匹配行,可使用 UNION ALL 而不是 UNION

select * from1 where 条件
union all
select * from1 where 条件

对组合查询进行排序
在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。

select * from1 where 条件
union
select * from1 where 条件
order by 列名1

创建视图view

视图是虚拟的表。与包含数据的表不一样,视图只包含使用时
动态检索数据的查询

视图创建非常简单,就是在 CREATE VIEW 视图名 AS 后面跟上查询语句即可。

CREATE VIEW `视图名` AS 
SELECT * FROM 表名

视图的作用

  • 重用SQL语句。
  • 简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节。
  • 使用表的组成部分而不是整个表。
  • 保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
  • 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。

注意事项

视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能下降得很厉害。因此,在部署使用了大量视图的应用前,应该进行测试。

视图的规则和限制

  • 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字) 。
  • 对于可以创建的视图数目没有限制。
  • 为了创建视图,必须具有足够的访问权限。这些限制通常由数据库管理人员授予。
  • 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图。
  • ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDER BY,那么该视图中的ORDER BY将被覆盖。
  • 视图不能索引,也不能有关联的触发器或默认值。
  • 视图可以和表一起使用。例如,编写一条联结表和视图的SELECT语句。

结语

以上为本人整理的实用sql语句,如有遇到新的会在本文章更新

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136668.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!