首页 > 数据库 >sql笔记

sql笔记

时间:2024-08-24 19:03:46浏览次数:10  
标签:列名 sql 笔记 查询 emp 表名 where select

SQL语句可以单行或者多行书写,以分号表示结尾

SQL不区分大小写,关键字推荐大写

注释

单行注释: -- 空格 注释内容 或者 # 注释内容 (mysql特有)(#号可以没有空格)

多行注释: /* 注释 */

sql中语言的分类:

  1. DDL数据定义语言,用来定义数据库对象,数据库,表,列等
  2. DML数据操作语言,用来对数据库中表的数据进行增删改
  3. DQL数据查询语言,用来查询数据库中表的记录(数据)
  4. DCL数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户

登录 mysql -uroot -p密码

创建数据库 create database 库名

显示有哪些数据库 show databases

删除数据库 drop database 库名

也可以写作 drop database if exists 库名

create database if not exists 库名

select database() 查看当前使用的数据库

use 数据库名称 (使用数据库)

show tables 查询当前数据库下所有表的名称

desc 表名称 查询表的结构

创建表

create table 表名 (

字段名1 数据类型,

字段名2 数据类型,

字段名3 数据类型,

..........

字段名n 数据类型

);

sql中用varchar(n)表示字符串,n是规定的最大长度

sql中数据的类型

分类 数据类型 大小 描述
数值类型 tinyint 1 byte 小整数值
数值类型 smallint 2 bytes 大整数值
数值类型 mediumint 3 bytes 大整数值
数值类型 int 或者 integer 4 bytes 大整数值
数值类型 bigint 8 bytes 极大整数值
数值类型 float 4 bytes 单精度浮点数值
数值类型 double 8 bytes 双精度浮点数值
数值类型 decimal 小数值
日期和时间类型 date 3 日期值
日期和时间类型 time 3 时间值或持续时间
日期和时间类型 year 1 年份值
日期和时间类型 datetime 8 混合日期和时间值
日期和时间类型 timestamp 4 混合日期和时间值,时间数
字符串类型 char 0-255 bytes 定长字符串
字符串类型 varchar 0-65535 bytes 变长字符串
字符串类型 tinyblob 0-255 bytes 不超过255个字符的二进制字符串
字符串类型 tinytext 0-255 bytes 短文本字符串
字符串类型 blob 0-65535 bytes 二进制形式的长文本数据
字符串类型 text 0-65535 bytes 长文本数据
字符串类型 mediumblob 0-16777215 bytes 二进制形式的中等长度文本数据
字符串类型 mediumtext 0-16777215 bytes 中等长度文本数据
字符串类型 longblob 0-4294967295 bytes 二进制形式的极大文本数据
字符串类型 longtext 0-4294967295 bytes 极大文本数据

double(a,b) a是指定整数位长度,b是指定小数位长度

删除表 drop table 表名

drop table if exists 表名

DDL操作表

  1. 修改表名

    alter table 表名 rename to 新的表名

  2. 添加一列

    alter table 表名 add 列名 数据类型

  3. 修改数据类型

    alter table 表名 modify 列名 新数据类型

  4. 同时修改列名和数据类型

    alter table 表名 change 列名 新列名 新数据类型

  5. 删除列

    alter table 表名 drop 列名

DML

添加数据

  1. 给指定的列添加数据 insert into 表名(列名1,列名2,...) values(值1,值2,...)

  2. 给全部列添加数据 insert into 表名 values(值1,值2,...)

  3. 批量添加数据 insert into 表名(列名1,列名2) values(值1,值2,...),(值1,值2,...),(值1,值2,...)...

    insert into 表名 values (值1,值2,...),(值1,值2,...),(值1,值2,...)...

给所有列添加数据,列名可以省略

修改数据

  1. 修改表数据

    update 表名 set 列名1=值1 ,列名2=值2,... [where 条件]

    UPDATE student set address="beijing" where name = "阿灰";

    如果不加where条件,则表中所有数据都修改

  2. 删除表数据

    delete from 表名 where条件

    DELETE FROM student WHERE id=2;

    如果不加条件会删除表中所有的记录

查询数据

分为基础查询 条件查询(where) 分组查询(group by) 排序查询(order by) 分页查询(limit)

基础语法

  1. select 字段列表
  2. from 表名列表
  3. where 条件列表
  4. group by 分组列表'
  5. having 分组后条件
  6. order by 排序字段
  7. limit 分页限定

基础查询

查询多个字段

select 字段列表 from 表名

select * from 表名 查询所有数据

去除重复记录

select distinct 字段列表 from 表名

起别名

as: as也可以忽略

SELECT name,math AS 数学成绩,english AS 英语成绩 from student;

屏幕截图 2024-08-02 164136

模糊查询: like关键字加通配符

通配符:

_代表单个任意字符

%代表任意个数字符

排序查询

select 字段列表 from 表名 order by 排序字段名1 [排序方式1],排序字段名2 [排序方式2]...;

排序方式:

asc:升序排列(默认值)

desc:降序排列

注意如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序

分组查询:

聚合函数:

将一列数据作为一个整体进行纵向计算

聚合函数分类:

count(列名) 统计数量(一般选用不为null的列)(注意不是求和,是统计有几行数据)

取值: 1. 主键(非空) 2. *(都统计)

max(列名) 最大值

min(列名) 最小值

sum(列名) 求和

avg(列名) 平均值

聚合函数语法:

select 聚合函数名(列名) from 表名

null 值不参与所有聚合函数的运算

select COUNT(id) from student;

分组查询:

select 字段列表 from [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤]

SELECT sex , AVG(math) from student GROUP BY sex;

注意: 分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义

select sex , AVG(math),COUNT(*) from student where math >70 GROUP BY sex;

select sex,avg(math),count() from student where math > 70 GROUP BY sex having count() > 2

where 和 having 的区别 :

执行时机不一样,where 是分组之前进行限定的,不满足where条件,不参与分组,而having是分组之后对结果进行过滤.

可判断的条件不一样,where不能对聚合函数进行判断,having可以

执行顺序 where 早于 聚合函数 早于 having

分页查询

分页查询语法:

select 字段列表 from 表名 limit 起始索引 , 查询条目数;

索引是从0开始的

计算公式 : 起始索引 = (当前页码数 - 1) \(\times\)每页显示的条数

注意点:

分页查询 limit 是 mysql数据库的方言

oracle 分页使用rownumber

sql server分页查询使用top

约束

约束的概念

约束是作用于表中列上的规则,用于限制加入表中的数据

约束的存在保证了数据库中数据的正确性,有效性和完整性

约束名称 描述 关键字
非空约束 保证列中所有数据不能有null值 not null
唯一约束 保证列中所有数据各不相同 unique
主键约束 主键是一行数据的唯一标识,要求非空且唯一 primary key
检查约束 保证列中的值满足某一条件 check
默认约束 保存数据时,未指定值则采用默认值 default
外键约束 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性 foreign key
自增长约束 保证在不添加数据时,默认在前一行该数据的基础上加一 auto_increment

mysql不支持检查约束

drop table if EXISTS emp;
-- 员工表
create table emp (
id INT PRIMARY KEY, -- 员工id,主键且自增长
ename VARCHAR(50) not null UNIQUE, -- 员工姓名,非空且唯一
joindate DATE not null, -- 入职日期,非空
salary DOUBLE(7,2) not null, -- 工资,非空
bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0
);
INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES (1,"张三","1999-11-11",8800,5000);
select * from emp;

默认字段只有不添加信息时才能生效,添加null是不能生效的

添加约束可以在创建表的时候,也可以在表创建好之后进行修改

修改或者在建表后补充约束条件

alter table 表名 modify 字段名 数据类型 约束条件

删除约束条件

alter table 表名 modify 字段名 数据类型 (不填约束条件,意味着删除约束条件)

外键约束

概念

外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性

添加约束(创建表时)

create table 表名(

列名 数据类型,

......

[constraint] [外键名称] foreign key(外键列名) references 主表(主表列名)

);

添加约束(修改或创建表后补充)

alter table 表名 add constraint 外键名称 foreign key (外键字段名称) references 主表名称(主表列名称)

删除约束

alter table 表名 drop foreign key 外键名称

数据库设计

表关系之多对多:

如订单和商品 一个商品对应多个订单,一个订单对应多个商品

实现方式: 建立第三个中间表,中间表至少包含两个外键,分别关联两方主键

表关系之一对一:

如用户和用户详情

一对一关系用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另外一张表,用于提升查询性能

实现方式:

在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一(unique)

表关系之一对多:

在多的一方添加外键来关联一的一方的主键

多表查询:

笛卡尔积: 取遍A,B集合所有组合情况

多表查询:从多张表查询数据

  1. 连接查询:
    1. 内连接:相当于查询A,B交集的数据
    2. 外连接:
      1. 左外连接:相当于查询A表所有数据和交集部分数据
      2. 右外连接:相当于查询B表所有数据和交集部分数据
  2. 子查询

内连接查询语法:

隐式内连接

select 字段列表 from 表1,表2... where 条件;

例如

select * from emp , dept where emp.dep_id = dept.did (sql中使用 表名.列名 来在多表关系中指定某个表的某个列)

select emp.name , emp.gender , dept.dname from emp , dept where emp.dep_id = dept.did

为了简化代码可以给每个表起别名(as 只是为了规范,实际书写可以省略)

select t1.name,t1.gender,t2.dname from emp t1,dept t2 where t1.dep_id = t2.did;

显式内连接

select 字段列表 from 表1 [inner] join 表2 on 条件;

select * from emp inner join dept on emp.dep_id = dept.did

(inner 是可以省略的)

select 字段列表 from 表1 lift [outer] join 表2 on 条件

selext * from emp left join dept on emp.dep_id = dept.did (outer可以省略)

select 字段列表 from 表1 right [outer] join 表2 on 条件

select * from emp right join dept on emp.dep_id = dept.did

注意点;这里的left和right其实是相对的,从哪个表查,哪个表就认为是左,另外一个是右

select * from emp 因为是from emp所以emp表是左,后面接的是left就意味着查左边,也就是emp表的所有数据和交集的所有数据,后面接right就意味着是查对方的所有数据和交集部分的数据,emp表的left就相当于dept表的right,反之同理

子查询

子查询概念:

查询中嵌套查询,称嵌套查询为子查询

子查询根据查询结果不同,作用不同:

  • 单行单列
  • 多行单列
  • 多行多列

select * from emp where salary > (select salary from emp where name = '员工1')

select * from emp where dep_id in (select did from dept where dname = "1" or dname = "2")

select * from (select * from emp where join date > "2011-11-11") t1 ,dept where t1.dep_id = dept.did

(t1相当于是别名)

在一个查询语句里嵌套另外一个语句的查询结果,就是一种子查询

子查询根据查询结果的不同,作用也是不同的:

  1. 单行单列的查询结果可以作为条件值,使用 = != > < 进行判断

​ select 字段列表 from 表名 where 字段名 = (子查询)

  1. 多行单列:作为条件值,使用in等关键字进行条件判断

select 字段列表 from 表名 where 字段名 in (字段名)

  1. 多行多列:作为虚拟表

    select 字段列表 from (子查询) where 条件

事务

简介:

数据库的事务是一种机制,一个操作序列,包含了一组数据库操作的命令

事务把所有的命令作为一个整体一起向系统提交或者撤销操作请求,这一组数据库命令要么同时成功,要么同时失败

事务是一个不可分割的工作逻辑单元

开启事务,回滚事务,提交事务

事务开启后,在没有提交事务前所有的修改不会影响到数据库的数据,可以预防命令中有异常报错,导致只执行异常前的命令,后续命令不执行,导致数据异常

用begin开启事务 或者也可以用 start transaction

rollback回滚事务

事务的所有命令成功执行后,可以检查数据修改是否正确,如果发现有问题,可以用rollback回到事务运行前的状态

commit 提交事务,提交后就不能恢复了

事务四大特征:

原子性:事务是不可分割的最小单位,要么同时成功,要么同时失败

一致性:事务完成时必须使所有数据都保持一致的状态

隔离性:多个事务之间,操作的可见性

持久性:事务一旦提交或者回滚,他对数据库中的数据的改变就是永久的

mysql的事务是默认自动提交的,也就是在没有手动begin一个事务时,不需要进行commit操作

oracle事务默认手动提交,不管有没有手动开事务,都要commit,写的命令才能生效

标签:列名,sql,笔记,查询,emp,表名,where,select
From: https://www.cnblogs.com/DevoteeQN/p/18378100

相关文章

  • 【读书笔记-《30天自制操作系统》-8】Day9
    本篇的主题围绕着内存管理进行展开。首先编写了内存容量获取的程序,接下来详细讲解了内存管理的具体内容,以及两种实现内存管理的方式。1.内存容量获取前面已经实现了访问内存的扩展,能够使用的内存大大增加了。但是不同的应用程序在运行时,对内存的使用会有不同的要求,这就需......
  • Datawhale X 李宏毅苹果书 AI夏令营task1笔记
    一、什么是机器学习机器学习:通过从经验中学习,使计算机能够从数据中提取出规律、模式和知识,并利用这些知识来做出预测、做出决策或执行任务,而无需明确地编程规则。二、机器学习常见概念1.监督学习和无监督学习1.1监督学习定义:提供输入数据和其对应的标签数据,然后搭建一个模型,模......
  • 《Programming from the Ground Up》阅读笔记:p103-p116
    《ProgrammingfromtheGroundUp》学习第7天,p103-p116总结,总计14页。一、技术总结1.读写文件(1)linux.slinux.s:#filename:linux.s#systemcallnumbers(按数字大小排列,方便查看).equSYS_READ,0.equSYS_WRITE,1.equSYS_OPEN,2.equSYS_CLOSE,3.equSYS_EXI......
  • 使用Java导出MySQL数据:支持自定义分隔符的TXT文件生成
    在软件开发中,我们经常需要将数据库中的数据导出为文件,给关联系统做传输或者进行数据备份、迁移或分析。常见的导出格式包括CSV和TXT文件,分隔符可以是逗号、制表符或其他符号。本文将深入探讨如何使用Java从MySQL数据库中导出数据,并支持用户自定义分隔符来生成格式化的TXT文件。......
  • 推荐 DataGrip 的优秀 SQL 代码格式化设置
    在使用DataGrip进行数据库开发时,良好的SQL代码格式化不仅能够提升代码的可读性,还能提高团队协作的效率。本文将介绍一套经过实践检验的DataGripSQL代码样式方案,旨在帮助开发者快速建立清晰、一致且高效的SQL编码规范。通过这些设置,您可以轻松地优化您的SQL代码,使其......
  • mysql夺命100问
    一、事务1、事务的四大特性ACID是什么?原子性一个事务中的操作要么全部成功,要么全部失败。通过undolog来实现隔离性一个事务的修改在最终提交前,对其他事务是不可见的。通过读写锁+MVCC来实现持久性一旦事务提交,所做的修改就会永久保存到数据库中。通过redolog来实现......
  • MySQL从入门到精通(第5-8章)
    文章目录5排序与分页5.1排序数据5.1.1排序规则5.1.2单列排序5.1.3多列排序5.2分页5.2.1实现规则5.2.2拓展6多表查询6.1笛卡尔积6.1.1笛卡尔积(或交叉连接)的理解6.1.2笛卡尔积可能存在的问题与解决6.2多表查询分类讲解6.2.1等值连接与非等值连接6.2.1.1......
  • sql server导入mysql,使用工具SQLyog
    概述需要将sqlserver的数据导入到mysql中,由于2种数据库存在各种差异,比如表字段类型就有很多不同,因此需要工具来实现。这里使用SQLyog来实现。 SQLyog安装安装过程参考文档:https://blog.csdn.net/Sunshine_liang1/article/details/84400820注意:版本不能太低,必须要有导入外......
  • 卡片盒笔记法
    回顾个人的资料整理史,一直充满坎坷。我尝试了各种各样的资料管理模式。比如早期的网文快捕,可以把网页整体抓下来,可以分类,加标签,可以导出电子书,功能貌似很全面了。但是,当资料累积到一定规模之后,就发现难以为继了。管理、查询都很困难,下载的东西在软件里积灰,很久都不会去看,最后放弃......
  • kubernetes学习笔记
    基础环境系统镜像版本Centos7.6最小化最低运行环境基本要求内存及CPU:512MB/CPU1核K3s版本v1.30.0+k3s1集群规划:注意:需要对每台主机设置hostname,使用hostnamectlset-hostname主机名K8s-master192.168.200.1291C/1GK8s-worker1192.168.200.1302C/......