SQL语句
标签(空格分隔): 数据库 MySQL
概念:
数据库->表->(行:一个数据记录 列:一个字段)
主键:能唯一标志表中每一行的 一列
任意两行都不具有相同的主键值
任意主键列中的值不能重用
主键列中的值不能修改删除
每个行都必须有主键
外键:外键是表中的一个列,其值必须在另外一个表的主键中列出,外键是保证引用完整性的一个极其重要的成分
外键可以帮助防止意外的删除
检索数据:
select prod_name
from Tablaes;
排序数据:
select dat_name1,dat_name2 ...
from tables
order by dat_name1,dat _name2 ....
desc/asc(默认,递增)
Where条件过滤
where子句操作符:
= 等于
<> 、 != 不等于
< 、 <= 、 !< 小于、小于等于、不小于
> 、 >= 、 !> 大于、大于等于、不大于
between a and b 在两者之间
is null 为null值
select dat_name
from table
where dat_name
between A and B
where条件中And和OR的计算次序:And的优先级较高,所以先计算And的条件(一般要用括号表示计算顺序)
IN :用来指定条件范围:
Select dat_name
from table
where dat_name
in (A,B....)
相当于:
select dat_name
from table
where dat_name=A or dat_name=B
order by dat_name
LIKE操作符:通配符,用来匹配一部分的特殊字符(只能用于文本字段。非文本字段不能使用通配符搜索)
%:出现任意次数
—:与%类似,但是,只出现一次
[]:用来指定一个字符集,他必须匹配指定位置的一个字符 [^JM]以J或M开头;[!JM]不是以JM开头的数据
Select dat_name
from tables
where data_name
like 'AA%B'
搜索以AA开头,B结尾的数据
拼接字段:+ 或者 || ,将值联接到一起构成单个值 ,
使用别名 as
select dat_nam1+dat_name2
as vend_title (创建了vend_title字段)
from tables
order by dat_name1
Mysql不支持+和||运算符,他使用concat()函数:
select concat(dat_name1,dat_name2)
from table
order by dat_name
RTRIM(dat_name):去除dat_name字段右侧的空格
TRIM(dat_name)去除dat_name字段两端的空格
LTRIM(dat_name) 去除dat_name字段左侧的空格
计算:
+ - * / 加减乘除、
函数:
upper() 将文本转换成大写
lower() 将文本准换成小写
left()返回串左边的字符
Length()返回串的长度
rtrim() 去掉右边的空格
trim()去掉两端的空格
ltrim()去掉发左边的空格
日期处理函数:
数值处理函数:ABS() 。。。
聚集函数:
AVG() 返回某列数据的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN()返回某列的最小值
SUM( ) 返回某列的和
对所有的行执行计算:指定ALL参数或不给参数
只对指定行执行计算:指定Distinct参数
SELECT AVG(distinct dat_name)
as dat_avg
from table
where dat_name='AAA';
分组数据:
group by
select dat_name, count(*) as num_prods
from table
group by num_prods;
having num_prods > 2 #过滤分组
GROUP BY子句必须出现在WHERE子句之后, ORDER BY子句之前
在具体使用GROUP BY子句前,需要知道一些重要的规定:
GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。
GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)C 如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
大多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如文本或备注型字段)。
除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。
如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。

HAVINQ和WHERE的差别这里有另一种理解方法i*WHERE在数据分组前进行过滤, HAVING在数据分组后进行过滤。这是一个重要的区别, WHERE排除的行不包括在分组中。这可能会改变计算值, 从而影响HAVING子句中基于这些值过滤掉的分组。

约束:用于限制加入表的数据的类型
可以在创建时规定约束(CREATE TABLE),也可以在表创建之后规定约束(ALTER TABLE )
常用的几种约束:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
LIMIT
Limit子句可以被用于强制 SELECT 语句返回指定的记录数。Limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
eg:
SELECT *
FROM table
LIMIT 5,10; //检索记录行6-15
SELECT *
FROM table
LIMIT 95,-1; // 检索记录行 96-last
如果只给定一个参数,它表示返回最大的记录行数目。换句话说,LIMIT n 等价于 LIMIT 0,n
SELECT *
FROM table
LIMIT 5; //检索前 5 个记录行
子查询
把一条SELECT语句返回的结果用千另一条SELECT 语句的WHERE子句
联结表
联结是一种机制,用来在一条SELECT语句中关联表,使用特殊的语法,可以连接多个表返回一组输出。
eg:
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
与普通的查询语句最大的区别在于,from后边跟了不止一个表,并且这里用了完全限定名。SQL对一条SELECT语句中可以联结的表的数目没有限制
笛卡尔积 由没有连接条件的表关系返回的结果为笛卡尔积,检索出的行的数目僵尸第一个表中行数乘以第二个标的行数。
内部联结(等值联结)
与上面的联结方式相同,但是语法有差异:
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;
这里两个表之间的关系是from子句的组成成分,以inner join指定。在使用这种语法时,连接条件用on子句而非where;
AS可以用来实现表别名,但是与列别名不同,表别名不返回到客户机。
内连接 inner join:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接 outer join:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
左外连接 left outer join:左边表数据行全部保留,右边表保留符合连接条件的行。
右外连接 right outer join:右边表数据行全部保留,左边表保留符合连接条件的行。
全外连接 full outer join:左外连接 union 右外连接。
关于内你联结,外联结,左联结,右联结等详细介绍:
https://blog.csdn.net/qq_39456689/article/details/80781590
union 组合查询
利用UNION操作符可以将多条SELECT语句组合成一个结果集,UNION的使用很简单。所需做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION。UNION从查询结果集中自动去除了重复的行
insert 插入数据
INSERT SELECT从其他表中导入行, 如何用SELECT INTO将行导出到一个新

INSERT还存在
另一种形式,可以利用它将一条SELECT语句的结果插入表中。这就是所谓的INSERT SELECT, 顾名思义,它是由一条INSERT语句和一条SELECT语句组成的。

更新数据 update
更新表中特定的行
更新表中所有的行
UPDATE语句总是以要更新的表的名字开始。SET命令用来将新值赋给被更新的列。
update table
set dat_name = val
where .... (如果没有where,则删除所有行)
删除数据 delete
delete from table
where 条件
有where是删除一行数据,没有是删除所有行(删除的是内容,而不是表)
创建表 create
create table table_name(
id char(10) not null defalt val,
...
)
更新表结构 alter
alter table tablename
add....
删除表 drop
drop table table_name
事务
事务处理是用来维护数据库的完整性,他保证 成批的SQL操作要么完全执行,要么完全不执行
事务处理的开始于结束
begin/start transaction
...
commit transaction
使用ROLLBACK 撤回SQL语句
明确的提交,使用COMMIT语句
保留点SAVE POINT
索引
create index indexid
on table(myindex)
在开始创建索引前, 应该记住以下内容:
0索引改善检索操作的性能,但降低数据插入、修改和删除的性能。在执行这些操作时, DBMS必须动态地更新索引。
回0索引数据可能要占用大盘的存储空间。
0并非所有数据都适合千索引。唯一性不好的数据(如州)从索引得到的好处不比具有更多可能值的数据(如姓或名)从索引得到的好处多。
0索引用千数据过滤和数据排序。如果你经常以某种特定的顺序排序数据, 则该数据可能是索引的备选。
0可以在索引中定义多个列(例如, 州加上城市)。这样的索引仅在以州加城市的顺序排序时有用。如果想按城市排序, 则这种索引没有用处。