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)

 

 

 

 

 

 

 

   

 

 

  

 

 

 

 

 

 

  

posted @ 2016-05-04 15:43  小司机  阅读(210)  评论(0编辑  收藏  举报