sql语句_自连接_外连接_左连接_子查询_排序_分组

数据库的sql语句分为DDL,DCL,DLL

一 DDL,
data define language: 新建一个数据库
ceate创建 alter修改 drop删
这三条语句,在下面几个组件中,都会用得到

数据库分为下面几个组件

1 简单操作数据库,database
$ drop DATABASE if exists 数据库名; #如果之前已经存在,删除它
$ create database 数据库名;#创建一个数据库
$ use 数据库名;#进入数据库

#增加字段
alter table present_log add `user_uid` int(11) NOT NULL COMMENT '赠送者user_uid';

#修改字段名 + 其它信息
ALTER TABLE `present_log`
CHANGE COLUMN `user_uid` `owner_uid`  int(11) NOT NULL COMMENT '赠送者user_uid' AFTER `created_at` ;


#根据字段名修改其它信息
alter table present_log MODIFY `owner_uid` int(11) NOT NULL COMMENT '赠送者owner_uid' AFTER `owner_id` ;
2 简单操作表table

设置变量,和约束

变量类型说明
int数字
tinyint数字
varchar字符串类型 必须是一个介于 1 和 8,000 之间的数值
char指定字符的长度 char(8),你输入的字符小于8时,它会再后面补空值。当你输入 的字符大于指定的数时,它会截取超出的字符
datetime日期加时间,设置长度之后,写入的时间会有毫秒值
date日期
TEXTtext存储可变长度的非Unicode数据
longtext
dicemal
float
double

六大约束

类型说明
主键约束:primamy key一个表只有一个主键,且不能空值
唯一约束:unique表示,一行数据中不能有相同的列值,一个表可以定义多个unique的约束
检查约束:check输入一列或多列的值的范围,通过逻辑表达式来判断数据的有效性
外键约束:foreign key (ID)references 表名(ID)连接主表与从表,主表中的一个列,与另一个表中的数据相连接,一般不使用
非空约束:not null是否允许为空
默认约束:default设置默认值
create table 表名(
 .... 设置字段变量与约束	
						)DEFAULT CHARSET=utf8 #字符编码的更改

数据库与表的字符编码设置要比较注意

3,视图 view

是一个是虚表,只能是本用户自身可以使用,基于sql的查询建立
建立view:

$ create view lishi as 
					select sname from student,(select ...from) sd WHERE sname like "lishi";
4,存储过程,(procedure)

一般用于供外部程序调用,相当于一个把数据封装的概念,能够起到对数据的保护安全的作用,能提交处理效率
自定义:
没有返回值,out代表结果输出,out可以有多个也就是说在参数
in代表

create procedure pro ([参数[in|out] 数据类型])
	create procedure sp_search(in p_name varchar(10)
	begin
	set @varibale1 = concat('%',p_name,'%');
	if p_name is null  or p_name='' then
		select * from t_user;------------------------查找所有
		else
	select *from t_user where user_name like @varibale1;-----按条件查找
		end if;
	end;	

调用方法:

$ call sp_search('李'); 

接收返回结果:
1.可以在procedure中使用select 语句
2.在参数中定义out类型

5 触发器
一般不使用,不做了解 
6,索引 index

使用索引的前提是数据量庞大的表
创建索引的优点是,可以提高查询效率,
当更新基本表时,自己自动修改索引
缺点是:当基本表,不断地在更新,删除,增加数据时,会提高维护索引的时间

创建新的索引:

$ create index 索引名 on 表名()

使用索引注意点:
添加索引就是为了查询使用,提高查询效率,当我们的业务比较复杂时,sql查询优化是我们必须要去做的!!!

https://blog.csdn.net/zoeou/article/details/65481400

7 函数

主要是用于对数据字段的处理,要有返回值,这是跟存储过程的区别

举例几个简单函数:

concat(a,b)字符串的连接 sage+10 +10也是一个简单函数
avg 平均值
sum 求和
max 最大
min 最小
调用方法 select func(xxx,xxx),如下:

select sid,CONCAT(sname,'xxx') sname,sage+10 from student where sname like 'lishi';

自定义函数:

CREATE function funadd(age int,stand int)
						returns VARCHAR(20)
						BEGIN
						if age >= stand then
						#--------------------这里写各种T-SQL语句
						return 'old';
					end;

二,DML,
data manage language: 对数据本身的操作语句

增insert 删delete 改updata

模板sql
insert into 表名(列名) values(‘要加入的值’);insert into classes (cname) values(‘数学’);
delete from 表名 条件 id为7的;delete from zsy where id=7;
update 表名 set 要改的列名里面的外语 where 表里面名字为 英语,update classes set cname=‘外语’ where cname=‘英语’;
删除可以是没有条件的,不用where,可以直接删除整个表,如果你真的这么做的,你就准备卷铺盖走人吧_

查select

select [distinct] 字段1 as 别名, 函数(),字段1+字段2 ...
from 表 (基本表,子查询,视图)  表别名 
 ( left |inner join ) 表2 on 表1.字段 = 表2.字段2 ...
where  字段 ( 关系 (any | all) | between ..and | like | in | )  
and | or  条件2 
order by 列1,列2 (asc | desc) #排序
group by 列1,列2  #分组,
having count(1) > 0 #分组以后条件

单表查询

模板说明
select * from 表名;查表里面所有数据
select name,id from student where id=12;查表里面所有id为12的数据,结果要显示名字和id;
select * from student where sname like ‘%lishi%’;模糊查询,student里面sname带有lishi的全都显示到结果
select sum(sage) from student;求总数
select avg(sage) from student;平均值
select *from student order by sdate asc;按sdate查询出整个表的结果,然后进行升序 默认结果为升序排列
select *from student order by sdate desc;按sdate查询出整个表的结果,然后进行降序
select scid,avg(sage) avg from student group by scid;先按scid分组,再进行取其年龄平均数,把scid和sage显示到结果里面
select sid,sname from student where (sname like ‘李四%’ and sid=2) or sid=9 order by sdate desc;从student 查询 id和name 条件是名字里面有包含 李四的和id为2的,或者id为9的,以date的形式降序排列

多表查询-外连接

模板说明
select cname,sname from student,classes;查询两个表,两个表之间用逗号隔开
select scid,sname,cname from student,classes where scid=cid;查询两个表,条件是第一个表的id=第二个表的id;还有取别名,如果取了别名的话,一定要使用别名
多表查询-左连接
left join用来查询左侧表的全部记录及右测表的连接字段完全相同于左侧表的记录
模板说明
select cname,count(scid) sum from classes left join student on student.scid=classes.cid ;查询calsses 和student里面的名字和所有id的,如果是左id=右id的话,把左边名字都列出来,右边如果条件吻合的话也列出来,排序cname分几个小组

**多表查询-自连接 **
树形结构,存到二维表中 自己先复制一份,
select sname,cname from category c1,category c2 where c1.pid=c2.cid;

多表查询-子查询-
把查询出来的结果,做为一张表来用,所以有时候select查询语句会写的很长

any跟all的区别
any: 大于的话,就是比最小值要大,大于的话,就是比最小值要小
all: 取出最大值 跟前者比较

Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”,它的作用是通过一定的规则将一个数据集划分成若干个小的区域

Transcat-Sql语句
变量的声明 控制语句 分支 循环
case when可以直接在select语句
%百分号,放两边%100% 结果表示模糊包含
放左边%100 结果表示以100开头
放右边100% 结果表示以100结束
_下划线,有几个下划线,表示结果后面可以跟几个字符

修改sql_mode
In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column ‘db.table.is_delete’; this is incompatible with sql_mode=only_full_group_by

$ show variables like '%sql_mode%'

$ select @@global.sql_mode;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

$ set @@global.sql_mode=(select replace(@@global.sql_mode, 'ONLY_FULL_GROUP_BY,',''))

$ select @@global.sql_mode;
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

改完之后,服务重新连接数据库即可

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值