本文是mysql系列之第三篇文章 ,主要介绍常用的SQL语句 ,具体如下 ,若要查看mysql客户端工具的使用,请见:
sql语言分类- DDL:数据定义语言
- DQL:数据查询语言
- DML:数据操纵语言
- DCL:数据控制语言
语言类型 | 说明 | 关键字 |
DDL Data Definition Language | 数据定义语言 | create、alter、truncate、drop ,show ,use |
DML Data Manipulation Language | 数据操纵语言 | insert、delete、update |
DQL Data Query Language | 数据查询语言 | select |
DCL Data Control Language | 数据控制语言 | grant、revoke、commit、rollback |
1.表(Table )
数据库中的表与我们日常生活中使用的表格类似,它也是由行(Row) 和列(Column)组成的。列由同类的信息组成,每列又称为一个字段,每列的标题称为字段名。行包括了若干列信息项。一行数据称为一个或一条记录,它表达有一定意义的信息组合。一个数据库表由一条或多条记录组成,没有记录的表称为空表。每个表中通常都有一个主关键字,用于惟一地确定一条记录。
2.索引(Index)
索引是根据指定的数据库列表建立起来的顺序。它提供了快速访问数据的途径,并且可监督表的数据,使其索引所指向的列中的数据不重复。
3.视图(View)
视图看上去同表似乎一模一样,具有一组命名的字段和数据项,但它其实是一个虚拟的表,在数据库中并不实际存在。该视图是由查询数据库表产生的,它限制了用户能看到和修改的数据。由此可见,视图可以用来控制用户对数据的访问,并能简化数据的显示,即通过视图只显示那些需要的数据信息。
4.图表(Diagram)
图表其实就是数据库表之间的关系示意图。利用它可以编辑表与表之间的关系。
5.缺省值(Default)
缺省值是当在表中创建列或插入数据时,对没有指定其具体值的列或列数据项赋予事先设定好的值。
6.规则(Rule)
规则是对数据库表中数据信息的限制。它限定的是表的列。
7.触发器(Trigger)
触发器是一个用户定义的SQL事务命令的集合。当对一个表进行插入、更改、删除时,这组命令就会自动执行。
8.存储过程(Stored Procedure)
存储过程是为完成特定的功能而汇集在一起的一组SQL 程序语句,经编译后存储在数据库中的SQL 程序。
9.用户(User)
所谓用户就是有权限访问数据库的人。用户分为:管理员用户和普通用户。管理用户可对数据库进行修改删除,而普通用户只能进行阅读查看等操作。
10.总结
针对以上的对象 ,我们主要抽取其每个对象的关键字 ,因为这些关键字都会在后面的sql语句用到 。
数据库对象 | 关键字 |
数据库 | database |
表 | table |
索引 | index |
视图 | view |
图标 | diagram |
缺失值 | default |
规则 | rule |
触发器 | trigger |
存储过程 | procedure |
用户 | user |
而以上的DDL语言多是对这些对象的操作,而对象本身又具有增、删、改、查特性 。 所以 ,DDL语言多是对对象本身的增删改查操作 ,下面就具体的介绍每个关键字的SQL实现 。
create
创建数据库:
create database gg # 创建数据库gg
创建表:
create table gg(字段1 类型,字段2 类型2,...) #创建表gg
创建视图:
create view gg as select 列名 from 表名 where 条件 #创建视图gg
创建索引:
create index gg ON 表名 (列名 [长度]) # 创建索引gg
创建触发器:
create trigger gg #创建触发器gg
{befor | after }
{insert | update delete}
on 表名
for each row
<触发器SQL语句>
# 说明:
{ before | after}:用于指定在insert、update或delete语句执行前触发还是在语句执行后触发。
on <表名>:用于指定响应该触发器的表名。
for each row:触发器的执行间隔,for each row 通知触发器每隔一行执行一次,而不是对整个表执行一次。
<触发器SQL语句>:触发器要执行的SQL语句,如果该触发器要执行多条SQL语句,要将多条语句放在begin…end块中。
创建存储过程
CREATE PROCEDURE gg(参数列表) #创建带参数的存储过程,名为gg
BEGIN
SQL语句代码块
END
创建用户:
create user 'username'@'host' identified by 'password';
# 说明:
username : 你要创建的用户名
host:指定在用户在那台主机上可以登录 ,如果是本地用户可以用localhost,如果想让该用户可以从任意远程主机登录,可以使用通配符% .
password : 设置该用户的登录密码
# 举例 :
create user 'ggg'@'%' identified by '123456'
alert
修改表名:
#格式:
alter table 旧表名 rename 新表名
# 举例 :将表abc 修改为bcd
alter table abc rename bcd ;
以下主要是对表的列做出的修改:
增加一列:
# 格式:
alter table 表名 add 列表 类型[长度]
#举例 :给表bcd添加一列sex
alter table bcd add sex enum('男','女')
删除列
# 格式:
alter table 表名 drop 列表
#示例:删除表bcd中的sex列
alter table bcd drop sex
重命名列
#格式:
alter table 表 change 原列名 新列名 类型
#示例:将表bcd中的sex列修改为class
alter table bcd change sex class varchar(2) ;
修改列的类型名称
# 格式:
alter table 表名 change 列名 类型
#示例:修改class类型为int类型
alter table bcd change class class int(20) ;
添加主键:
#格式:
alter table 表名 add primary key(列名)
#示例:给新表abc的id列设置为主键
alter table abc primary key(id)
修改主键:
#格式:
ALTER TABLE 表名 DROP PRIMARY KEY ,ADD PRIMARY KEY (列名);
#示例 :给表abc修改主键
alter table abc drop primary key ,add primary key(name)
删除主键:
#格式:
alter table 表名 drop primary key
#示例 :删除主键
alter table abc drop primary key
添加索引
#格式
alter table 表名 add index 索引名字(列名)
#示例 :给列name添加索引tt
alter table abc add index tt(name)
#组合索引:
alter table 表名 add index 索引名字(列1,列2,列3)
drop
删除语句比较简单,具体如下
# 格式 :drop 对象 对象名称
# 示例
1. 删除数据库 : drop database 数据库名
2. 删除表 : drop table 表名
3. 删除用户 : drop user 用户名
truncate
格式 : truncate table 表名
# 作用 : 清空表
#说明 : 和delete的主要区别是 ,truncate删除数据的速度更快 ,但是它不支持where操作。
show
#显示当前数据库中所有表的名称,以下两个语句都可以
show tables
show tables from database_name;
#显示mysql中所有数据库的名称。
show databases;
#显示表中列名称。
show columns from table_name from database_name;
show columns from database_name.table_name;
#显示一个用户的权限,显示结果类似于grant 命令。
show grants for user_name;
#显示表的索引。
show index from table_name;
#显示一些系统特定资源的信息,例如,正在运行的线程数量。
show status;
#显示系统变量的名称和值。
show variables;
#显示系统中正在运行的所有进程,也就是当前正在执行的查询。
show processlist;
#显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。
show table status;
#显示服务器所支持的不同权限。
show privileges;
#显示create database 语句是否能够创建指定的数据库。
show create database database_name;
#显示create database 语句是否能够创建指定的数据库。
show create table table_name;
#显示安装以后可用的存储引擎和默认引擎。
show engies;
#显示innoDB存储引擎的状态。
show innodb status;
#显示BDB存储引擎的日志
show logs;
#显示最后一个执行的语句所产生的错误、警告和通知。
show warnings;
#只显示最后一个执行语句所产生的错误。
show errors;
#--显示安装后的可用存储引擎和默认引擎。
show [storage] engines;
use
USE <数据库名>
#作用 :指定数据库为当前的使用库 ,被选中后,会出现:Database changed提示
DML SQL语言
insert
#作用 : 向表中插入一条数据 ;
#格式2:
insert into 表名 values(value1,value2,...valueN)
#说明 :向表中的每个字段插入值,值的顺序要和表中的字段要一致
#示例:
insert into abc values(1,'张三','男')
#格式1:
insert into 表名(field1, field2,...fieldN) values(value1, value2,...valueN);
#说明:以上可以插入表中的部分字段 ,而且字段的先后顺序可以打乱,但是值一定要和字段一一对应 。
#示例 :
insert into abc(id,name) values(2,'李四')
delete
# 作用 :删除表中的数据
# 格式:
delete from 表名 [where 条件]
#示例:
delete from abc # 删除表abc中的全部数据
delete from abc where id = 2 # 删除id=2的数据
update
# 作用 : 更新表中的数据 ,可以是一条也可以是全部
#格式:
update 表名 set 字段1=新值1 [,字段2=新值2] [where 条件]
#示例
# update abc set name='张飞' #将表abc中的name值全部修改为张飞
# update abc set name='张飞' where id =2 #将表abc中id=2的name值修改为张飞
DQL SQL语言
select
# select 完整的SQL语句
SELECT [ALL | DISTINCT]
{ * | 表.* | [表.字段1 [as 别名1][,表.字段2] [as 别名2][,...]]}
FROM table_name [as 表别名]
[left | out | inner join 表2] #联合查询
[WHERE ...] #指定结果需要满足的条件
[GROUP BY ...] #指定结果按照哪几个字段来分组
[HAVING ...] #过滤分组的记录必须满足的次要条件
[ODER BY ...] #指定查询记录按一个或者多个条件排序
[LIMIT [偏移量,返回结果记录数]; #指定查询的记录从哪条至哪条
#说明:虽然以上的SQL语句是完整的select语句 ,但是多数情况下,我们编写的都是它的子集,也就是用其中的一部分关键字 。
说明:以下是对select语句的每一部分拆解说明 ,但需要明确的是DQL的关键字只有select ,其它的只是select的一部分 。
基本查询
# 作用 : 查询表中的所有数据
# 格式1 :
select * from 表
# 作用:指定列进行查询
#格式2 :
select 列1,列2,...列n from 表
#示例
select id,name,sex from students # 查询学生的编号,姓名,性别从学生表里
AS作用和用法
#作用:给列或表指定别名,当查询的列名或表名不好记时,可以起一个更容易记忆或写起来更方便的名字作为别名 。
# 格式:
select 列1,列2 as 别名2 from 表名 as 表别名
#说明:当然指定别名时,也可以将as关键字去掉,效果一样 。
DISTINCT关键字
# 作用 :去掉select查询出来的重复值 ,当所有返回值相同时,只返回一条记录 。
# 格式:
select distinct 字段1,字段2, ... from 表名
# 示例:
select distinct name, address from students
where语句
# 作用 :用于检索表中符合条件的记录 ,主要是用来做数据筛查 ,可以在select,update,delete语句后使用
# 格式:
select * from 表 where 条件语句
#示例:
select * from students where age > 30 #查询年龄大于30的学生记录
update students set phone='13210001000' where name = '张三' #将张三手机号修改为13210001000
delete from students where city ='北京' #删除北京学生的数据
说明 : where后面的条件语句 ,其实并非这么简单 ,它是非常灵活且强大的 ,这里我们先拆解条件语句的一部分 。
条件语句 由三部分组成,分别是 :字段 操作符 值 ,这三部分其实都非常灵活 ,都可以有不同情况,下面主要解决操作符的情况,操作符主要包括如下几种情况:
- 比较运算符
- 逻辑操作符
- 模糊查询
- 范围查询
- 空
比较运算符
#说明 :支持的操作符包括 : >,>=,<,<=,!=(不等于)
# 格式 :
select * from 表 where 字段 {> 或 >= 或 < 或 <= 或 !=} 值
#示例:
select * from students where city != '北京' # 查询不在北京的学生记录
逻辑运算符
逻辑运算符主要包括逻辑与,逻辑或,非 三种情况 。
逻辑符 | 语法 | 说明 |
and或 && | 条件1 and 条件2 条件1 && 条件2 | 两个条件必须都满足 |
or或 || | 条件1 or 条件2 条件1 || 条件2 | 两个条件满足其一即可 |
not或! | not 条件 ! 条件 | 如果条件满足,not后变为不满足,如果条件不满足,not后变为满足 |
示例:
#需求1 :查询年龄>30 并且 在北京的学生记录(逻辑与)
select * from students where age > 30 and city = '北京'
#需求2 :查询年龄>30 或 在北京的学生记录 (逻辑或)
select * from students where age > 30 or city = '北京'
#需求3: 查询不在北京的学生记录
select * from students where not city= '北京'
模糊查询
是指使用关键字like进行的查询
#作用: 使用like进行模糊查询 。
#格式:
select * from 表 where 字段 like 值
#说明:使用like ,一般都会结合%或_进行使用
% :表示任意多个字符
_ :表示任意一个字符
#需求1:查询姓名中含有莉的学生记录
select * from students where name like '%莉%'
#需求2:查询姓名以张开头,且只有一个名的学生
select * from students where name like '张_'
范围查询
# 说明 :这里有两个关键字 ,分别为
in : 表示在一个非连续的范围内
between ... and :表示在一个连续的范围内
# 格式 :
select * from 表 where 字段 in (值1,值2,值n)
select * from 表 where 字段 between 值1 and 值2 # 在值1 到 值2 之间 ,两者都是闭区间
#示例:
#需求1:查询北京,上海,深圳的学生记录
select * from students where city in ('北京','上海','深圳')
#需求2:查询年龄在20~30之间的,包括20和30
select * from students where age between 20 and 30
空值查询
# 说明 :空值,代表无值 ,区别于值为0和空字符串,使用is null关键字
#格式 :
select * from students where 字段 is null
#需求:查询身份证号为空的学生
select * from students where card is null
排序
# 作用 :按照某个字段进行排序 ,方便查找
# 说明:排序使用的关键字是order by ,后面跟排序的字段,排序有两种方式 :
ase 代表升序 ,为默认的排序方式
desc 代表降序
# 格式:
select * from students order by 字段1 asc|desc,字段2 asc|desc
# 需求 :按照学生的年龄大小从小到大进行排序
select * from students order by age asc ; # 其中asc可以忽略 。
分组
# 作用 :按照字段分组,将字段值相同的数据放在一个组中,方便统计
# 说明 :分组关键字 : group by , 分组常和聚合函数一起使用
# 格式 :
select * from students group by 字段1,字段2
# 需求 :查询各年龄段的人数
select age,count(age) from students group by age
当然 ,分组后也可以进行数据筛选 ,它使用到的关键字having ,和where有点相似,但又不完全一样 。
# 作用 : 分组后再进行数据筛选
# 说明 :关键字 :having 条件
# 格式:
select 字段1,字段2,聚合函数 from 表名 group by 字段1,字段2 having 字段1,聚合函数
# 需求 :查询男生总数
select sex,count(*) from students group by sex having sex = '男' ;
# 备注 : 以上需求使用where也能实现 ,
where和having的区别:
- where是对from后面的表进行数据筛选,属于对原始数据的筛选
- having是对group by的结果进行筛选
分页
# 作用 : 有时候数据多 ,就可以使用分页显示
# 说明 : 使用关键字limit ,limit后面跟两个参数 ,分别是:, 以及查询数count .
index : 起始查询位置index ,第一条数据的index为0 ,默认值为0 ,若为0,可省略此参数 。
count :查询数
# 格式 :
select * from 表名 limit index count
# 需求1 :查询最后的5条数据
select * from students limit 5
#需求 : 从第3条数据开始查,显示10条数据
select * from students limit 2 ,10
DCL SQL语言
grant
grant主要是授权用户权限 ,主要控制以下访问权限 :
- 可以限制用户访问那些数据库 ,那些表
- 可以限制用户对哪些表执行select,create ,delete,alter等操作 。
- 可以限制用户登录的IP和域名
- 可以限制用户的权限是否授权给别的用户
# 格式 :
grant 权限 on 对象 to 用户
#说明:
权限:其实就是对权限控制使用的关键字,如:select ,create 等 。
# 示例1:test用户,对school数据库下的所有数据表具有的增,删、改、查的数据的权限, 。
grant insert on school.* to test@'%' ;
grant select on school.* to test@'%' ;
grant update on school.* to test@'%' ;
grant delete on school.* to test@'%' ;
#或者,用一条MySQL命令替代 :
grant insert,select,update,delete on school.* test@'%' ;
#示例2:只能对shool下的students表进行查询权限
grant select on school.students to test@localhost
# 示例3 :对dev用户 ,设置创建,修改,删除对象权限
grant create,alter,drop on school.* to dev@'%' ;
revoke
revoke正好与grant相反 ,是回收权限(取消权限) 。
# 作用 : 取消权限
# 格式 :
revoke 权限 on 库.表 from 用户名@'ip'
# 示例1 :回收test用户的删除,修改权限
revoke delete,update on test.school.* from test@'%'
# 示例2 :取消test的取消权限
revoke insert on *.* from test@'localhost'
commit
commit和rollback主要用于事务处理 。使用事务有两种方式,分别为隐式事务和显式事务。隐式事务实际上就是自动提交,在MySQL中,自动提交(autocommit)在支持事务(transaction)的引擎中,若autocommit=true,则不需要commit的情况下直接提交语句形成永久性修改,Mysql默认打开autocommit,也可以通过配置设置。
# 查询是否设置了自动提交 ,
mysql> show variables like 'autocommit';
--------------- -------
| Variable_name | Value |
--------------- -------
| autocommit | ON |
--------------- -------
1 row in set (0.04 sec)
# 可以将自动提交关闭
mysql > set autocommit = 0 # 0 代表关闭 ,1 代表已开启 。
mysql> start transaction; #手动开启事务
mysql> insert into students(name) values('allen');
mysql> commit; #commit之后即可改变数据
rollback
mysql> start transaction; #开启事务
mysql> insert into students(name) values('jony');
mysql> rollback;
mysql> select * from students; # 实际的jony数据并不会插入到数据库