SQL是一个标准的数据库语言,是面向集合的描述性非过程化语言。
- 优点:功能强、效率高、简单易学易维护。
- 缺点:非过程化语言,大多数语言都是独立执行,与上下文无关,而大多数 应用都是一个完整的过程,显然用SQL完全实现这些功能是很困难的。
大多数数据库公司从以下两方面来解决此问题:
1)扩充SQL,在SQL中引入过程性结构
2)把SQL嵌入到高级语言中
表(TABLE)
视图(VIEW)
索引(INDEX)
同义词(SYN)
聚簇(CLUSTER)
数据库操作:
创建数据库:create database 库名 例如:create database db1 //创建一个名为db1的数据库
删除数据库:drop database 库名 例如:create database db1 //删除名为db1的数据库
查看数据库:show databases //显示所有库名
使用数据库:use 库名
重命名数据库:停止服务 -> 修改数据库所在文件夹的名称 -> 启动服务
数据表操作:
创建数据表:create table 表名 例如:create table tb1 //创建一个名为tb1的表
删除数据表:drop table 表名 例如:drop table tb1 //删除一个名为tb1的表
查看数据表:show tables //显示当前库中的所有表名
查看表结构:describe 表名
修改表结构:
添加字段:alter table 表名 add 列名 属性 例如:alter table tb1 add id int //给表tb1中增加一个字段id,属性为int
删除字段:alter table 表名 drop 列名 例如:alter table tb1 drop id //删除表tb1中的id字段
修改字段名称:alter table 表名 change 列名 新列名 属性 例如:alter table tb1 change id id_new int //将表tb1的id字段名称改为id_new
修改字段属性:alter table 表名 change 列名 列名 新属性 例如:alter table tb1 change id int decimal //将表tb1的id字段属性int改为decimal
修改字段属性:alter table 表名 modify 列名 新属性 例如:alter table tb1 modify id decimal
表中数据操作(增删改查):
插入数据:insert into 表名(列1,列2) values (值01,值02),(值11,值12)
查询数据:select 列名 from 表名 where 查询条件
修改数据:update 表名 set 列名=值 where 条件
删除记录:delete from 表名 where 条件
数据复制:
创建新表 - 复制旧表结构及数据到新表 create table 新表 select * from 旧表
创建新表 - 仅复制旧表结构 create table 新表 select * from 旧表 where 1=2
创建新表 - 新旧表结构不同(新表中仅包含旧表中个别字段) create table 新表 select 列1,列2 from 旧表
复制旧表数据到新表(表结构相同)insert into 新表 select * from 旧表
复制旧表数据到新表(表结构不同)insert into 新表(列1,列2) select 列1,列2 from 旧表
单表查询:
select distinct 列1,列2 //distinct对后面的列1列2均有效
from 表名
where 条件 //运算符 = != >= like not like is null between...and... in(值1,值2) 通配符:%多个字符 _单个字符
group by 按列不同值分组 //分组,常与avg、sum等聚合函数一起使用,group by str1,str2 表示当str1值相等时,再按str2进行分组
having //查询第二条件
order by 列名 //排序,默认升序。desc降序 asc升序
limit 个数
where和having:
- where无法跟合计函数一起使用,如:
where sum(cnt) > 3 错误
having sum(cnt) > 3 正确
- where作用于视图和表,having作用于组
- where在分组和聚集之前,选取输入行(它控制哪些行进入聚集运算);having在分组和聚集之后,选择分组的行
- having一般跟在group by之后,执行记录组选择的一部分来工作的,where则是执行所有数据来工作的
distinct和group by:
In most cases, a DISTINCT clause can be considered as a special case of GROUP BY. For example, the following two queries are equivalent: (distinct子句是group by的特例,以下两个语句等效)
SELECT DISTINCT c1, c2, c3 FROM t1 WHERE c1 > const;(distinct对后面的C1,C2,C3列均有效)
SELECT c1, c2, c3 FROM t1 WHERE c1 > const GROUP BY c1, c2, c3;
grant赋予权限:
grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘密码’;
- 权限1,权限2,…权限n代表select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14个权限。
- 当权限1,权限2,…权限n被all privileges或者all代替,表示赋予用户全部权限。
- 当数据库名称.表名称被*.*代替,表示赋予用户操作服务器上所有数据库所有表的权限。
- 用户地址可以是localhost,也可以是ip地址、机器名字、域名。也可以用’%'表示从任何地址连接。
- ‘连接口令’不能为空,否则创建失败。
- 如果带了 with grant option,那么用户testuser1可以将select ,update权限传递给其他用户( 如testuser2)。如果没带,则不能将权限传递给第三方。
例如:给所有host下的zy用户,赋予所有数据库和表的一切权限
mysql> grant all privileges on *.* to zy@'%' identified by '123456' with grant option; // %表示从任何地址连接
mysql> flush privileges; //刷新系统权限表,使以上grant生效