目录
结构化查询语言
结构化查询语言(Structured Query Language),简称SQL,是数据库的标准查询语言。可以通过DBMS对数据库进行定义数据,操纵数据,查询数据,数据控制等
SQL可以分为:
1、数据定义语言(DDL)
Data dafinitaon Language
如创建表create
删除表drop
修改表alter
清空表truncate,彻底清空,无法找回。
查看所有数据库:show databases;
查看所有表:show tables;
modify
删除数据库 drop database db1802;
创建数据库 create database abc default character set utf8;
选择数据库 use abc;
创建表 create table p1(id int(3),name varchar(20));
查看表 desc p1
插入数据 nsert into p1 values(1,'张三');
添加表字段语句 alter table p1 add(age int(3));
删除表字段语句 alter table p1 drop id;
修改表字段类型格式 alter table p1 modify age varchar(2);
修改表字段名称 alter table p1 change age p1age int(3);
修改表名 alter table p1 rename per;
清空表结构 truncate table per;
删除表结构 drop table per;
修改命令提示符界面显示编码集:set names GBK
约束条件Constraint
对插入表中字段的数据起到一定的条件限制。
主键约束:primary key 要求作为主键的字段的字段值非空且唯一,一张表中只能有一个主键,但一个主键中可以有多个字段 AUTO_INCREMENT自增。
非空约束: not null 要求有非空约束的字段不可为null值。
唯一性约束:unique要求有唯一性约束的字段不可以重复,但是可以为null.
检查性约束:check(条件)— check(gender in(‘f’,’m’)) 要求在插入数据时必须符合字段的检查条件,可以为null
外键约束: foreign key要求有外键约束的字段A必须依赖于另外一个字段B,字段B要有主键约束。字段A的值,要么是null,要么 必须是字段B里的值。
序列:作用用来给作为主键约束的字段进行有序的自增。auto_increment默认序列是从1开始,每次自增+1;
create table t_01
(tid int primary key auto_increment, --主键约束,不能重复,不能为空,自增
tname varchar(20) not null, --非空约束
IdCard varchar(20) unique, --唯一性约束
gender enum('男','女'), --检查性约束
mgr int,
foreign key(mgr) references t_01(tid) --外键约束,被约束的字段存放的数据要么是null,要么是主键中有的
);
2、数据操纵语言(DML)
insert:向表中插入数据
delete:删除表中的数据,格式:delete fromtableName [where 条件]
update:修改表中的数据 格式:updatetableNamesetcolName1=value1[,colName2=value2] [where 条件]
where条件: 对表中的数据增加条件进行限制,起到过滤的作用。
格式: where colName 关系运算符 value [or|and 条件2]
关系运算符: >,>=,
null值操作:比较null时,不能使用=或者!= 或者<>,而是使用 is或者is not,在select子句中,使用关系运算符
练习
--创建一个表
create table temp_day02(
tid int,
tname varchar(20),
birth date,
address varchar(50)
);
--================================================================================
--插入数据 1001,'jack' ,'上海' ,下面是两种插入方式,第二种可以批量插入。只需添加多个用逗号隔开即可
insert into temp_t02 values (1001,'jack',null,'上海');
insert into temp_t02(tid,tname,address) values(1002,'rose','beijing');
--================================================================================
--删除表temp_t02中的所有数据。
delete from temp_t02;
--删除表中temp_t02中的tid为1001的记录。
delete from temp_t02 where tid=1001;
--删除表temp_t02中 tid为1002和地址为上海的的数据
select * from temp_t02;
delete from temp_t02 where tid=1002 and address='上海';
--================================================================================
--修改表temp_t02中的字段address为中国。
update temp_t02 set address='中国';
--修改表temp_t02中的tid为1002的address为英国,人名为micheal。
update temp_t02 set address='英国',tname='micheal' where tid=1002;
--将生日为null的记录的tname改为'general'
update temp_t02 set tname='general' where tbirth is null;
--将tid为1001的tbirth改为'2000-8-8';
update temp_t02 set tbirth = '2000-8-8' where tid = 1001;
--将tid为1002的address改为null.
update temp_t02 set address=null where tid=1002;
3、事物控制语言(TCL)
:Transation Control Language
有时我们可能需要使用DML进行批量数据的删除,修改,增加。比如,在一个员工系统中,我们想删除一个人的信息。除了删除这个人的基本信息外,还应该删除与此人有关的其他信息,如邮箱,地址等等。那么从开始执行到结束,就会构成一个事务。对于事务,我们要保证事务的完整性。要么成功,要么撤回。
一般情况下事务要符合四个条件(ACID):
原子性(Atomicity):事务要么成功,要么撤回。不可切割性。
一致性(Consistency):事务开始前和结束后,要保证数据的一致性。转账前账号A和账号B的钱的总数为10000,转账后账号A和账号B的前的总数应该还是10000;
隔离性(Isolation):当涉及到多用户操作同一张表时,数据库会为每一个用户开启一个事务。那么当其中一个事务正在进行时,其他事务应该处于等待状态。保证事务之间不会受影响。
持久性(Durability):当一个事务被提交后,我们要保证数据库里的数据是永久改变的。即使数据库崩溃了,我们也要保证事务的完整性。
commit 提交
rollback 撤回,回滚。
savepoint 保存点
事务:只有DML操作会触发一个事务。存储引擎(ENGINE):就是指表类型.当存储引擎为innodb时,才支持事务。有一个默认的存储引擎为Myisam。不支持事务。
事务的验证:
第一步:start transaction
第二步:savepoint 保存点名称。
第三步:DML
第四步:commit/rollback;
4、数据查询语言(DQL)
:Data Query Language
(1)select/for 基本查询语句
格式: select子句 from子句 selectcolName[,colName…….] fromtableName;
(2)给列起别名
格式:select列名1 as“要起的名” [, 列名2 as“要起的名” ,… ] from tableName;
(3)where子句
作用:在增删改查时,起到条件限制的作用。
多条件写法:in| not in (集合元素,使用逗号分开); 注意:同一个字段有多个值的情况下使用。 in 相当于 or, not in 相当于 and
all| any与集合连用,此时集合中的元素不能是固定的必须是从表中查询到的数据。
范围查询:colName betweenval1 andval2; 查询指定列名下的val1到val2范围中的数据
模糊查询:like
通配符:% 表示0或0个以上字符。_ 表示匹配一个字符
格式: colName likevalue;
练习
--创建表
create table emp (
empno int(5),
ename VARCHAR(10),
job VARCHAR(9),
mgr int(4),
hiredate DATE,
sal int(7),
comm int(7),
deptno int(2)
);
--添加数据
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20),
(7499 ,'ALLEN' , 'SALESMAN' , 7698 , '1981-2-10' , 1600 , 300 , 30),
(7521 ,'WARD', 'SALESMAN' , 7698, '1981-2-22' , 1250 , 500 , 30),
(7566 ,'JONES','MANAGER' , 7839, '1981-4-2' , 2975 , NULL , 20),
(7654 ,'MARTIN','SALESMAN' , 7698, '1981-9-28', 1250 , 1400 , 30),
(7698 ,'BLAKE','MANAGER' , 7839 , '1981-5-1' , 2850 , NULL , 30),
(7782 ,'CLARK','MANAGER' , 7839 , '1981-6-9' , 2450 , NULL , 10),
(7788 ,'SCOTT','ANALYST' , 7566, '1987-4-19', 3000 , NULL , 20),
(7839 ,'KING','PRESIDENT' ,NULL, '1981-11-17', 5000 , NULL , 10),
(7844 ,'TURNER','SALESMAN' , 7698, '1981-9-8', 1500 , 0 , 30),
(7876 ,'ADAMS','CLERK' , 7788 , '1987-5-23', 1100, NULL , 20),
(7900 ,'JAMES','CLERK' , 7698 , '1981-12-3', 950 , NULL , 30),
(7902 ,'FORD','ANALYST' , 7566 , '1981-12-3' , 3000 , NULL , 20),
(7934 ,'MILLER','CLERK', 7782 , '1982-1-23', 1300 , NULL , 10),
(8002 ,'IRONMAN','MANAGER', 7839 , '1981-6-9', 1600, NULL , 10),
(8003 ,'SUPERMAN','MANAGER', 7839 , '1981-6-9', 1600 , NULL , NULL);
1、查询
--查询员工表emp中的 员工姓名,员工职位,员工入职日期和员工所在部门。
select ename,job,hiredate,deptno from emp;
--==============================================================
2、给列起别名
--查询员工姓名和员工职位。分别起别名,姓名和职位。
select ename as "姓名" ,job as "职位" from emp;
--==============================================================
3、where子句
--查询员工表中部门号为10和20的员工的编号,姓名,职位,工资
select empno,ename,job,sal from emp where deptno=10 or deptno =20;
--查询员工表中部门号不是10和20的员工的所有信息。
select * from emp where deptno<>10 and deptno<>20;
使用in ,not in修改上面的练习
select empno,ename,job,sal from emp where deptno in(10,20);
select * from emp where deptno not in (10,20);
all|any与集合连用:
--查询员工allen,blake,clark三个人的工资
select * from emp where sal>all(select sal from emp where ename in ('allen','blake','clark'));
范围查询:
--查询工资大于等于1500并且小于等于2500的员工的所有信息。
select * from emp where sal between 1500 and 2500;
--练习2:查询工资小于2000和工资大于2500的所有员工信息。
select * from emp where sal not between 2000 and 2500;
模糊查询:like
--查询员工姓名中有a和s的员工信息。
select ename,job,sal,comm,deptno from emp where ename like '%a%' and ename like '%s%';
select ename,job,sal,comm,deptno from emp where ename like '%a%s%' or ename like '%s%a%';
(4)order by子句(排序)
当在查询表中数据时,记录比较多,有可能需要进行排序,此时我们可以使用order by子句。
语法:select…fromtableName [where子句][order by 子句]
注意: 可以通过一个或多个字段排序。
格式: order by colName [ ASC| DESC][ , colName1….[ ASC| DESC] ];
排序规则: ASC:升序 ,DESC:降序,默认是升序排序。
(5)distinct 去重
有的时候我们需要对重复的记录进行去重操作,比如,查询表中有哪些职位,此时,一种职位只需要显示一条记录就够。
位置:必须写在select关键字后。
(6)group by子句(分组查询)
分组查询与分组函数(聚合函数):有的时候,我们可能需要查询表中的记录总数,或者查询表中每个部门的总工资,平均工资,总人数。这种情况需要对表中的数据进行分组统计。需要group by子句。
位置:select…fromtName [where条件] [group by子句] [order by子句]
用法:group by Field1[,Field2]。
注意:在分组查询时,select子句中的字段,除了聚合函数外,只能写分组字段。
聚合函数:
count(Filed)统计指定字段的记录数。
sum(Filed)统计指定字段的和。
avg(Filed)统计指定字段的平均值
max(Filed)返回指定字段中的最大值。
min(Filed)返回指定字段中的最小值。
PS:聚合函数会忽略null值。因此有时候需要使用函数:ifnull(field,value)(如果field字段对应的值不是null,就使用field的值,如果是null,就使用value.)
注意:多字段分组时(多表联合查询时不加任何条件),最多分组的数目为Filed1*Field2[*Filed3….]
(7)having子句(分组查询添加条件)
在分组查询时,有的时候可能需要再次使用条件进行过滤,这个时候不能where子句,应该使用having子句。having子句后可以使用聚合函数。
位置:位于group by子句后
(8)基本查询总结
一个基本的查询语句包含的子句有:select子句,from子句,where子句,group by子句,having子句,order by子句
一个完整的查询语句:select..from..[where..][group by..][having..][order by..]
执行顺序:先执行from子句,再执行where子句,然后group by子句,再次having子句,之后select子句,最后order by子句
(9)关联查询
概念:当在查询时,我们所需要的数据不在一张表中,可能在两张表或多张表中。此时我们需要同时操作这些表。即关联查询。
等值连接:在做多张表查询时,这些表中应该存在着有关联的两个字段。我们使用某一张表中的一条记录与另外一张表通过相关联的两个字段进行匹配,组合成一条记录。
笛卡尔积:在做多张表查询时,我们使用某一张表中的每一条记录都与另外一张表的所有记录进行组合。比如表A有x条,表B有y条,最终组合数为x*y,这个值就是笛卡尔积,通常没有意义。
内连接:只要使用了join on。就是内连接。查询效果与等值连接一样。
用法:表A [inner] join表B on关联条件
外连接:在做多张表查询时,我们所需要的数据,除了满足关联条件的数据外,还有不满足关联条件的数据。此时需要使用外连接。
驱动表(主表):除了显示满足条件的数据,还需要显示不满足条件的数据的表
从表(副表):只显示满足关联条件的数据的表
外连接分为三种
左外连接:表A left[outer] join表B on关联条件,表A是驱动表,表B是从表
右外连接:表A right[outer] join表B on关联条件,表B是驱动表,表A是从表
全外连接:表A full[outer] join表B on关联条件,两张表的数据不管满不满足条件,都做显示。
自连接:在多张表进行关联查询时,这些表的表名是同一个。即自连接。
(10)高级关联查询
有的时候,我们要查询的数据, 一个简单的查询语句满足不了,并且我们使用的数据,在表中不能直观体现出来。而是需要预先经过一次查询才会有所体现。那么先执行的查询,我们称之子查询。子查询嵌入到的查询语句称之为父查询。
子查询返回的数据特点:
(1) 可能是单行单列的数据。
(2) 可能是多行单列的数据
(3) 可能是单行多列的数据
(4) 可能是多行多列的数据
1)子查询可以在where、from、having、select字句中,在select子句中时相当于外连接的另外一种写法。
--查询表中各部门人员中大于部门平均工资的人
select ename,sal,a.deptno ,b.av
from emp a,
(select deptno,avg(ifnull(sal,0)) as av from emp group by deptno) b
where a.deptno=b.deptno and a.sal>b.av
order by deptno ASC;
5、数据控制语言(DCL)
Data Control Language
作用是用来创建用户,给用户授权,撤销权限,删除用户。+
格式:
1、创建用户:create user username@ip identified by newPwd;
2、显示用户的权限:show grants for username@ip;
3、授权:grant 权限1,权限2… on 数据库名.* to username@ip;
DML权限:insert,delete,update
DQL权限:select
DDL权限:create,alter,drop…
4、撤销权限:revoke 权限1,权限2..on 数据库名.* from username@ip;
5、删除用户:drop user username;
使权限立即生效:flush privileges;