Sql语句
#创建数据库
CREATE DATABASE student;
#删除数据库
drop database student;
#创建表
use student; #写了这个就不需要指明在哪个数据库创建表如student.t_class
#创建主键字段
create table t_class(class_id varchar(50) PRIMARY KEY, class_name varchar(50));
#创建外键字段
create table t_student(student_id varchar(50) PRIMARY KEY,
student_name varchar(50),
class_id varchar(50),
FOREIGN KEY (class_id) REFERENCES t_class(class_id));
#修改字段和添加字段
alter table t_student add sex varchar(10);
#显示表
show tables;
show create table t_student;
SHOW COLUMNS FROM t_student;
show databases;
#删除表
drop table t_student;
#数据插入 insert 删除 delete 更新 update 查询 select
insert into t_class (class_id, class_name) values('cr001', '科锐1班');
delete from t_class where class_id = 'cr002';
update t_class set class_name='科锐2班', class_id='cr005' where class_id = 'cr004';
#普通查询
select class_id, class_name from t_class;
select * from t_class;
select * from t_class where class_id = 'cr001' and class_name = '科锐2班';
select * from t_class where class_id >= 'cr001';
select * from t_class where class_id <> 'cr001';
查询的多种语法
#模拟查询关键字用like %表示替代一个或多个任意字符 []限定范围 _仅替代一个字符
例子:
select * from t_class where class_id like '%5%';
select * from t_class where class_name like '%班';
select * from t_class where class_id like '_R%';
select * from t_class where class_id like '[c]%';
#子查询
1子查询的 SELECT 语句可与外部查询指向不同的表或指向同一个表
2 In里面可以填多个值或者select语句,只返回满足in里面条件的选项
3 exists 效率的差异
in适合t_student表比t_class表数据多的情况
exists()适合t_student表比t_class表数据少的情况
(
in是遍历t_student表后去和缓存的t_class表一个一个比较 假如t_student有10 而t_class 有100 那就是10*100次,这种情况用exists比较合适,因为exists是只返回true或false,不管t_class有多少条数据都一样,这样的话exists效率是执行10次
如果是相反的话t_student表是100,t_class表是10,in是一样的次数,还是100*10
exists是100次,虽然exists还是比in次数少,但是in是在缓存中比较,而exists是执行数据库,效率比内存低很多,所以就会得出上面那个使用方案
)
例子:
select * From t_student where class_id in (select class_id From t_class);
select * From t_student where exists
(
select class_id From t_class where t_student.class_id = 'cr001'
);
#查询张三班级名称
select class_name From t_class where class_id =
(
select class_id From t_student where student_name = '张三'
);
#指定行数limit 起始行数 总共显示行数(默认起始行数是0也就是从第一行开始)
#ORDER BY 排序的字段 asc(升序)
select * From t_student ORDER BY student_id asc LIMIT 2;
#多表组合查询 笛卡尔面积
select *from t_student; #3*3
select *from t_class; #5*2
select student_id, student_name, class_name
from t_student, t_class where t_student.class_id = t_class.class_id ;
#临时表(应用于把多张表形成一个符合自己需求的临时表)
select *from
(
select student_id, student_name, class_name
from t_student, t_class where t_student.class_id = t_class.class_id
)table1 where class_name = '科锐1班';
#分组GROUP BY+字段(将查询结果按一个或多个进行分组,字段值相同的为一组),一般结合函数使用
聚合函数 sum求总数 avg求平均数 count求个数
#求每个学生的总分和平均分
select *from
(
select student_id as '学号', sum(score) as '总分', avg(score) as '平均分' from t_select GROUP BY student_id
) talbe1 where 平均分 > 60 and 总分 > 100;
select class_id, count(student_id) from t_student group by class_id;
#临时增加字段(不常用)
select *,
(
select class_name from t_class where t_class.class_id = t_student.class_id
) as 'class_name' from t_student;