作为一名后端的软件开发人员,数据库是必须要熟练使用并且知道原理,复习自己的sql语句。(如果做开发这些语句必须背过)
1.数据库表操作
1.1.数据库建表
create table 表名();
示例:
请创建一个学生表(sid,sname,sno,sclass)
CREATE TABLE student(
`sid` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`sname` VARCHAR(20) NOT NULL ,
`sno` INT NOT NULL,
`sclass` INT NOT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;
或者
CREATE TABLE student(
`sid` INT NOT NULL,
`sname` VARCHAR(20) NOT NULL ,
`sno` INT NOT NULL,
`sclass` INT NOT NULL,
PRIMARY KEY(sid)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
##试验表
CREATE TABLE class(
`cid` INT NOT NULL,
`cname` VARCHAR(20) NOT NULL ,
`cno` INT NOT NULL,
`sid` INT NOT NULL,
`tid` INT NOT NULL,
PRIMARY KEY(cid,tid)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
##试验表
CREATE TABLE teacher(
`tid` INT NOT NULL,
`tname` VARCHAR(20) NOT NULL ,
`tno` INT NOT NULL,
`cname` INT NOT NULL,
PRIMARY KEY(tid)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
1.2.修改数据库表
添加列语句
alter table 表名 add column 列名 类型(长度) not null;
修改列语句
alter table 表名 change column 列名 新列名 类型;
删除该列
alter table 表名 drop column 列名;
修改数据库表名
rename table 新表名 to 旧表名;
1.2.1 添加一列
需求给当前的表新添加一列,教师的信息
ALTER TABLE `student` ADD COLUMN `steacher` VARCHAR(20) NOT NULL;
1.2.2 修改列名
将字段教师steacher修改为教师信息teacherinfo
ALTER TABLE `student` CHANGE `steacher` `teacherinfo` CHAR;
1.2.3 删除一列
删除教师信息的这一列teacherinfo
ALTER TABLE `student` DROP COLUMN `teacherinfo`;
1.2.4 修改表名
RENAME TABLE `student` TO `studentInfo`;
1.3. 删除数据表
drop table if exists 表名;
直接使用删除也行:
drop table 表名;
删除学生数据表
DROP TABLE IF EXISTS `student`;
2.数据库数据操作
2.1.数据库插入语句
insert into 表名(字段1,字段2…) values (值1,值2,…)
2.1.1 插入一条数据
INSERT INTO `student` VALUES(1,'xing',1,1);
2.1.2 插入多条数据
INSERT INTO `student` VALUES(2,'lin',2,1),(3,'yan',3,1),(4,'zhi',4,2);
2.2.数据库删除语句
delete from 表名 【where子句】
删除一条数据
#删除一条数据
DELETE FROM `student` WHERE sid = 4;
#删除所有数据
DELETE FROM `student` WHERE 1=1;
#或者
TRUNCATE TABLE `student`;
问题来了:DELETE 和 TRUNCATE 删除的区别
delete直接删除表中的某一行数据,并将删除数据的事务记录在日志中保存以便于进行回滚操作,因此delete更加占用资源,数据控件不释放,因为需要回滚。
truncate一次性从数据库中删除所有的数据,并不把单独的删除操作记录到日志保存,因此不能够回滚、不能够恢复数据,删除的过程中不会激活与表有关的删除触发器,占用资源少、速度更快。
2.3.数据库更新语句
update 表名 set 列名 = 值1 【where 条件】
使用update时不要省略where字句,否则会更新所有的数据信息
更新第一条数据的名字
UPDATE `student` SET sname = 'guapi' WHERE sid = 1;
3.查询
对于数据库的查询操作,需要单独的拿出来进行整理
3.1 普通的查询
select 字段 from 表 【where子句】 【order by子句】【group by子句】
3.1.1 查询数据
SELECT * FROM studentInfo;
SELECT sid,sname,sno,sclass FROM studentInfo;
3.1.2 函数子查询
#查询数据记录条数
SELECT COUNT(*) FROM studentInfo;
#对于该列的数据累加
SELECT SUM(sno) FROM studentInfo;
#对于该列数据求最大值
SELECT MAX(sno) FROM studentInfo;
#对于该列数据求最小值
SELECT MIN(sno) FROM studentInfo;
3.2 联合查询
select 字段 from 表1,表2 where 表1.字段A = 表2.字段B
SELECT studentInfo.sname,studentInfo.sno, class.cname
FROM studentInfo,class
WHERE studentInfo.sclass = class.cno
自联结
select 字段 from 表名 where 字段 = (select ziduan from 表名 where 条件)
3.3 组合查询
并union。union指示MYSQL执行两条select语句,并将输出组合成单个查询结果集。
union规则:
1.UNION必须由两条以上的select语句组成,语句之间使用union分隔
2.union中的每个查询必须包含相同的列、表达式或聚合函数
3.列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含的转换的类型
union自动去除重复的行。
问题:union与union all的区别
1.显示结果不同
union会自动把压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来。
2.对重复结果的处理不同
union all是直接连接,取到得是所有值,记录可能有重复;union 是取唯一值,记录没有重复
3.对排序的处理不同
union将会按照字段的顺序进行排序;union all只是简单的将两个结果合并后就返回。从效率上说,union all 要比union快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用union all。
4.数据库索引
留几个问题,以后再聊
问题1:你知道几个数据库引擎?
问题2:数据库引擎你了解多少?
问题3:MyISam与InnoDB的区别