一、SQL语言简介
当面对一个陌生的数据库时,通常需要一种方式与它进行交互,以完成用户所需要的各种工作,这时候就需要使用SQL语言了。SQL(Structured Query Language)结构化查询语言,最早是由IBM在20世纪70年代开发出来,为的是IBM的关系数据库管理系统SYSTEM R开发的一种查询语言。SQL结构简洁,功能强大,简单易学,所以自从其出现,SQL得到了广泛的应用。20世纪80年代初,美国国家标准局(ANSI)开始着手定制SQL标准,当前的SQL标准已经几经修改,更趋完善!正是由于SQL语言的标准化,所以大多数关系型数据库系统都支持SQL语言,它已经发展成为多种平台进行交互操作的底层会话语言,前面加My为的是在介绍标准SQL的同时,也将一些MySQL在标准SQL上的扩展一同介绍!
二、SQL分类
1)DDL(Data Definition Languages)语句
数据定义语句,通过这类语言可以对数据库进行创建删除更改
2)DML(Data Manipulation Langyages)语句
数据操纵语句,用于添加、删除、更新和查询数据库记录并检查数据完整性
3)DCL(Data Control Langyages)语句
数据控制语句,通过此类语句可以对数据库的相关权限进行设置
三、DDL语句
对数据库内部的对象进行创建、删除、修改等操作的语言,DDL语句更多的是由数据库管理员(DBA)使用,开发人员一般很少使用。
1)创建数据库
1>create database数据库名,show databases查看数据库;
2>选择要操作的数据库:USE数据库;
3>查看数据库中所有的数据表show tables;
2)删除数据库
drop database数据库名称;
3)创建表
1>创建表
create table表名(
字段1名 字段1类型 列的约束条件,
字段2名 字段2类型 列的约束条件,
...
);
create table t1(id int,age int);
列的约束条件部分可以设置很多信息比如,默认值设置:default null
2>创建完表之后可以查看表的定义
desc表名;
3>查看创建表的SQL语句
show create table表名\G
\G选项使得记录能够按照字段竖向排列,以便更好地显示内容较长的记录,\G后面无需在加分号
4>删除表
drop table 表名;
5>修改表
1) 修改表的字段类型
alter table 表名 modify[column] 字段定义 [first|after 字段名];
2)增加表字段
alter table 表名 add[column] 字段定义 [first|after 字段名];
3)删除表字段
alter table 表名 drop[column] 字段名;
4)字段改名
alter table 表名 change[column] 旧的字段名 字段定义 [first|after 字段名];
注:change与modify都可以修改表的定义,不同的是change后面需要接两次列名,不方便,但是优点是change可以修改字段名称。
5)修改字段排列排序
前面介绍的字段增加和修改语法(add/change/modify)中,都有一个可选项first|after字段名,这个选择可以用来修改字段在表中的位置新增的字段默认是加载在表中最后位置,而change/modify默认都不会改变字段的位置。
alter table t1 modify id2 tinyint first;
alter table t1 modify id2 tinyint after id1;
注意:change/first/after字段名 这些关键字都是属于MySQL在标准SQL上的扩展,在其他的数据库上不一定适用。
6)更改表名
alter table 表名 rename[to] 新的表名;
四、DML语句
DML操作是指对数据库中表记录的操作,主要包括表记录的插入、更新、删除和查询,是开发人员日常使用最频繁的操作。
查询 select * from 表名;
1)插入记录(增)
1>插入记录
insert into 表名(字段1,字段2,字段3,...,字段n) values(值1,值2,值3,...,值n);也可以不用指定字段名,但是values后面的顺序应该和字段的排序一致。
2>一次插入多条记录
insert into 表名(字段1,字段2,字段3,...,字段n) values
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n);
2)更新记录(改)
1>更新一个表
update 表名 set 字段1=值1,字段2=值2,...字段n值n [where 条件];
update t1 set age=100(要修改的字段) where id=4 and age=100;(寻找表为id=4,字段是age=100来修改)
2>更新多个表中数据
update 表1,表2,...表n set 表1.字段1=表达式1,表n.字段n=表达式n [where 条件];
注:多表更新更多的用在根据一个表的字段来动态的更新另外一个表的字段
举例:update t1,t2 set t1.age=2000,t2.age=3000 where t1.id=1 and t2.id=1;
3)删除记录(删)
1>删除单表中的数据
delete from 表名 [where 条件];
delete from t1 where id=1;
2>删除多个表中的数据
delete 表1,表2,...表n from 表1,表2,...表n [where 条件];
不管是单表还是多表,不加where条件将会把表中的所有记录删除,所以操作时一定要小心。
4)查询记录(查)
select 字段名|* from 表名;
1>查询不重复的记录
select distinct field1,field2 from 表名;
只要field1,field2任何一个字段有不同就会被选择!
一般使用distinct,只筛选一个字段!
2>条件查询
注:条件字段比较符号:
=,<,>,>=,<=,!=等比较运算符
多个条件之间可以使用or and等
where 后面接条件
select * from 表名 where 条件
实例:select distinct * from employee where id=1(表中记录);
select distinct * from employee where id=1 or id=3;
select distinct * from employee where id=1 and id=4;(id=1的同时也等于id=4)
select distinct id,name(字段名) from employee(表名);
3>排序和限制
select * from 表名 where 条件 order by field1[desc|asc],field2[desc|asc],..fieldn[desc|asc]
如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序,依次类推。如果只有一个排序字段,则这些字段相同的记录都将无序排列!asc:由低到高(默认值) desc:由高到低
排序:asc:由低到高(默认值)
select * from emp order by deptno,sal asc;
desc:由高到低
select * from emp order by deptno,sal desc;
多个字段排序
select * from emp order by deptno,sal desc,id desc;
限制:在语句的最后面加上limit 数字1,数字2 来进行查询数量的限制。
limit数字1,数字2 数字1代表从第几条记录开始取(是从0开始的),数字2代表取到第几条!
4>聚合
1.sum求和
select sum(salary字段名) from employee(表名);
2.count记录总数
select sum(*|字段名) from employee(表名);
3.max最大值
select max(salary字段名) from employee(表名);
4.min最小值
select max(salsry字段名) from employee(表名);
5.GROUP BY关键字表示要进行分类聚合(上面的这些函数)的字段、比如按部门分类统计员工数量,部门就应该写在GROUP BY后面。
select sum(salary字段名1|字段名2) from employee(表名) group by department;(分别统计各部门的成绩)
6.WITH ROLLUP是可选语法,表明是否对分类聚合后的结果进行再汇总!
select sum(salary字段名1|字段名2) from employee group by department with rollup;(分别统计各部门的成绩,同时把各部门成绩总数汇总)
7.HAVING关键字表示对分类后的结果再进行条件的过滤!
select sum(salary字段名1|字段名2) from employee group by department having sum(salary)>500
(分别统计完各部门的成绩后,过滤掉小过500的成绩)
注意:having和where的区别在于,having是对聚合后的结果进行条件过滤,而where是在聚合前就对记录进行过滤,应该尽可能的记录进行先过滤!
5>表连接
需求:显示多个表中的字段的时候即可使用表连接
连接分类
内连接:选取两张表中相互匹配的记录
外连接:不仅仅选取两张相互匹配的记录,并且会选出其他不匹配的记录
举例:
内连接
select 表.字段,.... from 表1名,表2名,.... where [匹配的条件比如 表1.字段=表2.字段];
select 语句可以给字段起别名!直接写在需要查询显示的字段的后面就OK!
外连接
1)左连接概念:包含左边表中的所有记录(包括右表中没有和它匹配的记录)
select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
2)右连接概念:包含右边表中的所有记录(包括左表中没有和它匹配的记录)
左连接和右连接是可以相互转换的!
6>子查询
需求:一个查询需要另外一个查询的结果参与的时候
用于子查询的关键字:
1.in
语法:select * from employee where id in(select eid from employee_late);
in 在...里面
注意点:in后面的子语句必须只返回一个字段
若查询结果唯一(只有一条)可以使用=代替in
2.not in
与in相反
3.exists
语法:select语句 where exists(select 语句);
exists:后面那个子语句有没有查询出记录来,如果查询出记录来返回true,否则就是false并且查询出来的记录的具体的值是NULL也是没有关系,也是返回true.
not exits
与exits相反
select * from emp where deptno in(select deptno from dept);
若查询结果唯一可以使用=替代in
select * from emp where deptno=(select deptno from dept limit 1);
7>记录联合
碰到需要将两个表或者多个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示这就需要用多个select语句,用UNION或者UNION ALL隔开即可实现
区别:前者 会将多个查询结果合并后并且进行去除重复返回
后者 则直接合并不去除重复
联合的条件:查询的列个数要相等
五、DCL语句
DCL语句主要是DBA用来管理系统中的对象权限时使用的,一般开发人员很少使用。关于权限设置的更多内容以后再做详细讲解。
步骤一:首先需要登录MySQl,mysql-u用户名-p敲回车键,然后输入密码即可
步骤二:命令结束符用“;”或“/g”
步骤三:客户端的连接ID,这个数字记录了MySQL服务到目前为止的连接次数,每个新连接都会自动加1