今天呢?小采风同学决定一改话痨的毛病,不多说,一句话:
高效的Sql语句,可以极大提高数据库服务器的性能。所以,抓紧时间温习一下曾经学习过的Sql语句。与君把酒言欢一次,可否?
一、表的创建
本文以学生表为例,一起学习一下基本的Sql语法,学生表创建如下:
create table student(
id int primary key,
name varchar(20) not null,
chinese float not null,
english float not null,
math float not null
)engine=Innodb collate utf8_general_ci default charset=utf-8;
针对表的设计,有以下几点注意事项:
- 符合第一范式,即所有字段只有单一属性不可分割,由基本数据类型组成,必须是二维表;
- 适合的字段基本类型,即基本类型的选择有很多,无可厚非,但是工程师应该精益求精,选择最适合的基本类型,关于类型的选择原则,会有新的博客更新;
- 存储引擎、字符集及校对规则的选择,即存储引擎需要根据业务并发性,是否支持事务、索引优化等方面综合考虑;
二、表的修改
上面的学生表信息是简单的,需要进行一些修改,常见的修改语法如下:
//查看表
desc student
//修改表名
rename table student to stu
//添加列
alter table student add image blob
//删除列
alter table student drop image
//修改列基本类型
alter table student modify name varchar(40)
//修改列名
alter table student change column name stu_name varchar(20)
三、表的插入删除和更新
Sql语句有增删改查,查使用最多,先简单介绍其他三种:
//插入insert
insert into student(id,name,chinese,english,math) values(1,'a',89,78,90);
insert into student(id,name,chinese,english,math) values(2,'b',67,98,56);
insert into student(id,name,chinese,english,math) values(3,'c',87,78,77);
insert into student(id,name,chinese,english,math) values(4,'d',88,98,90);
insert into student(id,name,chinese,english,math) values(5,'e',82,84,67);
//更新update
update student set chinese=98 where name='a';
update student set math=math+23 where name='c';
update student set english=100,math=98 where name='d';
//删除delete
delete from student where name='e';
delete from student;
insert、update和delete语句简单,要是把select放在前面介绍,估计看官早已经读不下去了?
四、查询语句
在数据库的访问请求中,读请求,即select操作是最为频繁的。高效的select语句,有利于优化数据库服务器的性能,一起看一看简单的语句查询吧!
//过滤表中重复数据:关键字distinct
select distinct english from student;
//查询英语成绩大于90分的同学:where子句过滤
select name from student where english>90;
//查询所有名字a开头的学生的学生成绩:通配符
select * from student where name like 'a%'
//对总分排序后输出,然后再按从高到低的顺序输出:求和操作
select * from student order by (math+english+chinese) desc;
//求一个班级数学平均分?:聚合函数
select avg(math) from student;
//统计数学成绩大于90的学生有多少个?:聚合函数
select count(*) from student where math>90;
- 在select子句中,存在先后顺序:
select(返回表达式)from(检索的表)where(行级过滤)group by(分组说明)having(组级过滤)order by(输出排序)limit(限制输出)
五、表间约束
- 表间约束通过外键实现
- not null 非空约束和 unique 唯一约束
1 一对一:一夫一妻
create table male(
id int primary key auto_increment,
name varchar(20)
)
create table female(
id int primary key auto_increment,
name varchar(20),
male_id int,
//通过外键实现约束
constraint male_id_FK foreign key(male_id) references male(id)
)
2 一对多:一个部门对应多个员工
create table department(
id int primary key auto_increment,
name varchar(30)
)
create table employee(
id int primary key auto_increment,
name varchar(30),
salary double,
department_id int,
constraint department_id_FK foreign key(department_id) references department(id)
)
3 多对多:一个学生对应多个老师,一个老师对应多个学生
create table teacher(
id int primary key auto_increment,
name varchar(30),
salary double
);
create table student(
id int primary key auto_increment,
name varchar(30)
);
//通过第三张表,实现多对多约束
create table teacher_student(
teacher_id int,
student_id int,
//联合主键,标识唯一性
primary key(teacher_id,student_id),
constraint teacher_id_FK foreign key(teacher_id) references teacher(id),
constraint student_id_FK foreign key(student_id) references student(id)
);
以上表结构是为清晰理解而构成的,并不一定是最为高效的,具体业务中会考虑反范式化增加冗余来实现高效查询,先来看一看多对多表的查询语句:
//插入语句
insert into teacher(name,salary) values('aaa',8000);
insert into teacher(name,salary) values('bbb',8000);
insert into student(name) values('ccc');
insert into student(name) values('ddd');
insert into student(name) values('eee');
//下面的语句的含义是
//老师aaa的学生有: ccc ddd eee 老师bbb的学生有:ccc
insert into teacher_student(teacher_id,student_id) values(1,1);
insert into teacher_student(teacher_id,student_id) values(1,2);
insert into teacher_student(teacher_id,student_id) values(1,3);
insert into teacher_student(teacher_id,student_id) values(2,1);
//已知老师的id为1,查询出1号老师所有的学生:t_s和s是表的别名
select s.* from teacher_student t_s ,student s where teacher_id=1 and t_s.student_id=s.id;
//已知学生的id为1,查询出1号学生的所有老师
select t.* from teacher_student t_s,teacher t where student_id=1 and t_s.teacher_id=t.id;
Mysql中的语法还有很多很多,这里是汪洋大海中的一滴,具体参见下面
【Mysql sql语法大全】(http://www.cnblogs.com/yunf/archive/2011/04/12/2013448.html)
数据库的学习道路是漫长的,小白还在不断修炼中,预知后事如何,请看下回分解。手机端的代码是看不清楚的,PC端代码一切正常,不知道自己markdown使用的问题,还是什么?期待下次可以解决_