计算机导论(CS50)记录

目录

前言

一.C语言(语言之母)

二.Python

三.Java

四.数据类型

五.数据结构(存储数据的方式)

六.内存与存储(存储数据的地方)

七.算法(搜索数据的方式)

八.SQL

九.JavaScript(HTML,CSS)

十.Flask,Django

前言

C语言是最早出现的语言之一,属于底层语言,是所有语言的基础

C++是在C语言的基础上发展而来的

而后又在C++基础上诞生了各种各样的语言

CC++通常用于操作系统(LinuxWindows)的开发,以及游戏的核心逻辑和底层开发(游戏的后端)。因为它们是底层语言,能够直接访问硬件、控制内存和进行底层优化,提供更高的性能和更精细的控制。因此,在操作系统开发领域,CC++通常是更为常见的选择。

JavaScript(与CSSHTML配合使用):用户界面,前端

JavaPythonRubyPHP:后端

Java:后端,设计前后端API接口、处理业务逻辑、权限以及数据管理

SQL(如MySQLPostgreSQLOracle): 处理数据库专用

Python:人工智能,爬虫

尽管高级语言(如PythonJavaC#等)提供了更为简便、易读的编程方式,以及丰富的库和框架来简化开发过程,但低级语言(如C)仍然有其存在的意义和价值。

以下是C语言等低级语言存在的一些主要原因:

1.性能优化:低级语言更接近硬件,因此能够更直接地控制硬件资源,实现更高的执行效率。对于需要高性能的场景,如操作系统、嵌入式系统、游戏引擎等,使用低级语言编写代码能够确保程序的运行速度和效率。Python虽然实现方式很简单,但是实际需要消耗大量的内存来实现其功能,因此代码的速度和效率会大大的下降。

2.系统级编程:低级语言适合进行系统级编程,如操作系统、驱动程序、编译器等的开发。这些系统组件需要直接与硬件交互,因此需要使用能够精确控制硬件资源的低级语言。

3.内存管理:低级语言提供了更精细的内存管理功能,程序员可以手动分配和释放内存,从而避免内存泄漏和内存碎片等问题。在高级语言中,虽然也有垃圾回收等机制来管理内存,但在某些情况下,手动管理内存可能更为高效和灵活。

4.跨平台性:低级语言通常具有较好的跨平台性,能够在不同的操作系统和硬件平台上运行。这使得使用低级语言编写的代码具有更广泛的适用性。

5.学习底层原理:学习和使用低级语言有助于理解计算机底层的工作原理,如内存管理、进程调度、中断处理等。这对于深入理解计算机系统、提高编程能力以及进行性能优化等方面都具有重要意义。

总之,尽管高级语言提供了更为简便的编程方式,但低级语言仍然在某些方面具有不可替代的优势。因此,在实际开发中,应根据具体需求和场景选择合适的编程语言。

语言相同点:

1.目标相同:都是为了解决特定的问题和实现特定的功能,是人与计算机沟通的工具

2.算法和逻辑:不论使用哪种编程语言,解决问题的核心算法和逻辑通常是相同的。例如,排序、搜索、图形遍历等算法在各种编程语言中都有相应的实现方式。

语言不同点:

不同的语言会有不同的方式去解决问题。不同的语言,可能有属于自己语言的数据类型和数据结构(存储数据的方式)

1.语法:即语言的组成方式。

2.类型系统:一些编程语言是静态类型的(如JavaC++),这意味着在编写代码时必须明确变量的类型。而另一些语言是动态类型的(如PythonRuby),可以在运行时确定变量的类型

3.应用领域

.C语言(语言之母)

1.C语言的数据类型:

基本数据类型:

①整型:

int:基本的整数类型。根据系统和编译器的不同,其大小可能有所不同,但通常是32位。

short  short int:短整型,通常用于存储比int更小的整数。

long  long int:长整型,用于存储比int更大的整数。

long long  long long int:长长整型,用于存储更大的整数。

②浮点型:

float:单精度浮点数。

double:双精度浮点数。

long double:扩展精度浮点数。

③字符型:

char:字符类型,用于存储字符。它实际上是一个小的整数类型,可以存储ASCII字符。

复合数据类型:

①枚举类型:

enum:枚举类型是一种用户定义的类型,它包含一组命名的整数值。

②指针类型:

指针类型用于存储内存地址。例如,int * 是一个指向整数的指针类型。

③数组类型:

数组类型是一种复合类型,可以包含多个相同类型的元素。

④结构体类型:

struct:结构体是一种复合数据类型,允许用户将不同类型的数据组合成一个单一的类型。

⑤联合体类型:

union:联合体也是一种复合数据类型,但它允许在相同的内存位置存储不同的数据类型。

⑥函数类型:

函数类型表示函数的返回类型和参数类型。

void 类型:

void:通常用于表示无类型或函数不返回任何值。

2.C语言的数据结构:(用C语言实现的存储数据的方式)

C语言中有多种数据结构,每种数据结构都有其特定的用途和特性。以下是一些在C语言中常用的数据结构:

线性结构:

①数组(Array

数组是一种线性数据结构,由一组相同类型的元素按照一定顺序排列而成。可以是一维的、二维的,甚至是多维的。

②链表(Linked List

链表由一系列结点组成,每个结点包含数据和指向下一个结点的指针。链表允许动态地添加

和删除元素。

③栈(Stack

栈是一种特殊的线性数据结构,其特点是只能在栈顶进行插入(push)和删除(pop)操作。栈遵循后进先出(LIFO)的原则。

④队列(Queue

队列是一种先进先出(FIFO)的线性数据结构。元素可以在队尾插入,而在队头删除。

⑤哈希表(Hash Table

哈希表是一种根据关键字直接访问内存位置以提高查找效率的数据结构。它通常用于实现字典、集合等数据类型。

非线性结构:

①树(Tree

树是一种非线性数据结构,由一组结点和一组连接这些结点的边组成。每个结点有一个父结点和零个或多个子结点。常见的树结构包括二叉树、平衡树等。

②图(Graph

图也是由结点和边组成的数据结构,但与树不同的是,图中的每个结点可以有零个或多个相邻结点,因此图可以表示更复杂的关系。

③结构体(Struct

结构体是一种聚合数据类型,可以包含不同类型的数据元素。结构体使得用户可以将相关的数据组合在一起,形成一个单一的数据类型。

.Python

Python的作用:

1.数据爬虫

2.web开发,通过其编写的由FlaskDjango等著名web开发框架

3.AI

4.数据分析

Python的数据类型:

①数值类型:

整数(int):正整数、负整数和零。

浮点数(float):带小数点的数字。

复数(complex):形如 a + bj 的数,其中 a b 是浮点数,j 是虚数单位。、

布尔值(bool):只有两个值,True  False。常用于条件判断或逻辑运算。

②序列类型:

列表(list):有序的元素集合,元素之间用逗号分隔,整个列表由方括号包围。列表中的元素可以是任何数据类型,包括另一个列表(即嵌套列表)。Python的列表等同于C语言的链表

元组(tuple):与列表类似,但元组是不可变的,即元组中的元素不能被修改。元组使用圆括号包围。

字符串(str):由字符组成的序列,字符串用引号(单引号或双引号)包围。

集合类型:

集合(set):无序且不包含重复元素的集合。集合使用大括号或 set() 函数创建。

③映射类型:

字典(dict):无序的键值对集合。字典中的每个元素都是键值对,键是唯一的,而值可以是任何数据类型。字典使用大括号或 dict() 函数创建。

Python的数据结构:(用Python实现的存储数据的方式)

Python提供了多种内置的数据结构,这些数据结构使得数据的管理和操作变得更为高效和方便。以下是Python中常见的一些数据结构:

①列表(List):

有序的元素集合,元素之间用逗号分隔,整个列表由方括号包围。可以包含任意类型的元素,包括其他列表(即嵌套列表)。列表是可变的,即可以添加、删除或修改其中的元素。

②元组(Tuple):

与列表类似,也是有序的元素集合,但元组是不可变的。元组使用圆括号包围,也可以省略括号。由于其不可变性,元组通常用于表示一组不应改变的值,如坐标、日期等。

③字典(Dictionary):

无序的键值对集合。每个元素都是一个键值对,键是唯一的,通过键可以快速访问对应的值。字典用大括号或 dict() 函数创建。字典在数据存储和检索时非常高效,常用于存储结构化数据。

④集合(Set):

无序且不包含重复元素的集合。集合使用大括号或 set() 函数创建。集合主要用于成员关系测试和消除重复元素。

⑤字符串(String):

由字符组成的序列。字符串是不可变的,但可以通过切片、连接、查找等操作进行处理。字符串在Python中用于表示文本数据。

除了这些基本的数据结构外,Python还提供了许多其他高级数据结构,这些通常是通过标准库或第三方库提供的。例如:

①队列(Queue):

一种特殊的线性表,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。队列中没有元素时,称为空队列。

②栈(Stack):

一种后进先出(LIFO)的数据结构,即最后一个被添加的元素总是第一个被移除的元素。

③堆(Heap):

一种特殊的树形数据结构,每个父节点的值都大于或等于(大顶堆)或小于或等于(小顶堆)其孩子节点的值。堆通常用于实现优先队列。

④二叉树(Binary Tree):

每个节点最多有两个子节点的树结构。根据节点值的比较规则,二叉树可以分为多种类型,如二叉搜索树、平衡二叉树等。

⑤图(Graph):

由顶点和边组成的数据结构,用于表示复杂的关系网络。

这些高级数据结构在解决复杂问题时非常有用,可以大大提高代码的效率和可读性。

.Java

1.Java的数据类型:

Java的数据类型主要分为两大类:原始数据类型和引用数据类型。

原始数据类型包括:

①数值类型:

byte8位有符号整数类型,最大存储数据量是255,存放的数据范围是-128~127之间。

short16位有符号整数类型,取值范围为-3276832767

int32位有符号整数类型,取值范围为-2,147,483,6482,147,483,647

long64位有符号整数类型,最大数据存储容量是264次方减1

float32位单精度浮点数类型,用于科学计算和需要高精度计算的场景。直接赋值时必须在数字后加上fF

double64位双精度浮点数类型,使用最广泛的浮点数类型。

②字符类型:

char:用于表示任何字符。

③布尔类型:

boolean:只有truefalse两个取值,常用于条件判断和布尔运算。

引用数据类型就是把原始类型的定义比如int改为大写的Int就行了,包括:

①强引用(StrongReference

②软引用(SoftReference):

如果一个对象只有软引用,那么只有当内存不足时,JVM才会去回收该对象。

③弱引用(WeakReference):

只有弱引用的对象,当JVM触发gc时,就会回收该对象。

④虚引用(PhantomReference

此外,Java还提供了集合类型,主要有三种:

List

有序、可重复,关注索引,查询速度快,但插入和删除数据速度较慢。

Set  

无序、不能重复。

Map

键值对集合,键不能重复,值可以重复。

Java还引入了泛型(Generic),它允许类、接口和方法在定义时使用一个或多个类型参数,这些类型参数在调用时会被实际类型替换,从而增强了代码的重用性和类型安全性。

在Java中,注释也是编程中不可或缺的一部分,主要有单行注释(以“//”开头)、多行注释(以“/”开头,“/”结尾)以及文档注释(以“/**”开头,“*/”结尾)。

最后,Java的枚举类型(enum)是一个被命名的整型常数的集合,用于声明一组带标识符的常数。

这些数据类型和特性使得Java成为了一个功能强大且灵活的编程语言。如需更多Java数据类型相关的知识,建议查阅Java编程语言的专业书籍或在线教程。

2.Java的数据结构:(用Java实现的存储数据的方式)

Java的数据结构种类繁多,以下是其中的一些常见类型:

线性结构:

①数组:是有序元素的序列,内存中的分配是连续的,并为存储的元素都分配一个下标(索引)。数组下标从0开始访问。

②链表:由一系列节点组成,数据元素的逻辑顺序是通过链表的指针地址实现。链表可分为单向链表、双向链表、循环链表等。

③哈希表(也叫散列表):根据键和值(key和value)直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,从而快速找到集合中的对应元素。

④队列:一种特殊的线性表,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。队列中没有元素时,称为空队列。

⑤栈:一种后进先出(LIFO)的数据结构,它只允许在一端进行插入和删除操作。

非线性结构:

①树:是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。常见的树结构有二叉树、红黑树、AVL树等。

②图:由顶点(Vertex)和边(Edge)组成的复杂数据结构,通常用于表示网络、地图等复杂关系的数据。

Java的集合类型也是非常重要的一类数据结构,主要包括:

①List:有序的集合,可以包含重复的元素。常见的实现有ArrayList和LinkedList。

②Set:无序的集合,不包含重复的元素。常见的实现有HashSet和TreeSet。

③Map:存储键值对的集合,键是唯一的,但值可以重复。常见的实现有HashMap和TreeMap。

这些数据结构为Java程序提供了高效、灵活的数据组织和处理机制,使得程序能够更有效地存储、检索和操作数据。如需更多关于Java数据结构的信息,建议查阅专业书籍或在线教程。

.数据类型

不同的语言,往往有不同的数据类型

每一种语言都有专门服务与这种语言的数据类型,因为数据类型就是为了服务语言而产生的

.数据结构(存储数据的方式)

C语言中,数据结构是一种有趣且聪明,通过使用计算机内存来更有效的解决问题的方法。因此数据结构可以看作是对于计算机底层内存和数据组织的灵活存储方式。

比如在数据库中,我们第一步肯定是要存储数据。而存储数据的方式有很多很多种

①集合结构(大杂烩):将数据一个个随便扔进去。

但是如果你以这种方式存储数据的话,你拿数据的时候就相当的麻烦了!得一个一个试!

②线性结构:按照一定顺序将数据一个一个排好

在查找的时候,可以通过一定的顺序,顺藤摸瓜找到数据

③树形结构:可以理解为多种线性结构的和,这些线性结构有共同的源头

查找的时候,可以从树的(头)根部开始查找

④图形结构:各种数据之间都相互有关系,就像互联网一样

查找的时候,应该是通过各数据之间的关系来找

数据结构(数据的存储方式)一般分为以下几种:

1.队列:队列的特性是先进先出。例如有一个数组,你想要删除数组的内容的话,必须删除第一个;你想要添加的话,必须把新添加的数据放在数组最后。这就像排队拿东西一样

2.堆栈:堆栈的特性是后进先出,和队列恰好相反。这就像从牛奶箱里面拿牛奶一样,后面放进去的牛奶,会优先被拿出来。又比如收邮箱的时候,往往是从第一个往下看,而第一个就是最后发送给你的邮箱,即优先观看最新数据

3.数组:数组的存储数据方式是连续的空间

当你想要存储一个数组时,那么有一个问题会出现:为数组分配空间的时候,你的内存空间必须是连续的。

现在的问题是,如果你最开始为数组分配了300的空间,但是如果你要存第301个数据进去,并且一定要存在这个数组当中,那此时问题便出来了,因为已经没有连续的空间供你使用了,而你想要存在数组中,又必须是连续的。

此时便有了第四种数据结构:

4.链表:链表是自带内存指针的顺序表。它不仅会存一个数据,还会指向下一个内存空间。

因此它解决了数组的内存不连续问题。我们可以通过链表这种存储方式来存储数组,这样就可以在需要的时候,扩展更大的空间,往数组里面添加数据,实现了内存的动态分配和按需分配

即:链表使用了内存指针,保证了内存的‘连续性’

但是链表占用的总体内存,将会是数据量的两倍

链表中,真正有用的数据称为数据

而存储内存指针的,可以称为元数据

我们并不关心元数据是什么,因为计算机内部会解决指向问题,我们真正需要的是数据

在使用链表时,如果我们想要按照链表的顺序往链表末尾添加数据时,我们首先必须进行搜索,获得最后一个数据所指向的地址。因此这里的搜索算法是On),这会非常的浪费计算机的时间和内存。

那么有没有一种方法,可以在赋予我们动态分配内存的同时,减小数据的搜索时间呢?

于是在此基础上,诞生了第五种结构:

5.树结构(可以看作是高纬度的数组或者链表结构)

最简单的树结构是二叉树:

它的存储数据的方式是:第一个节点包含一个数据4的同时,自带两个指针,指向两个不同的内存;两个地方再存放两个数据26,于此同时26分别各带两个指针,又指向两个新的内存并存放数值...  这其实便是一个二维的链表结构,即有两条路的链表

而且该二叉树有个特点

对于任何的叶子节点,其左子树的数据一定小于叶节点数据;右子树的数据一定大于叶节点数据!(从某种意义上来讲,这是一种递归结构,因为每个节点做的事情都一样;或者说这颗大大树是由两个子大树和一个节点构成,大子树又由两颗子树和一个节点构成...

很明显,相比于链表结构,二叉树的搜索速度可以变为Ologn),假设有7个数据的话,我们需要三层的二叉树,最多只需要3步,便可以搜索到任何我们需要的数据

{

Tips

注意区分二分搜索和二叉树的概念!!

虽然都是分而治之的思想,但是:

①二分搜索是针对数组的一种搜索算法,是针对数据为线性存储结构时的一种搜索方法,这种算法的前提是,数据必须是有序排列成一行的,从小到大或者从大小

②二叉树是一种数据存储结构,通过树的结构来隐含地保持数据的某种有序性的同时,可以动态的分配内存

它们两个完全是属于两个不同范畴的东西!!!

}

6.哈希表

我们让搜索速度到达的最终目标,便是搜索的速度不受数据的大小而限制。

无论数据量n1001000100W还是100E,搜索速度都是一个常数,与n无关

此时的搜索便是最佳

而哈希表和Trie存储方式,可以让我们的数据搜索达到这种效果

哈希是一种技术,实际上是一种数学或代码函数,它可以将任意数量的输入映射到有限数量的输出。

哈希表

其实就是数组和链表的结合体

纵向使用数组存储数据,当数据冲突的时候,再通过横向的链表存储数据。也就是说数组的一个单元存储的不再是一个数据,而是一个根据需要的链表

比如:要存储所有的英文单词,纵向的数组可以存储单词的第一个字母,数组大小为26

而横向就是以这个字母开头的所有单词,相同首字母的单词通过链表一个个连接起来。

7.trie

前面的哈希表是:数组中存放链表

现在的tire是:数组作为树的叶节点存在

很明显,trie数据结构为我们节省了大量的运算时间,复杂度为OK

但是它也浪费的大量的内存

鱼和熊掌不可兼得!

到底是先有数据结构,还是先有算法:

在编程和计算机科学中,数据结构和算法是相互依存、相辅相成的概念。很难明确地说哪一个先出现,因为它们的发展是相互交织的。

数据结构是为了组织和存储数据的方式,以便能够高效地对其进行各种操作。这些操作通常是通过算法来定义的。算法则是为了解决特定问题或执行特定任务而采取的一系列步骤。

从历史角度看,早期的计算机编程中就已经涉及到了基本的数据结构和算法。例如,数组、链表等数据结构,以及排序、搜索等算法,在早期的编程实践中就已经得到了应用。

因此,可以说数据结构和算法的发展是并行进行的。在某些情况下,可能会先有一个数据结构的需求,然后开发出相应的算法来操作这个数据结构。而在其他情况下,可能会先有一个算法的需求,然后设计出适合该算法的数据结构。

总的来说,数据结构和算法是相互依赖、相互促进的。在实际编程中,我们通常会根据问题的需求选择或设计合适的数据结构和算法,以达到最优的解决方案。所以,没有绝对的先后关系,而是根据具体的应用场景和需求来决定的。

.内存与存储(存储数据的地方)

内存即保存状态的地方。在计算机的底层是通过寄存器来保存状态的,当然再深入的话,寄存器便是由晶体管构成的。目前的存储器,都是由许许多多上万亿个晶体管构成的,因此可以存储大量的01的状态!!这便是计算机内存的存储数据的地方(晶体管)

一个晶体管只能存储一位数据,即0或者1

1.图片是用许许多多像素点,通过二进制表示的,比如0代表黑,1代表白,然后再组合

2.计算机中的颜色表示(计算机中图形和颜色用十六进制0-F表示比较方便)

RGB三个通道,每一个通道为0~255个取值。用十六进制表示为00~FF,二进制为0000~1111

白色:FF FF FF

黑色:00 00 00

红色:FF 00 00

绿色:00 FF 00

蓝色:00 00 FF

每一个颜色通道用00~FF(刚好一个字节)表示,更方便和直观

然后通过颜色的表示方法,引出了计算机中内存的表示方法,那么计算机中还有哪些是像这种用十六进制表示的呢?

3.计算机内存的表示方法

8位内存(只能存256个变量)

0x00

0x01

0x02

 `````

0xFF

一共256个位置,0x表示该数字是十六进制数字

内存大小转换公式:

8bit = 1byte 1字节可以存储256个变量,即八位二进制最大数)

1024byte = 1kb 1lb可以存储1024*8 位二进制最大数的变量个数,是多少你自己去算算)

1024kb = 1Mb

1024Mb = 1G

1024G = 1T

.算法(搜索数据的方式)

算法是为了解决特定问题或执行特定任务而采取的一系列步骤或方法,这些步骤或方法可以用不同的编程语言来实现。不同的编程语言本身并不直接决定算法的种类或实现方式。

因此,无论是用PythonJavaC++还是其他任何编程语言,基本的算法思想都是相同的。例如,排序算法(如冒泡排序、快速排序等)、搜索算法(如线性搜索、二分搜索等)以及图论中的算法(如深度优先搜索、广度优先搜索等)都是跨语言的,它们的实现方式会根据所使用的编程语言有所不同,但核心逻辑和步骤是相似的。

衡量算法的好坏标准是:大O()复杂度

每一种数据结构都有不同的算法,比如排序,搜索等等。

对一种数据结构,不同的算法可能有不同的复杂度

常用算法有以下几种:

①基础算法:

排序算法:如冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序等,用于将一组数据元素按照某种顺序(如升序或降序)重新排列。

搜索算法:如线性搜索、二分搜索、哈希搜索等,用于在一组数据中查找目标元素的位置或判断目标元素是否存在。

②图算法:

图的遍历算法:如深度优先搜索(DFS)和广度优先搜索(BFS),用于遍历或搜索图中的节点和边。

最短路径算法:如Dijkstra算法和Floyd-Warshall算法,用于计算图中两个顶点之间的最短路径。

最小生成树算法:如Prim算法和Kruskal算法,用于在无向连通图中找到一棵包含所有顶点且总权值最小的树。

③优化算法:

动态规划算法:用于解决具有重叠子问题和最优子结构性质的问题,通过将问题划分为子问题并保存子问题的解来优化计算。

贪心算法:通过每一步都选择当前状态下的最优解来解决问题,但不能保证获得全局最优解。

④机器学习算法:

监督学习算法:如线性回归、逻辑回归、支持向量机(SVM)、决策树、随机森林等,用于根据带标签的训练数据学习一个模型。

无监督学习算法:如聚类算法(K-means等)、降维算法(主成分分析PCA等),用于从无标签的数据中发现结构或模式。

深度学习算法:如神经网络(包括卷积神经网络CNN、循环神经网络RNN等),通过模拟人脑神经网络的工作方式来处理数据。

⑤其他特定领域的算法:

字符串算法:如KMP字符串匹配算法、Rabin-Karp字符串搜索算法等,用于处理字符串数据。

计算几何算法:如凸包算法、最近点对算法等,用于解决几何形状和空间关系的问题。

密码学算法:如RSA算法、AES算法等,用于加密和解密数据,保障信息安全。

这只是算法世界中的一小部分示例。实际上,算法的种类和应用领域非常广泛,涵盖了计算机科学、数学、物理学、工程学、生物学等多个学科。不同的算法适用于不同的问题和数据类型,选择合适的算法对于解决问题至关重要。随着技术的不断发展和创新,新的算法也在不断涌现,以解决更复杂、更精细的问题。

同一个问题,往往有不同的算法来解决。好的解决方法可以大幅度减小计算机所需的时间,大大提高搜索或者说代码效率。

.SQL

SQL语言没有专用的编译环境,它只为电脑的数据库而生,因此它是负责处理电脑的所有数据的。

此语言可以在终端CMD中直接运行,它就像在CMD中运行Anaconda一样,你可以直接进入它的编译环境,并进行数据的相关操作。比如运行MySQL,或者简单点的SQLite

SQL语言是专用于数据查询和数据处理的语言,基本上不存在什么循环条件之类的语句,只有几个简单的关键字。而仅用这几个关键字,就可以实现C语言的几百行代码,Python的几十行代码,因为它的诞生就是为了数据!

SQL只做四件事情:CRUD,即

创建数据(Create 或者 插入数据(Insert

读取数据(Read  或者 选择数据(Select

更新数据(Update

删除数据(Delete 或者 删除所有(Drop

具体的SQL语言操作,还是得学学。

自己创建一个文件,然后学学操作

可以看以下例子:

真实的大厂数据库,一般都是一行一行的数据,每一列拥有共同的标题

假设有个文档(名为favorites.csv)是这样的:

以下是通过SQL对数据进行处理:

一:创建(Create)数据库并导入数据

第一行:创建名为favorites.db 的数据库

第三行:进入了SQL环境,并执行csv模式(不同文件有不同模式)

第四行:将favorites.csv文件导入数据库,命名为 favorites

第五行:退出数据库

第六行:检查电脑的数据库和文件,第七行返回结果

二.选择(Select)数据并显示:(由于有些显示结果太长,这里只展示了一小部分短的结果)

SELECT关键词:选择数据

*表示显示文件中的全部信息

选择你的文件中标题为language的那一列,并显示全部信息

LIMIT关键词:将显示数据的个数限制为10

Count关键词:计数。此条为计算文件中的数据行数(不包括标题行)

结果与上面一样

DISTINCT关键词:找不同,在language这一列,看有多少种类

通过COUNT关键词计数,结果为3

WHERE关键词:意思为,其中

从所有数据中,选择language列,计算此列中,数据为C的个数

(查看有多少人喜欢C语言)

Language标题下数据为C,并且,problem标题下为‘HelloWorld’的人数

(注意:在SQL中,单个等号表示等于,而不是赋值)

选择language标题列,通过GROUP BY关键词分组后,再通过COUNT关键词计算每一小组的数据个数

ORDER关键词:排序

DESC关键词:降序

ASC关键词:升序

COUNT得到的结果降序或者升序排列

.插入(Insert)数据

INSERT INTO关键词:插入数据

VSLUES关键词:具体插入的数据是什么

.删除数据

DELETE FROM关键词:从中删除数据

词条语句为,删除Timestamp列中,名为NULL(没有数据)的行,即时间戳列为空的行

.更新数据

以上操作,将会:

让所有的language列数据,全部更新为SQL

让所有的problem列数据,全部更新为Fiftyvil

结果将会是:失去工作!!!

当然,在实际的大量的数据库当中,比如一个电影网站,它也是按照上面哪种模式来存储数据,并且用户可以在搜索栏进行关键词的搜索的。

为了使计算机能减小内存的使用,通常在数据库当中,不能出现重复的字符串,因为字符串很占内存,但是可以用ID号代替这些字符串,数字ID可以重复出现,所占内存少

比如;

Movie             Actors

The Godfather        A

The Godfather        B

The Godfather        C

The Godfather        D

这种是很忌讳的

但是可以这样:

Movie ID          Actors

35562              A

35562              B

35562              C

35562              D

数据库的建立也可以有其他的要求,比如:

你可以指令某一列不能为Null空,NOT NULL

你可以制定某一列的数必须为整数 INTERER

你可以让某列不能有重复的信息出现,比如你不希望同一个人(拥有专属身份证ID)在你的网页上注册两次,你可以在建立数据库时,令身份证ID列为UNIQUE

等等...

.数据库连接(临时建立一个数据库存储结果,不会对大数据库产生影响)

连接方式主要有三种:1-11-多、多-

如果一个数据库存储的内容有限,比如电影,有演员表,评分,等等...

可以用两个数据库来存储电影的内容,当然得通过一定的方式将两个数据库连接起来

上述可看到,第一个表中有PRIMARY KET( id)这一列,第二个表中有FOREIGN KEY(show_id)REFERENCE shows(id),其实这便是连接方式

定义主键为shows数据库当中的id列,而ratings数据库当中的show_id列为外键,它们通过主键和外键这个连接器连接起来,当然这两个列的数据肯定是相同的。

此行语句表示:

ratings数据库中选择列为show_id列并且数值大于6.0的数据,并且ratings数据库当中的show_idshows数据库当中的id是一一对应的(两个数据库中有相同的列),结果会显示在ratings中大于6.0id,并且通过shows数据库中的名称来显示,而不是仅仅显示一个id

ratings数据库中的id列对应的是数字id,而shows数据库中的id对应的是名称id,因此必须通过shows数据库可视化显示电影名称)

当然如果两个数据库当中有相同的列,我们为何不直接通过这个相同的列,将两个数据库连接起来,形成一个新的数据库呢?这样在显示的时候就更加直接了。

JION关键词:连接连个数据库

ON关键词:连接方式(连接ratings中的shows.id列和shows中的id列,它们数据相同)

连接后,选择其中(WHERErating列大于10的行数据并显示10个,结果如上

更好的方式是直接用titlerating列代表*,这样就不会显示全部信息(我们不需要的就不显示了)

更多的数据库连接方式也是一样的,通过共同列,将彼此连接起来。

上面展示了6个不同的数据库,有电影的people演员,stars明星,shows电影名,writers导演genres电影类型,ratings评分。这6个数据库都是通过id列(一串我们并不关心的数字,只是给计算机存储用的)连接。

上述都是1-1的情况

当然有一个显而易见的问题,就是在genres电影类型数据库当当中,一部电影可以是多种类型的;同时一个类型也可以拥有很多的电影。因此在genres数据库当中,列通常是可以重复的。但是在shows中可千万不能重复!因为电影名称和ID是一一对应的。

因此有了1-多的情况

genres数据库当中选择10个数据

可以看到,show_id列和genre列均有重复的数据

知道了电影的ID后,我们便可以从任意的数据集当中查看电影的信息

比如上述是查看电影的名称(因为使用的是shows数据库)

当然也可以查看评分,那么语句就应该是:

SELECT * FROM ratings WHERE id = 63881 (我们确定63881便是我们需要的电影的id

查看genres的标题摘要schema,可看到第三行:FOREIGN KEY(show_id) REFERENCE shows(id)

此行代表:外键show_id(也就是此数据库当中的show_id列)其实代表的是shows当中的id

当然很容易联想到,在shows当中会有这样的一列:PRIMARY KEY(id)

如果我们要从genres数据库当中选择10个戏剧Comedy电影,可以用以上语句,但是从结果可以看出,得到的全是没用的(只对计算机有用)数字,因此还需要通过这些数字,从shows中展示其对应的电影名title

做法如下:

还有一种连接方式是通过一个数据库,将两个数据库连接起来,如上所示

people的主键id列和 stars的外键person_id列连接;

shows的主键id列和stars的外键show_id列连接。

如果出现了演员和电影的关系,那么很明显会出现以下情况:

一个演员出演多部电影

一部电影有多个演员

于是有了多-多数据库的情况,很明显上述就是这种情况。此时需要通过一个数据库将两种数据库连接起来

当然最牛逼的是:SQL语言可以和其他语言联合使用,比如在python中导入SQL语言相关的库(sqlite3MySQL等等)

为什么要和其他语言联用呢???

首先我问你个问题,如果一个用户要从数据库当中搜索一部电影,你会指着用户,让用户使用SQL语言自己去查询吗??

当然不会!!!
因此我们要创建一个能和用户交互的界面,让用户输出他最喜欢的电影,然后底层通过SQL语言来查询,再把结果返回给用户就行了!!

以上就是一个通过pythonSQL两种语言结合起来的,能和用户进行互动的,从数据库中查询数据的方式。

首先导入SQL中的数据库

然后询问:人们最喜欢的编程语言是

当输入最喜欢的语言之后,便会从数据库当中选择problem列(当然此列必须是需要的数据)

返回的结果由SQL语言来确定(这里是返回‘总数’)

然后统计这种语言一共有多少人喜欢,并逐个叠加

最后输出结果

以上便是一个例子:选择了查找数据最快的语言SQL;能和用户互动的语言Python。将两种语言结合起来,便可以实现①与用户互动的同时,②用SQL语言查询用户所需要的数据

小结一下:

python实现创建用户界面或者制作最终的Web

②SQL实现从数据库当中非常快速的查找数据

以下谈一谈SQL的注入攻击:

当设计到用SQL语言进行数据库检测的时候,比如用户输入账号信息界面(账号和密码一般是通过一个数据库来存储),如果SQL的底层语言设计不当的话,会产生SQL攻击

如上所示例子

这会导致:

用户只需要输入用户名便可直接登录,只需要加上两个单引号

当你给用户名前后加上单引号之后,即:用户名的时候,在SQL的底层语言中,其实已经将代码更改了,而更改之后的代码已经自动撤销了密码的输入功能!曾经有很多网页都有这个问题!

解决SQL注入攻击的方法之一:加入转义符,如上所示

转义符在SQL中确实可以防止SQL注入攻击。SQL注入攻击是指后台数据库操作时,如果拼接外部参数到SQL语句中,就可能导致欺骗服务器执行恶意的SQL语句,从而造成数据泄露、删库、页面篡改等严重后果。而转义符可以将特殊字符转义成字符串,使得攻击者无法构造有效的SQL语句。这样,即使攻击者尝试插入恶意的SQL代码,这些代码也会被视为普通的字符串,从而避免了SQL注入攻击的发生。

然而,虽然转义符是一种有效的防御手段,但它并不能完全解决SQL注入问题。因此,除了使用转义符外,还应该采取其他安全措施,如使用参数化查询、限制数据库用户的权限、更新和修补数据库管理系统等,以进一步减少SQL注入攻击的风险。

总之,转义符在防止SQL注入攻击中起着重要的作用,但需要结合其他安全措施共同使用,以确保数据库的安全。

以上讲了一些关于SQL语言的基本操作,当然,如果我们想要自己制作一个网页的登录界面的画,仅凭单一的SQL语言无法实现。

网页登录界面的输入账号和密码在底层并不直接通过SQL来实现,而是涉及多个层面的技术和语言。以下是一个简化的流程及其涉及的技术:

1.

前端(Front-end):

用户看到的登录界面通常由HTMLCSSJavaScript等前端技术构建。

用户在此界面输入账号和密码,并通过JavaScript(或其他前端技术)进行初步的验证。

2.后端(Back-end):

当用户点击登录按钮后,前端会发送一个请求到后端服务器。

后端服务器可以是使用各种语言和技术构建的,例如JavaPythonRubyPHPNode.js等。

在后端,服务器会接收并处理这个登录请求。这通常涉及验证用户输入的账号和密码。

3.数据库(Database):

为了验证用户输入的账号和密码是否正确,后端通常会查询一个数据库。

SQL是用于管理和查询关系型数据库的标准语言。因此,如果后端使用关系型数据库(如MySQLPostgreSQLOracle等)来存储用户信息,那么确实会使用SQL来查询这些信息。

查询会检查数据库中是否有与用户输入的账号和密码匹配的记录。

4.安全性:

在处理登录请求时,安全性是非常重要的。因此,通常会使用加密技术(如哈希和盐值)来安全地存储和验证密码。

此外,为了防止SQL注入等攻击,后端代码应该正确地处理和转义用户输入。

总结:虽然SQL是用于查询数据库的,但网页登录界面的实现涉及多个层面的技术,包括前端、后端和数据库。后端代码(可能是使用多种编程语言编写的)会接收并处理前端发送的登录请求,并可能使用SQL来查询数据库以验证用户的账号和密码。

.JavaScript(HTML,CSS)

JavaScript,HTML,CSS这三者往往结合使用

HTML超文本标记语言的作用是创建网页,并使其可视化

CSS层叠式样表的作用是为HTML页面设计提供样式和布局,以及美化网页(通常是<style>中的东西)

JavaScript是一种在浏览器中运行的脚本语言,通常用于实现网页上的动态效果和交互功能

HTML是一种标记语言:用于创建网页和网页应用程序。HTML通过一系列的标签(tags)来描述网页的结构和内容,这些标签告诉浏览器如何显示网页上的文本、图像、链接等元素。

CSS是一种描述语言:用于描述HTMLXML(包括如SVGMathML等衍生技术)文档样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。CSS能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。CSS能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。虽然CSS不是编程语言,但它具有其独特的语法和规则,通过选择器将样式规则应用到HTML元素上。这使得开发者能够创建出具有一致性和吸引力的网页外观,并控制页面的布局和元素的表现。

在了解页面和网页设计之前,首先需要了解一下下面的这些基本概念:

Routers

IP

TCP

DNS

DHCP

HTTP/HTTPS

HTML:文本标记语言,为了让界面更加美观,让用户方便看到其所关心的信息

HTML并不会涉及之前比如C语言的函数,循环,条件等等,它所作的唯一的事情就是关于信息的呈现。

老实说,HTML是一种你仅用30分钟就可以学会的语言。

然后你就可以通过在线教程,文档等方式快速上手了。

当然了,你想制作一个非常美观和漂亮的网页,肯定得需要几年的时间来沉淀。

让我们先从功能性的网站开始:

以上是HTML的一个例子

可以看出,HTML语言实际上只有两个部分:

<head><body>

HTML只是一种基于文本的语言,你可以用键盘输入它。但是它不是一种编程语言,你不能调用函数或者编写逻辑。

CSShtml语言中<head>中的<style>中的东西

css可以对HTML生成的页面做出各种字体大小颜色等等的选择

我们能通过css指定页面的字体大小,颜色,边距等许多美学方面的东西

除了上述所示的,传统的在head中的style中定义headermainfooter的属性之外,我们还可以在style中定义类似于函数的东西,然后直接在body中使用这个函数。

如下所示:

然后我们可以直接在body中使用style中所定义的函数

比如:

其中的centered,large,medium,small都是我们之前在style之中所定义的

使用类函数的编程可以减小很多冗余代码,避免相同的工作重复

当然最好的方式,是将csshtml两种语言分开成两个文件,然后其他的html也可以调用这个css

比如:

以上通过css文件定义了一些类似于函数的东西

然后在html文件中引用链式表,即引用css如下所示:

其中的第五行,便是引用css文件

Bootstrap就是这样的一个css文件,所有人都可以在官网上下载并直接使用它

.Flask,Django

FlaskDjango都是由python语言编写的Web框架,主要关注的是后端开发。它帮助开发者构建Web服务器的后端逻辑,处理来自前端的请求,执行相应的业务逻辑,并与数据库进行交互。提供了路由、模板渲染、表单处理等功能,使得后端开发变得更加高效和灵活。

通过Flask框架对后端输入的数据进行处理,然后通过HTML和CSS以及JavaScript进行页面输出。将后端的Flask与前端的HTML,CSS,JavaScript结合,可以让界面更加动态化。根据用户的输入和需求(数据),在后端进行数据处理,路由管理等等,最后通过前端HTML返回不同的用户想要的结果页面。即,实现网页动态化的过程。如果只有前端是话,页面永远是静态的死的。Flask是专门针对于web应用程序设计的后端开发框架。

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值