sql 语句杂记
数据库操作
创建数据库 [] 表示可选内容
create database db_name [数据库选项];
数据库查询
查看当前数据库 show database
查看数据库创建语句: show create database db_name
数据库删除
drop database db_name
修改数据库属性
alter database db_name [修改指令]
表操作
数据库是表的容器,操作表要指定数据库 可以通过 db_name.table_name ,也可以通过指定当前的默认数据库 来省去 指明库名 use db_name
创建表
create table tb_name (列结构) [表选项]
先分析,需要保存的实体数据拥有哪些属性
例子: create table db.math_class (class_no varchar(50),date_start date);
[tips] 如果库名或者表名是特殊字符或关键字 要用‘ ’ 括起来
查看表
有哪些表
show tables [like patten]; example :show tables like ‘exam_%’
查看创建表信息
show create tables table_name;
删除表
drop table if exists table_name;
delete from table_name where 1=1; (只是清空)
修改表
修改表名 rename table table1 to table2 ;
修改列定义: add,modify,change,drop
1增加列 example: alter table tb_name add height int;
2删除列 example:alter table tb_name drop height;
3修改列 example:alter table tb_name modify height varchar(20);
4重命名 example: alter table tb_name change socre fenshu int;
数据操作
创建数据(插入)
获得数据(查询)
删除数据
修改数据
插入:可省字段列表,但值的顺序应与字段列表顺序一致
insert [into] 表名 [字段列表] values [值列表];
example:insert [into] exam_stu (name,stu_no) values ('aa','201402183');
查询:
[tips] 与查询配合的操作选项
order by (字段1,字段2) [asc或desc] 查询结果按照升序降序排序
group by 按组查询 这就是需要注意的一点,应用group by时 ,在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中,
也就是说group by 必须单配聚合函数使用。
limit 数量 ;限制查询记录数量
distinct 去掉重复记录 select distinct 字段1 ,字段2 from 表 where 条件
select 字段列表 from 表名 查询条件;
example : select * from exam_stu;
select * from exam_stu where score>=60;
select name,stu_no from exam_stu;
* 是通配符 代表所有字段 ,条件不写相当于 where 1=1
删除
delete from 表名 条件
delete from exam_stu where score<60; 不写条件就删除所有数据 慎重
修改
update 表名 set 字段=新值 ,字段2=新值,.... where 条件
example : update ex_stu set score = 99 where score >88;
列属性(约束)
1 是否为空 :规定一个字段是否可以为空
NULL 、NOT NULL
2默认值 default , create table tb_exam (a varchar(10 ) default 'aa');
3主键 :primary key,唯一索引 ,可以设置成实体的属性,但常常与实体的信息不相关
1设置成字段 create table teacher (t_id int primary key ,t_name char);
2设置组合主键: 一个主键包含多个字段:create table teacher (t_name varchar(50),t_class int,primary key (t_name,t_class));
设置主键自动增长 :不同数据库不相同 。sql server identity(1,1) :1开始每次+1
实体之间的关系
1 1对1的关系
设计
两个实体表内,存在相同的主键字段,如果一个表1的主键=表2的主键值,这两个表1:1对应
2 1对多 1:n 最常见
设计
在多的哪端增减一个属性字段用于指向该实体1的那端的主键标识
3 多对多 N:M
设计
用一个中间表来实现 1:m ,1:n
外键约束 foreign key
概念:如果一个实体的某个字段指向另一个实体的主键,就称某关键字为另一个表的外键 ,换言之:某个表的外键就是指另外一个表中的主键 。
以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。
作用:用于约束关系内的实体
语法 foreign key (本表外键字段) references 父表(父表主键)
example: create table class (class_id int primary key,class_name varchar(20) not null default 'chusanyiban' conment '班级'); 主表
create table class_stu(stu_id int primary key,stu_name varchar(30) not null default ' ',class_id int ,foreign key (class_id) references class (class_id));子表
设置级联操作 (关联动作)
改动一个表去影响另一个表
在主表数据改变时阈值关联的从表也作出相应的改变
主表更新
主表删除
使用关键字 on update
on delete
允许的级联动作:
cascade : set null 将关联从表字段设置为空
restrict 表示拒绝相关操作
alter table student add foreign key (class_id) references class (class_id) on delete set null ;
联合查询 :将多条select 语句合并到一起
1 union 关键字联合两个select
example:(select 字段1,字段2 from 表 where 条件) union [all](select * from 表)
[tips] 1 如果union 结果有重复记录会消除重复 ,可以通过添加 选项 all 查询所有结果
2 子语句必须在括号内
子查询
分类 : 1按照位置 where from select
2 按照返回类型 集合(列,行) 标量
场景: 获得带过 123班老师的信息
分析:先获得带过123班的老师,在获得他们的信息
select t_name ,t_class from teacher_class where t_name in (select t_name from teacher_class where c_name = '123'); 集合子(列)查询 in 关键字
select t_name ,gender ,c_name from teacher_class where (gender,c_name)=(select distinct gender ,c_name from teacher_class where t_name='lisi')
集合子查询 要配合 in、not in 、=any()、!=all()、!=any()
表子查询,
使得复杂的检索条件可以分布做
[tips] 必须用as 给临时表起名字 ,as可以给变量或者表取别名, like 模糊查找 %通配符
select * from (表子查询)where 条件 ; example : select * from (select t_name,days from class where days>20)as temp where t_name like ‘李%’;
exists (子查询 )
判断依据如果子查询可以返回数据 ,则exists为真,否则为假的、
example:select * from teacher where exists (select * from teacher where class_id=t_id)
连接查询 (重要)
select join
将多张表记录连接起来,多张表一起使用,使之成为一张表
连接分类 :外连接,内连接,自然连接
内连接 :查询 结果不允许存在连接不到的数据
inner join 等同于Where查询如:
Select * From A, B Where A.aid = B.bid
语法:tb_left inner join tb_right on 连接条件
Select * From A inner join B on A.aid = B.bid;
这里只显示出了 A.aid = B.bid的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录。
外连接:结果允许存在连接不到的数据
语法 left join right join
left join :
Select * From A left join B on A.aid = B.bid;
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的。 换句话说,左表A的记录将会全部表示出来,而右表B只会显示符合搜索条件的记录(例子中为: A.aid = B.bid),B表记录不足的地方均为NULL.
自然连接
不写连接条件 natural join
select * from one natural join two ;
_________________________________________________________________
insert 增加数据 使用细节
一般语法 :insert into tb_name (字段列表) values (值列表);
* 如果 插入部分值可以用set语法
insert into tB_name set t_name=‘张三’,c_name=‘武术’;
* 一次插入多条数据 ,先用()构造数据记录列表
insert into tb (t_name,c_name) values ('张三风',‘太极剑’),(‘杨过’,‘黯然销魂掌’);
*解决插入主键冲突 ,主键冲突则替换,否则正常插入
replace into 表明 values (主键,字段值1,2)