什么是sql
1.结构化查询语言
2.访问数据库
3.ANSI标准计算机语言
SQL可以做什么
在数据库中,
查询
更新记录
插入
删除
创建新数据库
创建新表
创建存储过程
创建视图
设置表,存储过程,视图的权限
SQL分类
DDL:数据定义语言
DML:数据操纵语言
DCL:数据控制语言
DDL
对数据库内部的对象进行创建,删除,修改等操作的语言
与DML区别:DML只操作表内部的数据,不涉及表的定义,结构的修改,更不会涉及其他对象
DDL由数据管理员使用(DBA),开发人员一般很少使用
创建数据库:
create database dbname;
查看系统中有哪些数据库
show databases;
选择数据库
use dbname;
查看数据库下所有的表
show tables;
删除数据库
drop database dbname;
创建表
CREATE TABLE tablename(
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints,
... ...
column_name_n column_type_n constraints);
查看表
desc tablename;
如果觉得上面的信息还不够全面,为了得到更全面的信息,可以使用:
show create table tablename \G;
删除表
drop table tablename;
修改表类型
ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name];
增加表字段
ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name];
删除表字段
ALTER TABLE tablename DROP [COLUMN] col_name;
字段改名
ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST | AFTER col_name];
修改字段排列顺序
ALTER TABLE tablename [ADD|MODIFY] col_name column_definition [FIRST | AFTER col_name];
更改表名
ALTER TABLE tablename RENAME [TO] new_tablename
DML
插入记录
注意:1.可以不用指定列名,但value后面的顺序和字段的排列顺序应该一致
2.可含空的字段,非空但含有默认值的字段以及自增字段,可以不再insert后的字段出现,value后面对应各字段名称的值
INSERT INTO tablename(field1,field2,...fieldn) VALUES(value1,value2,...,valuen);
更新记录
UPDATE tablename SET field1=value1,field2=value2,...fieldn=valuen [WHERe CONDITION];
同时更新多个表中的数据
注意:多表更新的语法更多地用于根据一个遍的字段来动态地更新另一个表的字段
UPDATE t1,t2,...tn set t1.field1=expr1,tn.fieldn=exprn [WHERe CONDITION]
查询记录
查询不重复的记录:distinct
条件查询
①where关键字
②=、>、<、>=、<=、!=
③and , or
SELECT * FROM tablename [WHERe CONDITION];
排序和限制
desc 降序排序
asc 升序排序
SELECt * FROM tablename [WHERe CONDITION] [ORDER BY field1 [DESC|ASC] , field2 [DESC|ASC] , ... fieldn [DESC|ASC]];
对于排序后的记录,如希望只显示一部分,而不是全部,则可以使用limit关键字来实现
注意:1.limit经常和order by 一起配合使用来进行记录的分页显示
2.limit在其他数据库上不能使用
SELECt ... ... [LIMIT offset_start,row_count];
offset_start:表示记录的起始偏移量
row_count:表示显示的行数
聚合
注意:
HAVINg和WHERe的区别在于,HAVINg是对聚合后的结果进行条件的过滤,而WHERe是在聚合前就对记录进行过滤。如果逻辑 允许,我们尽可能用WHERe先过滤记录,因为这样的结果集减小,聚合的效率将大大提高,最后再根据逻辑看是否用HAVINg进行再过滤。
SELECT [field1,field2,...,fieldn] fun_name from tablename
[WHERe where_contition]
[GROUP BY field1,field2,...,fieldn [WITH ROLLUP]]
[HAVINg where_contition]
fun_name:表示要做的聚合操作,也就是聚合函数,常用的有sum(求和)、count(*)(记录数)、avg(平均值)、max(最大值)、min(最小值)
GROUP BY:关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数据,部门就应该写在GROUP BY后面
WITH ROLLUP:是可选参数,表明是否对分类聚合后的结果进行再汇总
HAVINg:关键字表示对分类后的结果再进行条件的过滤
表连接
外连接:选出其他不匹配的内容
左连接:包含所有左边表中的记录甚至是右边表中没有和它匹配的项目 left join
右连接:包含所有右边表中的记录甚至是左边表中没有和它匹配的项目 right join
内连接:选出两张表中相互匹配的内容
子查询
关键字:in,not in,=,!=,exists,not exists
记忆联合
将两个表的数据按照一定的条件查询出来后,将结果合并在一起显示出来,union和union all
union和union all的区别:
union all是把结果集直接合并在一起,而union是将union all后的结果进行一次distinct,去除重复记录的结果
SELECt * FROM t1 UNIOn|UNIOn ALL SELECt * FROM t2 ......