SQL
数据库优化法则
1、 减少数据访问(减少磁盘访问)
2、 返回更少数据(减少网络传输或磁盘访问)
3、 减少交互次数(减少网络传输)
4、 减少服务器CPU开销(减少CPU及内存开销)
5、 利用更多资源(增加资源)
基础
增删改查字段
#增加字段
-- 匿名方法 需要补全所有参数,顺序按照建表的顺序来,values必须要加多条数据
insert into 表名 value/values(值,...);
-- 指定字段 填好需要的就行了,顺序按自己指定的顺序来
insert into 表名(字段名,...) value/values(值,...);
-- 删除字段
delete from 表名 where 字段名=表名;
-- 更新字段
update 表名 set 字段名=值名,... where 字段名=值;
-- 查询
select 字段名,... from 表名 where 字段名=值 order by country,alexa;
-- 去重
select distinct 字段名,... from 表名 ;
-- 根据什么排序,放在条件语句之后,一般就放在最后面
order by 字段名
-- 条件判断
where xxx=xxx and xxx=xxx or xxx=xxx
整整库
create database 库名;
搞搞表
-- 建表语句
create table table_test(
id varchar(64) not null primary key,
tname varchar(255),
age varchar(255)
);
create table table_test2(
id varchar(64) not null,
tname varchar(255),
age varchar(255),
constraint pk_tt primary key (id, tname)
);
-- 删除表
drop table table_test;
-- 修改表语句
-- 增加列
alter table table_test add 列名 数据类型(长度) 约束;
-- 删除列
alter table table_test drop column 字段名;
-- 修改表结构
alter table table_test alter column 字段名 数据类型(长度) 约束;
约束
用于规定表中的数据规则,若存在违反约束的数据行为,行为终止。
not null(非空约束)
约束列不能为空
unique(唯一)
约束列唯一,不能重复
primary key(主键)
非空与唯一的并集,多个列唯一
-- 单主键
create table 表名(
字段名 数据类型(长度) 约束,
字段名 数据类型(长度) 约束
)
-- 多主键
create table 表名(
字段名1 数据类型(长度) 约束,
字段名1 数据类型(长度) 约束,
constraint 主键名 primary key (字段1,字段2)
)
-- 可以在修改表结构的时候多加上一个主键
foreign key(外键)
保证一个表中的数据匹配另一个表中的值的参照完整性
check (限定值的条件)
保证列中的值符合指定的条件
default(设默认值)
规定没有给列赋值时的默认值
auto_increment (自增)
查如字段时字段自增,只能是int类型
弄弄索
index
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
用户无法看到索引,它们只能用来加速搜索/查询
PS:
更新一个包含索引的表比更新无索引的表慢,
理想的做法是在常搜索的列(以及表)上加索引,
在常改的列上不加索引
-- 创建简单索引,可重复
create index 索引名 on 表名(字段名);
-- 创建唯一索引,以为着两个行不能使用重复的值
create unique 索引名 on 表名(字段名,字段名,···);
撤销与修改
drop(撤销)
可以用来撤销 数据库、表、索引
语法
-- 删索引
alter table 表名 drop index 索引名;
-- 删除表
drop table 表名;
-- 清空表
truncate table 表名;
-- 删库
drop database 库名
高级
查询
-- 指定记录返回的条数,可以加条件
-- mysql中
select 字段名,... from 表名 limit 数目;
--模糊查询 用正则来表示,所有包含有g的字段,%为通配符;
select 字段名 from 表名 where 字段名 like '%g%';
-- 查询不包含G的
select 字段名 from 表名 where 字段名 not like '%g%';
通配符
通配符 | 描述 |
---|---|
% 百分号 | 替代0个或多个字符 |
_ 下划线 | 替代一个字符 |
[字符串] | 字符列中的任何一个单一字符 |
[!字符串]/ [ ^字符串] | 不在字符列中的单一字符 |
格式
-- % 与 _ 可以用like 模糊查询
select 字段名 from 表名 where 字段 like '%XX%';
select 字段名 from 表名 where 字段 like '_字_符_串';
-- [字符串] 只能用 regexp/not regexp正则表达式
-- 取以字符串中字符开头的字符
select 字段名 from 表名 where 字段 regexp '^[字符串]';
条件
where
-- 逻辑
-- 当有多个条件的时候,除了最后一个,其他用括号将条件括起来
-- and 与
-- or 或
-- not 非
-- 取值
-- in 允许where规定多个值
select 字段名 from 表名 where 字段名 in(值,...);
-- between 选取介于两个值之间的数据范围内的值,这些值可以是数值、文本或者日期。
-- 文本是怎么判断的?是按照字母顺序?
select 字段名 from 表名 where(字段名1 between 值1 and 值2) and 字段名 not in(值1,值2);
别名
一般只在查询中使用
使用的情况:
在查询中设计超过一个表
在查询中使用了函数
列名称很长或者可读性查
需要把两个列或者多个列结合在一起
语法
-- 列别名
-- 1、直接在字段名称后面加上别名,中间以空格隔开
select 字段名"别名" from 表名 where 条件;
-- 2、以as关键字指定字段别名,as在select的字段和别名之间
select 字段名 as 别名 from 表名 where 条件;
-- 3、对于SQL Service 还可以利用等号"="指定字段的别名
select 字段名=别名 from 表名 where 条件;
--表别名
select 字段名 from 表名 as 表别名;
**提示:**如果列名称包含空格,要求使用双引号或方括号:
将多个列放在一个别名下
select (字段名1,',',字段名2,',',字段名3)as 别名 from 表名 where 条件;
疑问?
别名设置是一次性的还是持久化的?
别名是一次性的,别名在每条sql语句中都是可以不同的,用别名只是为了让查询时,条件语句更加好看
连接(JOIN)
所谓连接就是将各个表关联起来,结果可以看作是一张新表
共7种用法
inner join :如果表中至少有一个匹配则返回行
left join : 即使右表中没有匹配,也从左表返回所有的行
right join:即使左表中没有匹配,也从右表中返回所有的行
full join:只要其中一个表中存在匹配就返回行
outer join:
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接的条件
外连接: 外连接结果不仅包含符合连接条件的行,同时也包含自身不符合条件的行,包括左连接、右连接和全部外连接。
左外连接:左边表数据行全部保留,右边表保留符合连接条件的行
右外连接:右边表数据行全部保留,左边表保留符合连接条件的行
全部外连接:左外连接 union 右外连接
格式
select 表.字段,表.字段,... from 表1 连接 表2 on 关联条件 order by 字段
inner join(内连接)
关键字在表中存在至少一行时返回行
-- 方式1
select 表1.字段名,表2.字段名,... from 表1 inner join 表2 on 表1.字段名=表2.字段名;
-- 方式2
select 表.字段名 from 表1 join 表2 on 表1.字段1=表2.字段2;
inner join 与join是相同的
left join(左连接)
即使右表中没有匹配记录也会显示,左表必定显示,右表若匹配则显示
select 表1.字段名,表.字段名,... from 表1 left join 表2 on 条件 order by 字段;
right join( 右连接)
与左连接功能相反,换个位置基本上就用不上了。
select 表.字段,表.字段,... from 表1 right join 表2 on 条件 order by字段
可以通过and条件来查询右表并关联左表
full /full outer join(全连接)
即使记录关联不上也能查出来
select 表.字段,表.字段,from 表
合并(union)
合并两个或多个select语句的结果集
查询语句1 union 查询语句2;
union 内部的
每个select 必须拥有相同数量的列,
列也必须拥有相似的数据类型,
每个select语句中的列的顺序必须相同
结果集中的列名,总是等于第一个select中的列名
union只能列出不同的值,若想列出所有的值可以用union all来选取重复的值
用where时可以让条件拥有重复的值
复制(into)
into:将一张表的数据复制到一张新表中
insert into:将一张表中的数据插入到一张已经存在的旧表中
MySQL不支持 select …into
复制时可以使用
create table 新表
as
select * from 旧表;
insert into
insert into 插入表
select 字段名 from 复制表
日期
MySQL Date函数
函数 | 描述 |
---|---|
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
DATE() | 提取日期或日期/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间的单独部分 |
DATE_ADD() | 向日期添加指定的时间间隔 |
DATE_SUB () | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
聚合函数
函数这东西基本上都是查询的时候用的,增删改基本上都是用不到这些玩意的。
格式
select 函数名(字段名) from 表名 各种条件混合使用;
Aggregate (统计)函数
AVG():返回平均值,参数只能是int
COUNT():返回行数
FIRST():返回第一个记录的值
LAST():返回最后一个记录的值
MAX(): 返回最大值
MIN():返回最小值
SUM():返回总和
Scalar (格式)函数
UCASE() :将某个字段转换为大写
LCASE() :“将某个字段转换为小写
MID() :从某个文本字段提取字符,MySQL中使用
SubString(字段,1,end): 从某个文本字段提取字符
LENGTH(): 返回某个文本字段的长度()
ROUND(): 对某个数值字段进行指定小数位数的四舍五入
NOW():返回当前的系统日期和时间
FORMAT():格式化某个字段的显示方式
练习地址:https://blog.youkuaiyun.com/smileiii/article/details/82532360