SQL语句分类:
DQL:数据查询语言(凡是带有select关键字的都是查询语句) select...
DML:数据操作语言(凡是对表当中的数据进行增删改的都是DML) insert 增 delete删 update 改
DDL:数据定义语言(凡是带有create、drop、alter的都是DDL。)操作表结构。不是表中数据
create:新建==增 alter:修改 drop:删除
TCL:事务控制语言 包括:事务提交:commit 事务回滚:rollback
DCL:数据控制语言 例如:授权grant、撤销权限revoke
个人建议:不需要记住谁是哪类,会用就行,知道select是查询,insert是增加即可
简单查询:
查询一个字段:
select 字段名 form 表名;
注:select和from都是关键字。字段名和表名都是标识符
查询俩个或多个字段:
select 字段名1,字段名2 from 表名;
注:字段名之间“ ,”号隔开即可
查询所有字段:1.把所以字段全部写上 2.用 * 号来表示
select * from 表名;
缺点:1.效率低 2.可读性差,在实际开发中不建议
起别名:
select 字段名1,字段名2 as 别名 from 表名;
select 字段名1,字段名2 as ‘别名’ from 表名;
select 字段名1,字段名2 别名 from 表名;
字段可以使用数学表达式:
select 字段名*12 from 表名;
条件查询:
select 字段名1,字段名2 from 表名 where 条件;
select 字段名1,字段名2 from 表名 where 字段名 >=1000 and 字段名 <= 2000;
等同于
select 字段名1,字段名2 from 表名 where 字段名 between 1000 and 2000;
注:使用between and 的时候必须遵循左小右大,是闭区间,包含俩端值
注:当and和or同时出现时,and的优先级高,如果想让or先执行可以加小括号
模糊查询:
查询名字中带有‘o’的
select * from 表名 where 字段名 like ‘%o%’;
查询第二个字母带有‘A’的
select * from 表名 where 字段名 link ‘_A%’;
查询名字中带有‘_’的
select * from 表名 where 字段名 link ‘%\_%’;
排序
排序默认是升序(asc)
select 字段名 from 表名 order by 所要排序的字段名;
降序:
select 字段名 from 表名 order by 所要排序的字段名 desc;
多字段排序:
select 字段名1,字段名2 from 表名 order by 字段名1 asc,字段名2 asc;
注:以第一个起主导,只有第一个相等时,才会考虑启用第二个(例:以工资升序排序,当工资一样时,以第二个升序排序)
数据处理函数:
数据处理函数又叫单行处理函数
单行处理函数的特点:一个输入对应一个输出
和单行处理函数相对的是:多行处理函数,(多行处理函数特点:多个输入对应,一个输出)
concat 函数进行字符串拼接
select concat(拼接内容1,拼接内容2)from 表名;
select 函数名(要处理的字段名) from 表名;
注:NULL只要参与运算,最终结果一定是NULL。为避免这个现象,所以要使用ifunll函数
ifnull函数用法:ifnull(字段名,被当做那个值)
分组函数(多行处理函数):
特点:输入多行,输出一行。
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注:分组函数在使用的时候必须先进行分组,然后才能用。如果你没有对数据进行分组,那么整张表默认为一组。
分组函数注意点:1、分组函数自动忽略NULL
2、分组函数中count(*)和count(具体字段)有何区别?
count(具体字段):表示统计该字段下所有不为NULL的元素的总数。
count(*):统计表当中的总行数。(只要有一行数据count则++)
3、分组函数不能够直接使用在where子句中。因:分组函数的使用需要分组,而where后面还没有分组,SQL的执行顺序为:(1)from (2)where (3)group by (4)select (5)order by
4、所有的分组函数可以组合起来使用。
分组查询:
注:在一个select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不能跟。
多字段分组查询:
select 分组字段1,分组字段2,分组函数 from 表名 group by 分组字段1,分组字段2;
使用having可以对分完组之后的数据进一步过滤。having不能单独使用,having不能代替where,having必须和group by联合使用。
优化策略:where和having,优先选择where,where实在完成不了了,再选择having。
大总结(单表查询):
select ... from ... where ... group by ... having... order by ...;
执行顺序:
1、from
2、where
3、group by
4、having
5、select
6、order by
去除查询结果的重复记录
注:原表数据不会被修改,只是查询结果去重。关键字为distinct
select distinct 字段名 from 表名;
distinct只能出现在所有字段的前方(有多字段,表示多字段联合去重)
连接查询:
1、概念:从一张表中单独查询,称为单表查询。多张表联合起来查询数据,被称为连接查询。
2、根据表连接的方式进行分类:
内连接:inner表示内连接,可以省略。
等值连接:
SQL92语法
select 表1字段,表2字段 from 表1,表2 where 表1.条件字段 = 表2.条件字段;
SQL99语法
select 表1字段,表2字段 from 表1 inner join 表2 on 表1.条件字段 = 表2.条件字段;
非等值连接:条件不是一个等量关系的,称为非等值连接
自连接:自己连接自己,即一张表。技巧:一张表看成两张表
select 别名1.字段1,别名2.字段2 from 表名 别名1 join 表名 别名2 on 条件
外连接:outer 也是可以省略的 产生了主次关系(任意的左连接都有右连接的写法,反之也是)
左外连接(左连接):left: 表示将join左边的这张表看成主表,将主表数据全部查询出来,捎带关联查询右边的表。
r
右外连接(右连接):right表示:表示将join右边的这张表看成主表,将主表数据全部查询出来,捎带关联查询左边的表。
select ... from 表1 right join 表2 on 条件
全连接(很少用)
3、当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积。这种现象被称为:笛卡尔积现象。
4、如何避免笛卡尔积现象(加限制条件呗)
注:最终显示结果减少,但是匹配次数还是两张表条数的乘积。
注:外连接的查询结果条数一定是 >= 内连接的查询结果条数
三表或者多表连接:
select
...
from
a
join
b
on
a和b的连接条件
join
c
on
a和c的连接条件
join
d
on
a和d的连接条件
子查询:
1、概念: select语句中嵌套select语句,被嵌套的select语句称为子查询。
2、可以出现在哪个位置?
select ..(select).
from ..(select).
where ..(select).
3、where子句中的子查询
where后面不能跟分组函数
如果where后面的条件是a>最小数(不可以写成where a>min(b))
故可以写成
select ... from ... where a> (select min(b) from ...);
4、from子句中的子查询
from后面的子查询,可以将子查询的查询结果当做一张临时表。
5、select子句中的子查询(了解)
union:合并查询结果集
select 字段1 from 表名 where 条件1
union
select 字段1 from 表名 where 条件2
注:union的效率要高一些,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积现象,成倍的翻。但是union可以减少匹配的次数。在减少匹配次数的情况下,还可以完成俩个结果集的拼接 。
uion使用要求:俩个结果集的列数相同。
limit:是将查询结果集的一部分取出来,通常用在分页查询中。
select ... from ...order by ... limit 0,5;
注:起始下标从0开始,长度为5。若limit 5则表示取前五。
分页公式:
limit (页数-1)*长度,长度;
表的创建:
1、建表的语法格式:(表名建议以t_或者 tbl_开始)
create table 表名(字段名1 数据类型,字段名2 数据类型);
2、关于mysql中的数据类型(常见)
1、varchar(最长255)
可变长度的字符串,节省空间。会根据实际数据长度动态分配空间。
2、char(最长255)
定长字符串,不管实际长度是多少,分配固定的空间去存储数据。有时候会照成浪费。
char比varchar的速度快
3、int(最长11)
4、bigint 长整数
5、float
6、double
7、date 短日期类型
8、datetime 长日期类型
9、clob:字符大对象,最多可以存储4G的字符串。超过255个字符的都要采用CLOB来存储
10、blob:二进制大对象,专门来存储图片、声音、视频等流媒体数据。使用IO流才能插入
删除表
drop table 表名;
当这张表不存在的时候会报错
当这张表存在的时候删除
drop table if exists 表名;