数据库操作
查看所有数据库
show databases;
查看当前使用的数据库
select database();
创建数据库
create database database_name;
删除数据库
drop database_name;
使用数据句库
use database_name;
查看数据库中所有表
show tables;
表的操作
desc table_name;
创建表结构的语法------SQL数据类型
create table table_name(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
);
修改表–添加字段
alter table table_name add 列名 类型;
demo:alter table students add birthday datetime;
修改表–修改字段–重命名版
alter table table_name change 原名 新名 类型及约束;
demo:alter table students change birthday birth datetime not null;
修改表–修改字段–不重命名
alter table table_name modify 列名 类型及约束;
demo : alter table students modify birth date not null;
删除表–删除字段
alter table table_name drop 列名;
demo :later table students drop birthday;
删除表
drop table table_name;
查看表的创建语句–详细过程
show create table table_name;
查询基本使用
查询
查询所有列
select * from table_name;
查询指定列
select 列1,列2, ... from table_name;
增加
说明:主键列是自动增长,但是在全列插入时需要占位,通常使用空值(0或者null) ; 字段默认值 default 来占位,插入成功后以实际数据为准
全列插入:值的顺序与表结构字段的顺序完全一一对应
此时字段名列表不用填写
insert into table_name values (...);
例:
insert into students values(0,’郭靖‘,1,'蒙古','2016-1-2');
部分列插入:值的顺序与给出的列顺序对应
insert into table_name (列1,...) values(值1,...);
例:
insert into students(name,hometown,birthday) values('黄蓉','桃花岛','2016-3-2');
全列多行插入
insert into table_name values(...),(...)...;
例:
insert into classes values(0,'python1'),(0,'python2');
部分列多行插入
insert into table_name(列1,...) values(值1,...),(值1,...)...;
例:
insert into students(name) values('杨康'),('杨过'),('小龙女');
修改
update table_name set 列1=值1,列2=值2... where 条件;
例:
update students set gender=0,hometown='北京' where id=5;
删除
delete from table_name where 条件;
例:
delete from students where id=5;
逻辑删除,本质就是修改操作
update students set isdelete=1 where id=1;
as关键字
使用 as 给字段起别名
select id as 序号, name as 名字, gender as 性别 from students;
可以通过 as 给表起别名
select s.id,s.name,s.gender from students as s;
条件语句查询
where后面支持多种运算符,进行条件的处理
比较运算符
逻辑运算符
模糊查询
范围查询
空判断
比较运算符
等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: != 或 <>
逻辑运算符
and
or
not
模糊查询
like
%表示任意多个任意字符
_表示一个任意字符
范围查询
范围查询分为连续范围查询和非连续范围查询
- in表示在一个非连续的范围内
- between … and …表示在一个连续的范围内
例:查询编号为3至8的学生
select * from students where id in(1,3,8);
例:查询编号是3至8的男生
select * from students where (id between 3 and 8) and gender=1;
空判断
判断为空
例:查询没有填写身高的学生
select * from students where height is null;
注意:
- null与’'是不同的
- is null是判断为空,判断非空is not null
优先级:
优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符
and比or先运算,如果同时出现并希望先算or,需要结合()使用
排序
排序查询语法:
select * from table_name order by 列1 asc|desc [,列2 asc|desc,...];
语法说明:
将行数据按照列1进行排序,如果某些行 列1 的值相同时,则按照 列2 排序,以此类推
asc从小到大排列,即升序
desc从大到小排序,即降序
默认按照列值从小到大排列(即asc关键字)
分页
分页查询语法:
select * from table_name limit start,count;
说明:
从start开始,获取count条数据
start默认值为0
也就是当用户需要获取数据的前n条的时候可以直接写上 xxx limit n;
聚合函数
总数
count(*) 表示计算总行数,括号中写星与列名,结果是相同的
最大值
max(列) 表示求此列的最大值
最小值
min(列) 表示求此列的最小值
求和
sum(列) 表示求此列的和
平均值
avg(列) 表示求此列的平均值
分组
group by 语句用于结合合计函数,根据一个或多个列对结果集进行分组。示例
group by + having
having 条件表达式:用来过滤分组结果
having作用和where类似,但having只能用于group by 而where是用来过滤表数据。
having后面可以跟聚合函数,而where后面不能跟聚合函数。
连接查询语法
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
- INNER JOIN:如果表中有至少一个匹配,则返回行
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行
- SELF JOIN:用于将表连接到自己,就好像该表是两个表一样,临时重命名了SQL语句中的至少一个表
- CARTESIAN JOIN:从两个或多个连接表返回记录集的笛卡儿积
连接查询语法:
select * from 表1 inner或left或right join 表2 on 表1.列 运算符 表2.列
子查询
在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句,外部那个select语句则称为主查询。
主查询和子查询的关系:
子查询是嵌入到主查询中
子查询是辅助主查询的,要么充当条件,要么充当数据源
子查询是可以独立存在的语句,是一条完整的 select 语句
sql语句执行顺序
sql语句定义的顺序
(1) SELECT (2)DISTINCT<select_list>
(3) FROM <left_table>
(4) <join_type> JOIN <right_table>
(5) ON <join_condition>
(6) WHERE <where_condition>
(7) GROUP BY <group_by_list>
(8) WITH {CUBE|ROLLUP}
(9) HAVING <having_condition>
(10) ORDER BY <order_by_condition>
(11) LIMIT <limit_number>
sql语句执行顺序
(8) SELECT (9)DISTINCT<select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE|ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
(11) LIMIT <limit_number>
可以看到,一共有十一个步骤,最先执行的是FROM操作,最后执行的是LIMIT操作。每个操作都会产生一个虚拟表,该虚拟表作为一个处理的输入,看下执行顺序:
- FROM:对FROM子句中的左表<left_table>和右表<right_table>执行笛卡儿积,产生虚拟表VT1;
- ON: 对虚拟表VT1进行ON筛选,只有那些符合<join_condition>的行才被插入虚拟表VT2;
- JOIN: 如果指定了OUTER JOIN(如LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表VT2,产生虚拟表VT3。如果FROM子句包含两个以上的表,则对上一个连接生成的结果表VT3和下一个表重复执行步骤1~步骤3,直到处理完所有的表;
- WHERE: 对虚拟表VT3应用WHERE过滤条件,只有符合<where_condition>的记录才会被插入虚拟表VT4;
- GROUP By: 根据GROUP BY子句中的列,对VT4中的记录进行分组操作,产生VT5;
- WITH : 对VT5进行CUBE或ROLLUP操作,产生表VT6;
- HAVING: 对虚拟表VT6应用HAVING过滤器,只有符合<having_condition>的记录才会被插入到VT7;
- SELECT: 第二次执行SELECT操作,选择指定的列,插入到虚拟表VT8中;
- DISTINCT: 去除重复,产生虚拟表VT9;
- ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10;
- LIMIT: 取出指定街行的记录,产生虚拟表VT11,并返回给查询用户