Mysql-SQL语句

 2022-08-13    2 条评论    82389 浏览

mysql

增加

Insert

insert into table_name ( field1, field2,...fieldn ) values( value1, value2,...valuen );

Select Into From(mysql不支持)

SELECT column_name(s)
INTO newtable [IN externaldb]
FROM table1;

Insert Select(mysql支持)

insert table_name select field1, field2 from table_list where search_condirions

复制表

create table 新表 as select * from 旧表

查询

精准查询

where后可加筛选条件

查询id等于1的某几列属性值
select field1, field2 from table_name where id = 1
查询id不等于1的所有列属性值
select * from table_name where id != 1
其他逻辑符号
操作符描述
=等号,检测两个值是否相等,如果相等返回true
<>, !=不等于,检测两个值是否相等,如果不相等返回true
>大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true
<小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true
>=大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true
<=小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true

like查询

select * from table_name where field like '%redis%'

And查询

select field1, field2 from table_name where field3 = '判断条件1' AND field4 = '判断条件2'

UNION查询

UNION会将将多个select查询结果合并,重复数据会被删除

SELECT field1, field2, ... field_n
	FROM table_name1 [WHERE conditions]

UNION [ALL | DISTINCT]

SELECT field1, field2, ... field_n
	FROM table_name2 [WHERE conditions];
参数
  • field1, field2, ... field_n: 要检索的列。

  • table_name: 要检索的数据表。

  • WHERE conditions: 可选, 检索条件。

  • DISTINCT: 可选,删除结果集中重复的数据。默认情况下即为此项,加于不加相同。

  • ALL: 可选,返回所有结果集,包含重复数据。

排序查询

使用order关键词进行排序

SELECT
	field1,
	field2,
	...fieldN
FROM
	table_name1,
	table_name2...
WHERE
	XXX
ORDER BY
	field1 [ASC [DESC][默认 ASC]],
	[field2...] [ASC [DESC][默认 ASC]]

ASC、DESC可选,默认ASC ASC:升序(从小到大) DESC:降序(从大到小) 一般最新数据展示在前时,使用DESC

分组查询

通过group by在查询时以某个值为基准进行分组,此值相同的数据合并为一组

统计某个值个数
select field1, count(field1) from table_name group by field1
Group By+Having

分组查询可以通过having对分组后的统计数据进行筛选

select field1, count(1) as num from table_name group by field1 HAVING num > 4
Having 和 Where 的区别
  • where对分组前数据进行过滤,having对分组后数据进行过滤
  • having后面可以使用分组函数(统计函数),where后面不可以使用分组函数
  • 如果某行记录没有满足where筛选条件,那么这行记录不会参加分组;而having是对分组后数据的约束
示例
select field1, count(field1) as num from table_name where field1 !='数据库' group by field1 having num > 4 and count(field2) >8
此Sql的执行顺序
FROM 表

WHERE 条件

GROUP BY 分组字段

HAVING 分组筛选

SELECT 字段列

LIMIT 分页

ORDER BY 排序字段

关联查询

关联查询包括四种基础查询

  • 内关联查询:取多表的交集
  • 左关联查询:取左表数据以及右表的交集,右表不符合部分取null。
  • 右关联查询:取右表数据以及左表的交集,左表不符合部分取null。
  • 全关联查询:(mysql不支持)取多表值合并去重。若无筛选条件会出现笛卡尔积。

**注:mysql不支持全关联查询,会报错。 **

测试数据集

表1 left_table

left1left2
1left_1
4left_4
5left_5

表2 right_table

right1right2
1right_1
2right_2
3right_3

内关联查询

内关联可以使用关键词inner join,也可以直接在关联表中间用逗号。

双表内关联
select lt.left2, rt.right2 from left_table lt , right_table rt where lt.left1 = rt.right1

结果

left2right2
left_1right_1
多表内关联
select 
  a.field1, b.field2, c.field3 ... 
from 
  table1 a, table2 b, table3 c ... 
where 
  a.fielda = b.fieldb and b.fieldb = c.fieldc ...

左关联查询

左关联查询实质上为取表交集以及左表特有数据。或者说取左表全部数据加上右边与左表的交集数据。右表不符合条件导致缺失的部分用null填充。

外关联查询使用join on

select lt.left2, rt.right2 from left_table lt left join right_table rt on lt.left1 = rt.right1 
  1. 此sql将会先查询表table1与表table2两个表id相等的部分数据。
  2. 取交集数据中的table1的field1与table2的field2,作为结果列。
  3. 再取表table1其余部分数据的field1,field2列使用null填充。
  4. 数据合并返回查询结果。

查询结果为

left2right2
left_1right_1
left_4NULL
left_5NULL

右关联查询

右关联查询实质上为取表交集以及右表特有数据。或者说取右表全部数据加上右边与左表的交集数据。左表不符合条件导致缺失的部分用null填充。

外关联查询使用join on

select lt.left2, rt.right2 from left_table lt right join right_table rt on lt.left1 = rt.right1 
  1. 此sql将会先查询表table1与表table2两个表id相等的部分数据。
  2. 取交集数据中的table1的field1与table2的field2,作为结果列。
  3. 再取表table2其余部分数据的field2,field1列使用null填充。
  4. 数据合并返回查询结果。

查询结果

left2right2
left_1right_1
NULLright_2
NULLright_3

修改

更新多列数据

update table_name set field1 = 11, field2 = 'nosql' where field3 like '%redis%'

连表更新

更新某列数据为其他表某列数据
update table_name tb, (select id, name from table_name2) b set tb.id = b.id where tb.name = b.name

update table_name tb set tb.id = (select tc.id from table_name2 tc where tc.name = tb.name)

删除

条件删除

删除一定要有where筛选条件,否则会删除所有数据。 where筛选条件一定要确定好,符合条件的都会被删除。

delete from table_name where id = 1

库语句