首页 > 数据库 >【C# & postgreSQL】SQL基础

【C# & postgreSQL】SQL基础

时间:2024-05-23 11:18:33浏览次数:19  
标签:postgreSQL C# Sno Student SQL SC Cno WHERE SELECT

结 构 化 查 询 语 言SQL

目录

SQL概述

特点和发展要点

  • SQL是各种数据库通用语言
  • 1999扩展对象关系型的概念——SQL99(SQL33)
  • 多媒体数据库标准——SQL/MM标准

SQL3 级模式结构

image-20230306142717135

概念理解:

基表

视图

储存文件

SQL分类与特点

1) 数据定义——定义模式、表(TABLE) 视图(VIEW) 索引(INDEX)

image-20230306143010770

2)数据操纵语言——最常用的四个

image-20230306143131474

3)数据控制语言——数据库用户授权,读写等、操作范围

image-20230306143112820

特点

  • 综合统一

    • 集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL功能为一体
    • 可以完成数据库生命周期全部获得
      • 定义关系模式、插入数据、建立数据库
      • 数据查询、更新
      • 重构和维护
      • 控制数据库安全性、完整性等
    • 数据库建成后可以根据需求调整模式而不影响数据运行
    • 操作符统一
  • 高度非过程化

    • 只需要提出要求、不需要了解存取路径——数据存取、SQL命令系统自动完成
  • 面向集合和表的操作

    • 非关系型数据模型采用面向记录的操作方式,操作对象是一条记录
    • SQL采用集合操作方式
      • 操作对象、查找结果可以是元组的集合
      • 一次插入、删除、更新操作的对象可以树元组的集合
  • 以一种语法结构提高多种使用方式

    • 独立语言
    • 又是嵌入式语言,可以嵌入高级语言中
  • 语言简洁,简单易学

    image-20230307081632797

基本规则和数据类型

  • 命名

    长度限制

    • MySQL:64字符
    • Oracle: 30字符

    字母开头,其余可以为字母、数字、下划线组成

    • MySQL:任意数字、字符、符合,不能全部由数字组成
    • Oracle:任何字符
  • 大小写不敏感

    • 关键字大写
    • 变量大写第一个
  • 可写成多行,习惯上一个子句占一行

  • 关键字不能在行与行之间分开(保证单词完整)

  • ;分号为结束符,才能执行

  • 注释/**/

    image-20230307082350392

  • 不同数据类型,字符串、日期——半角英文单引号

    image-20230307082504650

常见操作用法

定义CREATE

image-20230307082943290

模式(schema):命名的对象集合,包括表、视图、索引、约束等,为了区别不同的表集合

/*1.建立数据库/模式*/
CREATE DATABASE SC  
#或 CREATE SCHEMA SC

/*2.打开数据库*/
USE SC

/*3.删除*/
DROP DATABASE SC
# 以上一般通过操作窗口直接实现

基表TABLE

/*1.定义基表*/
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE PRIMARY KEY, # 定义主键就意味着唯一性,所以不用重复unique了
 Sname CHAR(20) UNIQUE,
 Sage SMALLINT,
 
 PRIMARY KEY(Sno,cno),/*定义多个主键*/
 FOREIGN KEY(Cno) REFERENCES Course(Cno) /*表级完整性约束条件,Cno为外码,参照表是Course表中的Cno */
 
);

/*2.删除表 —— 一般删除数据就完全没了,所以要慎重,或规定删除的部分*/
DROP TABLE Student [RESTRICT|CASCADE]; # 后者删除所有,前者不级联删除

/*3.修改基本表——添加删除列、约束等*/
ALTER TABLE Student
ADD Stime DATE, # 添加列
ALTER COLUMN Sno CHAR(8), #修改列长度,“此方法”只能加长不能变短,不能修改列名,不能修改数据类型
DROP UNIQUE(Sname),  # 删除约束条件
DROP COLUMN Sage;  # 删除某列

索引

/*1. 建立索引*/
CREATE CLUSTERED INDEX CCno ON Course(Cno); # 聚簇索引(字典),无索引文件,有索引文件:B-Tree& Hash
CREATE UNIQUE INDEX CCno ON Course(Cno ASC,Sno DESC);#直接建立索引,ASC、DESC为非聚簇

/*2. 删除索引*/
DROP INDEX CCno;  # 索引名

插入INSERT INTO

插入元组

INSERT INTO Student
(Sno,Sname,Sage)
VALUES
	('2020','ly',21),
	('2021','la',21),
	('2022','ld',23);   # 可插入多个,以分号结尾

插入子查询结果

# 建表
CREATE TABLE Sudent
(Sdept CHAR(15), /*系名*/
	Avg_age SMALLINT); /*学生平均年龄*/
/*1. 插入数据*/
INSERT INTO Student
(Sdept,Avg_age)  # 要插入的列
SELECT Sdept,AVG(Sage)  # 选择查询的数据结果
FROM SG
GROUP BY Sdept;  # 归组,并得到平均值

更新UPDATE

UPDATE "S-T".sc
SET grade=90; /*没有WHERE进行限制,修改整列的值*/
/*SET sage = sage+1;*/
UPDATE "S-T".sc
SET grade=93 WHERE cno='1' AND sno='01';

删除DELETE

查询SELECT

image-20230307103036169

单表查询
选择表中若干列

(若干行、经过计算的值

SELECT Sno,Sname FROM Student;  /*若干列*/

SELECT * FROM Student;  /*全部列*/

SELECT DISTINCT Sno FROM SC; /*选择不重复的行*/

SELECT Sname,Sage FROM Student
WHERE Sage BETWEEN 20 AND 24;  /*在某范围中,也可使用> < = 等比较运算*/

SELECT Sname,Sage FROM Student
WHERE Sdept IN ('CS','GIS');  /*判断在不在集合里,可以用 IN or NOT IN*/

SELECT Sname,Sage FROM Student
WHERE Sname LIKE "张%";  /*字符匹配,除了%,还可以用下划线表示一个字符*/
WHERE Sgrade IS NULL; /*选择空值,IS NOT NULL*/


/*经过计算的值*/
SELECT Sname,2016-Sage BrithYear,LOWER(Sdept) DEPT
FROM Student;
ORDER BY
SELECT * FROM Student
ORDER BY Sdept,Sage;
聚集函数
COUNT(*); #统计元组个数
COUNT(sc.Sname)
SUM(sc.Score)
AVG()
MAX()
MIN()

SELECT AVG(SC.Grade) FROM SC
WHERE Sno = '20201'  /*查询某个学生的所有成绩*/
GROUP BY
SELECT Sno FROM SC
GROUP BY Sno
HAVING COUNT(*)>3  /*查询选修3门课以上的学生学号*/
连接查询
等值与非等值连接
SELECT Student.*,SC.* FROM Student,SC 
WHERE Student.Sno =SC.Sno;
/*查询每个学生及其选修课情况,相当于连接*/

image-20230307103329013

自身连接
/*自身分为多个表进行连接*/
SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno

image-20230310140941793

外连接

左连接:保证左表的信息都有,右表中有对应则写,没有对应的就空着

SELECT Student.Sno,Sname,Sgen,Sage,Sdep,Cno,Grade
FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno);

右连接:列出右边的所有数据,左边有就连接,没有就空着

复合条件连接
/*选择课程2中成绩高于90的同学*/
/*1. 目标是选择学生姓名和学号;2.表连接(sno=sno),课程=2,score>90三个条件取交集,使用AND连接*/
SELECT Student.Sname,Sno FROM Student,SC
WHERE Student.Sno=SC=Sno AND SC.Cno='2' AND SC.Grade>90;
/*表示类别看似是数字但不是数字的字符串用单引号*/
/*查询所有学生、姓名、课程名、成绩*/
/*多个表之间的连接*/
SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
嵌套查询
带IN谓词的子查询
/*查询和刘晨同一院系的学生*/
/*way1*/
SELECT Sno,Sname,Sdept FROM Student
WHERE Sdept in (SELECT Sdept FROM Student WHERE Sname ='刘晨')

/*way2*/
SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2
WHERE S1.Sdept = S2.Sdept
				AND S1.Sname='刘晨' 
/*先进行笛卡尔积,再选择出与刘晨连接的人,即为同系*/
带比较运算符的子查询

相当于两层for循环

更优的方法是先生成平均值

image-20230310151819146

带ANY(SOME)或ALL的谓词的子查询

eg1:先选出计算机系的所有年龄集合,比所有年龄还小的年龄

eg2:先直接给出最大年龄,不大于最大年龄的年龄

image-20230310152127380

image-20230310152208506

带EXISTS谓词的子查询

所有带IN、比较、ANY、ALL的子查询都能用EXISTS语句进行等价替换

如果找到存在,则NOT EXISTS 返回false,名字不会被选出

如果不存在,返回true,名字会被选出来,则得到结果

image-20230310153539849

image-20230310154148652

集合查询
UNION
/*查询选修了课程1或2的学生*/
SELECT Sno FROM SC WHERE Cno='1'
UNION
SELECT Sno FROM SC WHERE Cno='2';

SELECT Sno FROM SC
WHERE Cno='1' OR Cno='2';
INTERSECT
/*同时选择课程1和2的学生*/
SELECT Sno FROM SC WHERE Cno='1'
INTERSECT
SELECT Sno FROM SC WHERE Cno='2';

SELECT Sno FROM SC
WHERE Cno='1' AND Cno='2';
EXCEPT
/*查询计算机系学生和年龄不大于19岁学生的差集*/
SELECT * FROM Student WHERE Sdept='CS'
EXCEPT
SELECT * FROM Student WHERE Sage<=19;

标签:postgreSQL,C#,Sno,Student,SQL,SC,Cno,WHERE,SELECT
From: https://www.cnblogs.com/Dynamt-lch/p/18208007

相关文章

  • FullCalendar插件js原生用法
    1.先看下要实现的效果图,左侧栏为当日时间,顶部为部门所有人员,表格内容是人员事件,要求数据多的时候,左侧栏和顶部固定,支持横竖滚动条,如图:  2.这里用的js原生写法:<html><head><title>工作记录详情</title><metaname="decorator"content="default"/><s......
  • Mysql datetime类型精度问题
    问题描述:汇报表中有2个日期字段,字段名分别为startTime和endTime,都为datetime类型,类型长度默认为0,endTime在保存的格式为:2024-05-2323:59:59.999在测试环境中保存没有出现精度问题,查询后正常显示为2024-05-23 23:59:59,正式环境下日期出现了近位,变为2024-05-2400:00:......
  • Kubernetes-ConfigMap详解
    简介:一、ComfigMap的创建1.使用目录创建2.使用文件创建3.使用命令行创建二、Pod中使用ConfigMap1.使用ConfigMap代替环境变量2.使用ConfigMap设置命令行参数3.使用ConfigMap用做数据卷插件三、ConfigMap的热更新简介:ConfigMap功能在Kubernetes1.2版本中引入,许......
  • docker及docker-compose离线安装
    docker及docker-compose离线安装参考https://blog.csdn.net/linmengmeng_1314/article/details/135653694dockeryumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\docker-logrotate\docker-engi......
  • PureBasic是一种基于BASIC语言的编程语言,它提供了一个简单易用的开发环境,旨在帮助开发
    PureBasic是一种基于BASIC语言的编程语言,它提供了一个简单易用的开发环境,旨在帮助开发人员快速创建跨平台的应用程序。PureBasic的特点如下:简单易学:PureBasic的语法类似于传统的BASIC语言,非常容易学习和理解,适合初学者入门。跨平台支持:PureBasic可以在多个操作系统上运行,包括W......
  • Jmeter脚本--BeanShell PreProcessor
    整理一份之前项目中的接口测试文档内容,主要为了方便以后能够更好的进行接口测试需求,本次以Jmeter进行接口测试。API对应的使用手册    接口对应的测试用例如下图所示:编写Jmeter测试用例 用户注册信息 添加BeanShellPreProcessor预处理程序变量脚......
  • VMware Vsphere 配置多写入器以及启用CBT错误解决
    VMwareVsphere配置多写入器以及启用CBT错误解决为满足OracleRac需求,需要在VMware上配置共享磁盘同时给两台rac虚拟机使用,以下为配置过程:1.两台虚拟机同时新增一个SCSI控制器,默认选项即可,如下图所示。在A虚拟机新增一块硬盘硬盘:类型:一定要选择厚置共享类型:多写入器......
  • CSP历年复赛题-P1087 [NOIP2004 普及组] FBI 树
    原题链接:https://www.luogu.com.cn/problem/P1087题意解读:字符串作为根,左边一半作为左子树,右边一半作为右子树,递归构造数,并按FBI规则输出后续遍历结果。解题思路:按照题意,通过dfs来构造树,对于字符串str,提取左边一半递归构造左子树,提取右边一半递归构造右子树,前提是字符串长度>1......
  • VScode生成头文件的 #ifndef #define #endif方法
    在Vscode中,按快捷键Ctrl+Shift+P搜索snippets命令,选择“代码片段:配置用户代码片段”选择“新建全局代码片段文件”新建名称:addheader创建后会自动打开,将内容替换为以下代码:{ "CC++Header":{ "scope":"c,cpp", "prefix":"header", "description":"......
  • Spring Cloud篇
    -----------------------------------------------------------------SOA与微服务:SOA着重中央管理,一个应用包含大块业务逻辑。微服务着重分散管理,一个应用是小块业务逻辑。微服务是SOA的精细化演进。-----------------------------------------------------------------D版对应Bo......