MySQL关键字

Insert:增加
insert into * values()
insert into user values(‘11’,‘诸葛亮’,‘1011’);
不多解释,向表中添加一条语句,不清楚的去看MySQL的简单的增删改查

Delete:删除
delete from * where a=b;
delete from user where uuid=10
不多解释,在表中删除一条语句,不清楚的去看MySQL的简单的增删改查

Update:更新
update * set a=b where a=b;
update user a set a.username=‘我是修改后的’ where a.uuid=6;
不多解释,在表中更新一条语句,不清楚的去看MySQL的简单的增删改查

Select:查询
select * from a where a=b;
select * from user where uuid=1;
不多解释,在表中查询语句,不清楚的去看MySQL的简单的增删改查

truncate:删除表中数据

drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where字句。
(1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
(2) 表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
(3) 一般而言,drop > truncate > delete
(4) 应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view
(5) TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。

Where:成立条件
涉及到数据库的带有条件的操作,基本都要有where关键字,一般用于数据库的删除和更新命令,具体用法便是“where 判断条件”;

查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。
你可以在 WHERE 子句中指定任何条件。
你可以使用 AND 或者 OR 指定一个或多个条件。
WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。

where a=b;
where a.uid=b.oid and a.uid=‘1011’;
where a.uid=‘1’ or b.oid=‘1’;

如果我们想在 MySQL 数据表中读取指定的数据,WHERE 子句是非常有用的。
使用主键来作为 WHERE 子句的条件查询是非常快速的。
如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。

Like:模糊查找
我们知道查询数据库的时候用select关键字,我们也知道查询的条件跟在where关键字后面就可以,但是如果我们现在的查询条件比较模糊,我们想查询后缀是"mp4"的数据或者是想查询数据中含有“大大”的字眼的数据;这个时候准确查找就无法满足了,就需要用到模糊查找like关键字了;

*SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 。
如果like 后没有使用%,那么和使用=作用是一样的;

select * from user a where a.username like '钟%'
执行前

执行后

我们可以看到并没有查出第11条数据,“钟%”这种形式只会查出以钟开头的字眼;“%钟”这种形式同样只会查出以钟结尾的字眼;“%钟%”则会查出在任何位置含有钟的数据;

union:联合,合并
当多个查询语句一起执行时,把这些查询的数据组合到一起时会出现重复的数据,这个时候就需要这个union关键字来进行联合查询;union关键字就是用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中,多个 SELECT 语句会删除重复的数据;

union是用来联合多条语句的,如果现在有一张用户表,每个客户都有买东西,这个时候要查出买了多少种类的东西,这个时候要单独用distinct关键字了,即
select count(distinct a.goods) from user a ;
原表:

select * from user a where a.username like ‘钟%’
union (distinct)
select * from user a where a.username like ‘%钟%’;
默认的union会去掉sql语句的相同的结果;union all会全部显示;distinct与不写结果相同;

union/union distinct 查询后的结果是

union all查询后的结果:

这样便会出现查询的所有结果,有重复数据;

效率问题

UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。

1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。

2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。

从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。

distinct:不重复的
上满说到了union默认是和union distinct的作用一样,会将多个select查询语句的结果集进行合并;如果现在只有一个select语句,比如现在要统计一张商品表的商品的种类的个数,这个时候就要查询出种类这个字段不重复的记录,并计算;这个时候就要用distinct这个关键字了;
select count(distinct goods.class) from goods;

order by desc/asc :排序
将要显示的结果集进行排序,用order by关键字,末尾跟desc则是降序、跟asc则是升序;默认情况下是升序;
SELECT * FROM USER WHERE id>8891 ORDER BY id DESC;

Order by是排序;desc降序;asc升序;
SELECT field1, field2,…fieldN table_name1, table_name2…
ORDER BY field1, [field2…] [ASC [DESC]

你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
你可以设定多个字段来排序。
你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
你可以添加 WHERE…LIKE 子句来设置条件。

group by:分组
group by关键字用来分组,根据一个或多个列对结果集进行分组

(count(*)计算个数的函数包含null值,count(属性)不包括null的值,
sum(属性)求和的函数
max(属性)用来求当前列的最大值)

我要只说这是用来分组的,可能有些模糊,可能很多人还是压根不懂这个到底是用来干啥的;好,那么我就按照我的理解来给大家详细的解释下这个分组group by到底该怎么用。

假如现在有这么一个人类表,我要将这个表按照男女来分开,计算一下男生多少人,女生多少人,以表格的形式显示出来?

你可能会想到select count() from people a where a.sex=1;这样分别来计算,得到的结果是这个样子的;

如果我想得到一个很友好的结果表:(如下图,查到这个样子的表是不是很友好,而且一目了然)

那么要怎么做呢?这个时候就要用到我们的group by关键字了;只需要一句话select people.‘sex’,count() from people group by sex就搞定了,这样就可以直接显示一个友好的结果表;

现在有这么一个需求,我有一个客户表,客户分为三个等级,需要按照客户来分类,并计算每个等级的客户的总消费量,以表格形式呈现出来;有了前面这个例子,这个便很好来实现了,只需要把函数count(*)改成函数sum(xiaofei) 便可以了;

group by x的意思就是把所有具有相同x字段的数据放在一起,比如上面的性别或者上面的客户等级,按照这个分好;
那么group by x,y的意思呢?很明显啊,就是把所有具有x和y两个字段都相同的数据放在一起;

像上面两个例子,如果我想不仅把客户按照等级来分好,而且每个等级的按照男女来分好,并计算每个等级的男女的消费总额;这个需求该如何实现呢?这个问题便用到了上面的多条件分组;
select people.level,people.sex,count(*),sum(xiaofei) from people group by level,sex;
即将具有相同的客户等级和客户性别的放到一组,并进行聚合函数(sum.count.avg.max);
 

limit:偏移量和数量
注意limit和offset的区别,下面有写到offset,注意区分;
在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能;常用的大概就是分页了吧。
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。
select * from user limit 5,10;
//为了检索初始偏移量是5,数量是10个的数量
select * from user limit 95,-1;
//为了检索初始偏移量是95之后的所有数据,则把第二个数据设置成-1即可;
select * from user limit 5;
//这是为了从头开始检索5个数据,换句话就是limit 0,5这个样子咯;
limit执行效率高?
常说的limit效率高,其实是在特定的情况下,数据库的量很大,但是只需要查找一部分的数据就可以;
高效率的原理:避免全表扫描,提高查询效率;比如:每个用户的email是唯一的,如果用户使用email作为用户名登陆的话,就需要查询出email对应的一条记录。
select * from user where email=?;
上面的语句实现了查询email对应的一条用户信息,但是由于email这一列没有加索引,会导致全表扫描,效率会很低。
select * from user where email=? limit 1;
如果后面加上(limit 1)的时候,当扫描到相应的email的时候便不会继续向下扫描;
limit执行效率低?
在一种情况下效率很低,那就是只使用limit来查询语句,并且偏移量特别大的情况;比如之下的例子:
语句1:
select * from table limit 150000,1000;
语句2:
select * from table while id>=150000 limit 1000;
语句1为0.2077秒;语句2为0.0063秒。两条语句的时间比是:语句1/语句2=32.968

比较以上的数据时,我们可以发现采用where…limit….性能基本稳定,受偏移量和行数的影响不大,而单纯采用limit的话,受偏移量的影响很大,当偏移量大到一定后性能开始大幅下降。不过在数据量不大的情况下,两者的区别不大。所以应当先使用where等查询语句,配合limit使用,效率才高。在sql语句中,limt关键字是最后才用到的。以下条件的出现顺序一般是:where->group by->having-order by->limit;

having和where:条件
 where,过滤条件的关键字,但是它只能对group by之前的数据进行过滤筛选;
 having,也是过滤条件的关键字作用和where是一样的,但是它过滤的是分组后的数据,就是对分组后得到的结果集进行过滤筛选。
 出现having其实我觉得就是为了解决一条语句出现两个where的问题,把它们区分开来;
 select * from user where id>100 group by user.sex having user.sex=‘1’;
 这里注意一个问题:一旦经过group by关键字分组后,别的数据便无法显示;只能最多显示两列数据,即分组group by后面根据的条件后分组后的数据的计算。count,sum,avg,等

offset: 
select * from user limit 2,1;
//表示初始偏移量是2个,然后取一个数据;
select * from user limit 2 offset 1;
//limit 2 offset 1表示的是跳过1个数据,获取2个数据;

注意:
1.数据库数据计算是从0开始的
2.offset X是跳过X个数据,limit Y是选取Y个数据
3.limit X,Y 中X表示跳过X个数据,读取Y个数据

这两个都是能完成需要,但是他们之间是有区别的:
①是从数据库中第三条开始查询,取一条数据,即第三条数据读取,一二条跳过
②是从数据库中的第二条数据开始查询两条数据,即第二条和第三条。

Join和ON相关:连接
一般在真正的应用中都是多个数据表中读取数据;
JOIN 按照功能大致分为如下三类:

1.INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
2.LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
3.RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
关键字On是指怎么把两个表连接起来,如on a.name=b.name;
是一行一行的比较,然后联合起来,此时并没有判断where子句的内容;
where 关键字是在表连接之后进行筛选;

内连接可不加on条件,而外连接必须加条件;
select * from user a left (outer) join people b ON a.uuid=b.id;
//外连接必须加on关键字,on后面跟连接的条件,如果后面不跟on连接条件的话会报错;
select * from user a inner join people b ON a.uuid=b.id;
//内连接如果后面不跟on的条件的话,便跟完全连接的效果一样了;介绍一下完全连接,也就是交叉连接,比如A表有a行数据,B表有b行数据,完全连接就有a*b行数据了;
在内连接中on关键字跟where关键字的用法没有区别的;

Where关键字是对最终结果集的筛选;
On关键字是代表两个表建立联系的规则;

NULL:空值
在MySQL中关于NULL的处理,你不能使用=NULL或者是!=NULL来查询,于是MySQL就提供了一种方式,
IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
<=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。
在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false 。

in和 NOT IN:
在一些固定的数据中的操作
select * from user where user.id in (1,5,8);
//查询ID是1,5,8的用户;
可以用in关键字来替换or关键字;

in作为查询条件,一般典型有两种用法:
一是IN常量,例如下面语句查询一、三年级的学生:
SELECT * FROM student WHERE grade IN (‘一’,‘三’);
二是使用子查询,也就是IN(SQL语句),例如下面的语句查询不及格的班级的所有学生:
SELECT * FROM student WHERE classno IN (
select classno from scores where score<60
);

alter:用来修改表的属性、列的属性
删除、增加、修改字段:
alter table user drop age;//删除user表的age字段;
alter table user add age int not null;//在user表中添加age字段;
alter table user modify age char(100)//在user表中修改age字段的属性;
 

你可能感兴趣的:(MySQL,mysql)