SQL语句部分
SQL分类
DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
针对数据库的操作
查看所有数据库(返回所有数据库的名字)
show databases
查看当前数据库(返回当前数据库名字)
select database()
创建数据库
create database 数据库名 charset = UTF-8
删除数据库
drop database 数据库名
使用数据库
user 数据库名
查看数据库中的表
user 数据库名;
show tables
针对表的操作
查看表结构
返回表的信息(type,是否null,key…)
user 数据库名;
desc 表名
创建表
create table 表名(
字段名 数据类型 属性,
)
#举例
create table students(
id int auto_increment primary key not null,
name varchar(20)
)
修改表-----添加字段
alter table 表名 add 字段名 数据类型 属性
#举例
alter table student add grade int not null
修改表-----修改字段名和属性
alter table 表名 change 旧字段名 新字段名 类型 属性(可以没有)
#举例
alter table student change name username varchar(10)
修改表----修改字段属性
alter table 表名 modify 字段名 类型 属性(可以没有)
#举例
alter table student modify username varchar(20) null
删除字段
alter table 表名 drop 字段名
#举例
alter table student drop grade
删除表
drop table 表名
#举例
drop table students
增删改查
查询
查询所有数据行
select * from 表名
查询某一行
select * from 表名 where 字段 = ?
查询某一行的一个或多个字段
select 字段1,字段2.. from 表名 where 字段 = ?
插入
插入一行(全部字段)
#value顺序需要依照表中顺序
insert into 表名 values(value1,value2...)
插入一行(部分字段)
#clomns和value需要一一对应
insert into 表名(colmns1,colmns2) values(value1,value2...)
修改
通过字段判断从而修改字段
update 表名 set 字段 = ? where 字段 = ?;
#举例
update student set username = 'john' where username = 'mike'
删除
delete from 表名 where 字段 = ?;
as关键字
主要用字段名或者数据库名过长,我们在SQL语句中进行一个代替方便SQL语句书写。
select 字段1 as a,字段2 as b
from 表1 as x,表2 as y
where a = ? and b = ?
union关键字
union是连接两个select查询语句,使用union的查询语句必须保证select的字段完全一样包括类型名字,主要是用有union和union all两种。
union:根据两个查询语句的字段合并然后去除重复。
union all:则是union不去重复。
条件语句查询
where
比较运算符
逻辑运算符
模糊查询
范围查询
空判断
子查询
比较运算符
等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: !=
这部分过于简单不做举例
逻辑运算符
and
相当于且(并)关系
or
相当于或关系
not
否认语句
##举例----此时我有id = 1,2,3三条数据,下面语句会返回id = 2,3的数据行
select * from student where not id = 1
模糊查询
like(可左右模糊查询,可以两侧模糊查询)
%表示任意多个任意字符
_表示一个任意字符
select * from student where username like 'john_'
范围查询
范围查询分为非连续范围查询(in)和 连续范围查询(between)
in
#该语句用于查询 id = 1 和 id = 2 的数据行
#等价于select * from student where id = 1 or id = 2
select * from student where id in (1,2)
between
#该语句用于查询 1 <= id <= 3 的数据行
select * from student where id BETWEEN 1 and 3
空判断
查询数据行对应字段为空的数据行
#用于查询用户名为空的id
select id from student where username is null
也可以用于反向判定不为空的情况
#用于查询用户名不为空的id
select * from student where username is not null
子查询
针对于子查询返回一行数据
#因为我们已知只会返回一行,所以这里可以使用 =
select username
from student
where id = (
select id
from student
where grade = 90
)
针对资产寻返回多行多列
#该方法也可以用于处理单行,in的使用可以看上面解析
select username
from student
where id in (
select id
from student
where grade = 80
)
#any代表满足里面的任一条件,是或关系,
#all代表满足里面的所有条件,是且关系。
select username
from student
where id = ANY (
select id
from student
where grade > 80
)
优先级问题
优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符
and比or先运算,如果同时出现并希望先算or,需要结合()使用
排序
order by 字段 asc/desc
order by 字段名作为排序依据,asc/desc代表正序或者倒序
select * from student where id > 0 order by grade asc/desc
分页
select * from 表名 limit start,count
start代表从获取的数据中第几个开始获取(下标默认从0开始)
,count为获取的数据量。
select * from student limit 0,2
聚合函数
count(字段或者 * )
返回查询结果的数据行数
就算是写入字段或者 * 查询结果是一样的。
max(字段)和min(字段)
返回对应字段的最大值和最小值
sum(字段)
返回对应字段的查询结果的累加值
avg(字段)
返回对应字段查询结果的平均值
分组
group by 字段名
返回在查询结果中不重复的对应字段的对应结果
select grade from student group by grade
特殊情况
下面语句中表中有4条数据,针对于grade = 80情况有2条数据行,我们这里要求返回的是一整条数据行,这条语句返回的只有第一条grade = 80的数据,第二次出现的数据不会被返回。
select * from student group by grade
group_concat(字段名)
返回根据group by的不重复的结果对应的group_concat()字段的一个整体集合(这个集合全在对应行的一列中)
select grade,GROUP_CONCAT(username) from student group by grade
group by + 聚合函数
根据上面的启发,我们可以通过使用聚合函数将他们统计出来,例如:
统计不同grade的人数
select grade,count(*)
from student group by grade
统计不同部门的平均年龄
select department,avg(age)
from people group by department
主要在于灵活应用
group by + having
having关键字只能用于group by ,用于过滤信息,有点类似于where
#分组后对分组筛选:筛选grade > 80 的组
select grade
from student group by grade having grade > 80
#分组后对分组筛选:筛选分组成员数 > 1的分组
select grade
from student group by grade having count(*) > 1
连接查询
内连接
根据特定条件返回两个表的对应字段数据,如果两个表存在复数数据,那么就返回两个表数据的各种情况的数据。(换句话说就是两个表的交集的所有情况,和外连接存在区别)
例如:
男1 选了 语文 ,男2 选了 语文
女1 选了 语文 ,女2 选了 语文
针对于class = 语文情况此时就会返回四种结果
男1 女1
男1 女2
男2 女1
男2 女2
(注意:内连接只会返回两个表符合条件的部分)
#用于查询选课一样的男女学生
select boy.class,bname,gname
from boy inner join girl on boy.class = girl.class
左外连接
和内连接类似,就用上面的例子,左外连接是指左表完全显示,右边表满足条件(这里的满足条件是指on后面的条件,如果是boy.class = girl.class这样的情况,那就是指所有的boy表的class)的筛选出来,和左表全部组合,如果右表不存在的则填入null。
select boy.class,bname,gname from boy left join girl on boy.class = girl.class
右外连接
和左外连接相反,右表完全显示,左表符合条件的和右表进行组合,如果左表不存在符合条件的则填入null。
select boy.class,bname,gname from boy right join girl on boy.class = girl.class