Sql基础

-- DDL

  • create database 数据库名 [character set 字符集] [校对规则];
  • 查看所有数据库: show databases;
  • 查询所有校对规则: show collation;
  • 查看数据库结构: show create database 数据库名;
  • 删除数据库: drop database 数据库名;
  • 修改数据库: alter database 数据库名 character set 字符集(gbk,utf8);
  • 切换数据库: use 数据库名;
  • 查看正在使用的数据库: select database();

创建表: create table 表名(

字段名 字段类型 约束,

...

);

字段类型:tinyint,smallint,bigint,int,bool,boolean,double,char,varchar(),text,date,datetime,float,blob

约束:主键 primary key

唯一: unique

非空: not null

int id primary key auto_increment

查看所有表: show tables;

查看表定义结构: desc 表名;

修改表:

增加一列: alter table 表名 add 字段名 字段类型 where 约束;

修改列的类型约束: alter table 表名 modify 字段名 字段类型 where 约束;

修改列的名称/类型/约束: alter table 表名 change 旧字段名 新字段名 字段类型 约束;

删除一列: alter table 表名 drop 字段名;

修改表名: rename table 旧表名 to 新表名;

删除表: drop table 表名;

-- DML

插入指定指定列: insert into 表名(列1,列2...) value (值1,值2...);

插入所有列: insert into 表名 value (值1,值2...);

更新记录: update 表名 set 列名=值,列名=值...where 条件;

删除记录: delete from 表名 [where 记录];-- 逻辑删除

truncate table 表名;-- 物理删除

-- DQL

查看所有的列: select*from 表名;

查询表的列: select 字段名,字段名... from 表名;

去重查询: select distinct 字段 from 表名;

(别)取名查询: select 字段 as 名 from 表名 as 名;

列运算查询询(+,-,*,/等): select 列运算 from 表名;

比较运算符: > >= < <= = <>

-- where条件

  • select*from 表名 where 字段 between 值 and 值;
  • select*from 表名 where 字段 in(值,值,值..);
  • select*from 表名 where 字段 like '_%';
  • select * from product where price > 4000 or/and price < 1000;
  • select * from product where not(pid in(1,3,5,7,9,11,13));

-- 排序查询:

select...from 表名 order by 字段名 asc|desc;-- asc:升序,desc:降序,不指定默认是升序

-- 聚合函数

select 聚合函数(字段) from 表名;

select max(score) from student;

聚合函数: max,min,avg,sum,count

  • count :按照列去统计有多少行数据。

在根据指定的列统计的时候,如果这一列中有null的行,该行不会被统计在其中。

  • sum :计算指定列的数值和,如果不是数值类型,那么计算结果为0
  • max :计算指定列的最大值
  • min :计算指定列的最小值
  • avg :计算指定列的平均值

-- 分组查询

select...from 表名 [group by 分组字段] [having 条件];

-- 单独分组 没有意义,因为 返回每一组的第一条记录

select sex,count(*) from student group by sex having count(*)>5;

where -- 1,先过滤再分组 2,where后面不可以使用聚合函数

having-- 1,先分组再过滤 2,having后面可以使用聚合函数

-- 分页查询

select...from 表名 limit a,b

分页查询规律: limit (页码-1)*每页显示的记录数,每页显示的记录数

查询sid为1到4--->第1页

select * from student limit 0,4;

select * from student limit 4;

从第5条记录到最后

select * from student limit 4,-1

select ... from 表名 [where...][group by..][having...][order by...][limit...]

select ... from ... where ...

select ... from ... group by ...having...

select ... from ... order by ...

select ... from ... limit ...

-- 添加外键

语法: constraint 外键名 foreign key(做为外键的字段名) references 主表名(主表作为主键的字段名);

已有表添加外键: alter table 表名 add constraint 外键名 foreign key(外键字段名) references 主表名(主键字段名); -- 为已存在的表添加外键,注意:外键字段上不能有非法数据

-- alter改变 table列表 constraint约束 foreign指定 key键 references参照引用

create table 主表名(

id 类型 约束,-- 作为主键

...

);

create table 副表名(

字段名 字段类型 约束,

...

字段_id 类型, -- 作为外键被约束,使用别人的数据

constraint 外键名 foreign key(字段_1d) references 主表名(id)

);

-- 设置外键之后,添加非法数据,会失败

-- 删除外键

语法: alter table 表名 drop foreign key 外键名;

-- 外键级联更新和级联删除

-- ON打开 UPDATE更新 CASCADE级联

alter table add constraint 外键名 foreign key(外键字段名) references 主表名(主键字段名) on update on delete cascade;

-- 多表查询

1. 不管我们查询几张表,表连接查询会产出笛卡尔积,我们需要消除笛卡尔积,拿到正确的数据。

我们需要找到表与表之间通过哪个字段关联起来的(通常是外键=主键)

2. 消除笛卡尔积规律:2张表需要1个条件,3张表需要2个条件,4张表需要3个条件。(条件数量=表的数量-1),每张表都要参与进来

3. 多表连接查询步骤:

3.1. 确定要查询哪些表

3.2. 确定表连接条件

3.3. 确定查询字段

-- 内连接查询(交集)

隐式内连接语法: select ...from 表名1,表名2 where 关联条件 and 其他条件;

显示内连接语法: select...from 表1[inner] join 表2 关联条件;

-- inner内部 join on连通

-- 外连接查询[交集并left或并right]

左外连接: select...from 左表名 left [outer]join 右表名 on 条件;

右外连接: select...from 右表名 right [outer]join 右表名 on 条件;

-- 子查询

1.单个值:肯定在 WHERE 后面作为 条件 SELECT ... FROM 表 WHERE 字段 [=,>,<, <>,...](子查询);

2.单行多列:肯定在 WHERE 后面作为 条件 子查询结果是单列多行,结果集类似于一个数组,父查询使用 IN 运算符 SELECT ... FROM 表 WHERE 字段 IN (子查询);

3.多行多列:肯定在 FROM 后面作为 表 SELECT ... FROM (子查询) 表别名 WHERE 条件; 子查询作为表需要取别名,否则这张表没用名称无法访问表中的字段

-- 事务

事务可以保证一组操作要么全部成功,要么全部失败

开启事务: start transaction ;

提交事务: commit;;---->事务结束

回滚事务: rollback;;---->事务结束

事务特点: 原子性,一致性,持久性,隔离性

事务隔离级别:

读未提交:可能发生脏读,可能发生不可重复读,可能发生幻读

读提交: 不可能发生脏读,可能发生不可重复读,可能发生幻读

可重复读:不可能发生脏读,不可能发生不可重复读,可能发生幻读

串行化:不可能发生脏读,不可能发生不可重复读,不可能发生幻读

脏读:B还没提交,A就读到了

脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据

脏数据:从目标中取出的数据已经过期、错误或者没有意义,这种数据就叫做脏数据

不可重复读:B提交了,A就变了

幻读:数据丢失

-- 回滚点:

-- 设置回滚点: savepoint 名字;

-- 回滚到回滚点: rollback to 回滚点的名字;

-- 注意: 回滚到回滚点是没有结束事务的,只有commit或者rollback才会结束事务

能够理解三大范式

1.列不可分割---1NF

2.不能产生局部依赖---2NF

3.不能产生传递依赖--3NF

记住: 一张表只描述一件事,每个列都不能分割,并且每个列都直接依赖主键

全部评论

相关推荐

5 8 评论
分享
牛客网
牛客企业服务