在工作有一段时间了,对于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;
alert 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 列名;
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 表名;
最前面
多个字段
进行组合去重,只有多个字段组合起来的值是相等的才会被去重计数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 条件;
select avg(列名1) as "平均数" from 表名;
select count(*) as "计数" from 表名;
select max(列名1) as "最大值" from 表名;
select min(列名1) as '最小值' from 表名;
select sum(列名1) as "累加值" from 表名 ;
select concat('字符' , '串') ; --字符串
select concat_ws('-' , '字' , '符' , '串'); -- 字-符-串
select strcmp('a' , 'b'); ---: -1
select strcmp('ab' , 'ac'); ---: -1
select strcmp('d' , 'a'); ---: 1
select strcmp('a' , 'a'); ---: 0
select char_length('hello'); ---: 5
select char_length('字符串'); ---: 长度3,但是这个是需要注意编码格式,现在开发时使用的基本都是utf8、utf8mb4
大写:upper(x),ucase(x);
select upper('a'); ---: A
select upper('abc'); ---: ABC
小写:lower(x),lcase(x)
select lower('A'); ---: a
select lower('B,字符串'); ---: b,字符串
使用like和not like
包含
select 列名1 from 表名 where 列名1 like '%字符串%'
不包含
select 列名1 from 表名 where 列名1 not like '%字符串%'
返回字符串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
select locate(列名1(或字符串) , 列名2);
select locate('a' , '123a123a'); ---: 4
select position(字符串 in 列名2);
select position('a' in '123abc456abc'); ---: 4
select instr(列名2 , 字符串);
select instr('123abc456abc' , 'a'); ---: 4
返回指定index下标位置的字符串
select elt( 下标, 字符串1 ,字符串2 ,字符串3);
select elt( 1, 'a' ,'b' ,'c') ; ---: a
select left(字符串(列名) , n);
select left('superman' , 5); ----: super
select right(字符串(列名) , n);
select right('superman' , 3); ----: man
select substring(字符串(列名) , n, m);
select substring('iamsuperman' , 4, 5) ; ---: super
select ltrim(字符串(列名));
select ltrim(' hello jack'); ----: hello jack
select rtrim(字符串(列名));
select rtrim(' hello jack '); ----: hello jack
select trim(字符串(列名));
select trim(' hello jack '); ----: hello jack
select insert(字符串 , n , m , 子字符串);
select insert('hello world' , 7 , 5 , 'amy'); ---: hello amy
select replace(字符串 , 字符串1 , 字符串2);
select replace('123 admin 456admin' , 'admin' , 'jack'); ---: 123 jack 456jack
select abs(负数数值);
select ceil(浮点数);
select ceil(3.14); ---: 3.4
select floor(浮点数);
select floor(3.14); ---: 3
返回0-1内的随机数
如果想对某种情况都使用同一随机值,可以使用rand(x),x相同时返回同样的随机结果
select rand(0); ---: 0.15522042769493574
select curdate(); ---: xxxx-xx-xx(如2022-07-15)
select curtime(); ---: xx:xx:xx(如07:32:00)
select now(); ---: xxxx-xx-xx xx:xx:xx(如2022-07-15 08:33:00)
select month( now() ); ---: 如:7
select week( now() ); ---: 如:33 从当前年开始计算的周数
select year( now() ); ---: 2022 当前年的年份
select hour( curtime() ) ; ---: 14 运行时间是 14点
select minute( curtime() ) ; ---: 24 运行时间是 14点24分
select weekday( curdate() ); ---:4 从0 开始计算
select dayname( curdate() ); ---: Friday
select date( now() ); ---: now() 函数也可以替换为表的某个时间格式的列名 如: 2022-07-15 14:27:00
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
SQL聚集函数可用来汇总数据。这使我们能够对行进行计数,计算和与平均数,获得最大和最小值而不用检索所有数据。
如:当你需要在某个表,根据某个字段进行分组区分数据,就可以用到group by
select 列名1 from 表 where 条件 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子句之前。
除了能用GROUP BY分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。例如,可能想要列出至少有两个订单的所有顾客。为得出这种数据,必须基于完整的分组而不是个别的行进行过滤。
之前我们使用 WHERE
子句进行数据过滤。但是过滤指定的是行而不是分组。事实上,WHERE
没有分组的概念。
HAVING
非常类似于 WHERE
。事实上,目前为止所学过的所有类型的WHERE
子句都可以用HAVING
来替代。唯一的差别是
WHERE过滤行,而HAVING过滤分组。
最重要的一点 : having 语句中可以使用函数
SELECT * FROM 表名 group by 列名1 having 条件;
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
表连接查询的前提:
至少有两个及以上的表
且这些表有对应至少一个的相同的数据列名字段
假定两个表的各自的列名1是相同关联字段
select * from 表1
inner join 表2 on 表1.列名1 = 表2.列名1
where 条件
也可以有多个对应相同的关联字段
select * from 表1
inner join 表2 on 表1.列名1 = 表2.列名1 and 表1.列名2 = 表2.列名2
where 条件
假定有两个表,左边的表设定为表1,右边的表设定为表2,
那么左连接为主要查找左边表有的数据
select * from 表1
left join 表2 on 表1.列名1 = 表2.列名1
where 条件
也可以有多个对应相同的关联字段
select * from 表1
left join 表2 on 表1.列名1 = 表2.列名1 and 表1.列名2 = 表2.列名2
where 条件
假定有两个表,左边的表设定为表1,右边的表设定为表2,
那么右连接为主要查找右边表有的数据
select * from 表2
right join 表1 on 表1.列名1 = 表2.列名1
where 条件
也可以有多个对应相同的关联字段
select * from 表2
right join 表1 on 表1.列名1 = 表2.列名1 and 表1.列名2 = 表2.列名2
where 条件
使用 UNION
操作符来组合数条SQL查询。利用UNION
,可给出多条SELECT
语句,将它们的结果组合成单个结果集
UNION
的使用很简单。所需做的只是给出每条SELECT
语句,在各条语句之间放上关键字UNION
示例
第一条sql
select * from 表1 where 条件;
第二条sql
select * from 表1 where 条件;
组合查询
select * from 表1 where 条件
union
select * from 表1 where 条件
union使用规则
1. UNION 必须由两条或两条以上的 SELECT 语句组成,语句之间用关键字 UNION 分隔
2. UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)
3. 列数据类型必须兼容:类型不必完全相同,但必须是数据库可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)
UNION
从查询结果集中自动去除了重复的行,这是UNION的默认行为,但是如果需要,可以改变它。事实上,如果想返回所有匹配行,可使用 UNION ALL
而不是 UNION
select * from 表1 where 条件
union all
select * from 表1 where 条件
对组合查询进行排序
在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。
select * from 表1 where 条件
union
select * from 表1 where 条件
order by 列名1
视图是虚拟的表。与包含数据的表不一样,视图只包含使用时
动态检索数据的查询
视图创建非常简单,就是在 CREATE VIEW 视图名 AS 后面跟上查询语句即可。
CREATE VIEW `视图名` AS
SELECT * FROM 表名
视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能下降得很厉害。因此,在部署使用了大量视图的应用前,应该进行测试。
以上为本人整理的实用sql语句,如有遇到新的会在本文章更新