sql文件怎么写(.sql文件怎么写)

sql文件怎么写(.sql文件怎么写)创建数据库 创建表 数据类型 字符串 定长 char 可变长度 varchar 数字 int integer 日期 date 约束 null not null primary key 增加表的列 删除表的列 删除表 1 如果想删除表 当然用 drop 如果想保留表而将所有数据删除 如果和事务无关 用 truncate 即可



创建数据库

 

创建表

 

数据类型

-字符串:定长char,可变长度varchar

-数字:int/integer

-日期:date

约束:

-null

-not null

-primary key

 

增加表的列

 

删除表的列

 

删除表

1)如果想删除表,当然用drop;

如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;

如果如果想保留表而将所有数据删除,如果和事务有关,或者想触发trigger,还是用delete;

2)执行速度:drop>truncate>delete

3)drop、truncate是立即执行,不能回滚

4)drop、truncate不能加where条件

 

插入数据

可以只插入所需要的列,但其他未被写入的列必须可以为空,如果设置成不为null那将报错

 

更新数据

 

为列设置别名

 

删除重复数据

 

mysql的执行顺序

 

执行顺序是:from-on-join-where-groupby-having-select-orderby-limit

如果是单表就根据这个执行顺序来套入,order by里的字段前面必须出现,group by出现或者select出现都可以

https://www.nowcoder.com/practice/e00bbac732cb4b6bbc62a52b930cb15e?tpId=199&tqId=1975672&ru=/exam/oj&qru=/ta/sql-quick-study/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%25E7%25AF%2587%26topicId%3D199

运算符

+、-、*、/、=、<>、 >、 >= <、 <=

 

查出null和not null值

 

逻辑运算符

not、and、between、or、in

 

%跟_

%表示任意字符串,_表示任意一个字符

 

汇总函数

count(),参数写列名则不包括空值,写*则包括空值

sum(),对某列求和

avg(),求某列的平均值

max(),求某列的最大值

min(),求某列的最小值

分组

使用group by分组时,会将相同字段的记录归并成一条记录,这时那些不是在group by后那些字段就可能会出现多个值

分组前:
在这里插入图片描述
分组后:
在这里插入图片描述
如果使用name分组的话,返回应该是虚拟表3,可以看到id跟number一个单元格里有多个值,这样查询出来的结果是错误的;但name每个单元格只有一个数据,因此select name是不会报错的

既然一个单元格有多个值,若使用聚合函数把多个值合并起来,再查询,这样是允许的

例如使用count(id),sum(number)等等

偶尔也会出现多个字段分组,例如group by name,number,我们可以把它看成一个整体字段,用整体来分组

在这里插入图片描述
这也解释了为什么order by出现的字段group by里必须要有

排序

使用order by,默认是asc即升序,desc是倒序

可以根据多个列排序,order by 成绩 asc,课程号 desc;

常见错误

-在groupby和having里不要使用select 里的别名,因为先后顺序问题

-在where中使用聚合函数,都还没根据条件筛选出来,怎么使用聚合函数

视图

可以将查询出来的结果存放在一张虚拟表上,这张虚拟表叫做视图,可以对这张表进行增删改查,但一般不会增删改,因为会影响原表,而原表修改对视图也有影响

 

视图列名跟select子句的列名是一一对应的

视图的作用

当经常需要使用到一个比较复杂的sql查询时,通过sql可以避免每次都写很多的语句,因此具有简单性

视图可以只显示某些数据,它可以保证某些敏感数据不被增删改查,因此具有安全性

子查询

子查询是一次性的视图,可以放在from、in、any(任意一个,有一个满足即可)、all(所有都需要满足)语句中

 

偶尔使用sql语句:子查询

频繁使用sql语句:视图

子查询的执行顺序

看是关联子查询还是非关联子查询

如果是关联子查询,即外部查询返回的每一行数据子查询都要执行一次,然后子查询再将结果返回给外部查询,外部查询根据结果做出决策

 

这样执行顺序是先执行外层再执行内层

如果是非关联子查询,即子查询是独立于太不查询的查询,子查询执行完毕后将结果传给外部查询

 

执行顺序是先执行内层查询再执行外层查询

关联子查询有什么用

在每个组里进行比较的时候,使用关联子查询

联合查询,也叫组合查询

-union,删除重复行

-union all,保留重复行

联合查询select必须拥有相同数量的列且具有相同类型的列

 

https://www.nowcoder.com/practice/979b1a5a16d44afaba5191b22152f64a?tpId=199&tqId=1975677&ru=/exam/oj&qru=/ta/sql-quick-study/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%25E7%25AF%2587%26topicId%3D199

连接查询

连接:表和表之间通过列产生关系,联结就是根据表和表之间的关系将两个表合并在一起的操作

常用的联结:交叉连接、内连接、左连接、右连接、全连接

例如在这里插入图片描述
交叉连接

交叉连接也称笛卡尔积,即将表1的每一行数据和表2的每一行数据合并在一起

行数的3*2
在这里插入图片描述
内连接

查找两张表里共同存在的数据,即交集
在这里插入图片描述
步骤:

-分别从两张表里查出符合条件的行,两张表都需要存在某些数据
在这里插入图片描述
这就解释了https://www.nowcoder.com/practice/88aa923a9a674253b861a8fa56bac8e5?tpId=199&tqId=1975674&ru=/exam/oj&qru=/ta/sql-quick-study/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%25E7%25AF%2587%26topicId%3D199为什么需要用distinct

 

左连接

左表全部查询,右表只查出两张表都存在的数据
在这里插入图片描述
步骤:

-左边表的数据全部取出,右边的表选择同时存在于两张表中的数据

-将两张表中取出的数据进行合并,即交叉联结

 

查出A表里不在B表的数据

 

右连接
在这里插入图片描述
左连接跟右连接差不多,可以互换

全连接
在这里插入图片描述
连接图
在这里插入图片描述
self join

返回表与自己连接后符合条件的记录,一般用在表里有一个字段是用主键作为外键的情况
在这里插入图片描述
case表达式

 

注意事项:

-else语句可以省略不写,默认为空值,建议不要省略

-end不能省略

-case表达式可以写在sql的任意子句中

 

书写sql的思路

-翻译成大白话

-写出分析思路

-写出对应的sql子句

例如查询所有学生的学号、姓名、选课数、总成绩

-大白话

1)学号、姓名(学生表student)

2)选课数(每个学生的选课数目:成绩表score,按学号分组,对课程号计数count)

3)总成绩(每个学生的总成绩:成绩表score,按学号分组,对成绩求和sum)

-思路

1)select 查询结果:[学号,姓名,选课数,总成绩]

2)from 从哪张表查找数据:[学生表student,成绩表score;两个表如何连接?通过学号;用哪种连接?左连接)

3)where 查询条件:[没有]

4)group by 分组:[每个学生的选课数目:按学号分组,对课程号计数count;每个学生的总成绩:按学号分组,对成绩求和sum]

5)having 对分组结果指定条件:[没有]

6)order by 对查询结果排序:[没有]

7)limit 从查询结果中取出指定行:[没有];

 

ID自动编号的数据库当中删除了一条记录后,如何才能使编号仍然保持连续

 

有一个前提条件,id不能为标识列(唯一值),如果是标识列先取消自动标识,然后执行update 语句,执行完毕再把id设置成自动标志

sql 里的计数方式

count(*),count(1),count(主键),count(普通字段)

首先 count(字段)表示的就是该字段里值不为null的数据行有多少行

count(*)其实就是count(0),无论是count(0)还是count(1),0跟1都永远不为null,因此会把为null的行也统计进来

性能比较,count(*)=count(1)>count(主键)>count(普通字段)

count(主键)跟count(普通字段),当拿到行数据之后,还要判断拿到的主键/普通字段是否为null值,因此性能相对会差一点

但为什么count(主键)>count(普通字段),因为主键值比较容易拿到,如果存在二级索引,那么count(主键)不需要回表操作,但是count(普通字段)需要回表操作

而count(*)跟count(1)不需要判断值是否为null值,因此相对性能会快一点

如果存在二级索引,那么innodb遍历数据将会使用二级索引,因为二级索引占的内存小一点,性能会好一点

mysql里的判断

-case函数

 

-if函数

使用CASE函数可以实现非常复杂的逻辑判断,可是若只是实现“如果符合条件则返回A,否则返回B”这样简单的判断逻辑的话,使用CASE函数就过于繁琐。MYSQL提供了IF()函数用于简化这种逻辑判断,其语法格式如下:IF(expr1,expr2,expr3)

如果 expr1 为真&&expr1 <> 0 && expr1 <> NULL),那么 IF() 返回 expr2,否则返回expr3。IF()返回一个数字或字符串,这取决于它被使用的语境

 

where1=1的意义

 

这里where1=1的意义是为了后面if标签为true时给这条sql语句添加一个where

那么where1=1对性能是否有影响,是否会让索引失效

通过explain语句可以可知使用where1=1同样是能走索引的,因此对性能并不会影响。不仅如此,mysql在执行sql的时候会优化sql,自动把1=1这个条件去掉

但是如果数据量大的话,那么mysql优化还是有影响的,建议使用标签,这个标签可以自动把第一个and或者or去掉

 

where跟having的区别

where针对的是一条记录,例如当一条数据id=1时

having针对的是多条记录,例如说求语文平均成绩大于80的班级

where 后面不能接聚合函数,如果需要用聚合函数可以使用having

编程小号
上一篇 2025-03-21 19:40
下一篇 2025-03-28 08:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/10784.html