SQL速通

本文详细介绍了SQL的基础知识,包括CREATE用于创建数据库和表,DROP/DELETE/TRUNCATE进行删除操作,ALTER和UPDATE用于修改表结构和数据,SELECT用于查询,以及JOIN用于联接多表。还涵盖了SQL约束如NOTNULL和PRIMARYKEY,数据类型,以及处理NULL的方法。文章最后列举了一些SQL函数和常见的查询题目,用于巩固学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文记录了我在阅读完SQL 教程 | 菜鸟教程牛客网在线编程_SQL篇_非技术快速入门之后学到的全部知识点。学习完SQL后建议学习ADO或PHP MySQL

 

官方文档(可以用来查找date相关函数等):MySQL :: MySQL 8.0 Reference Manual

目录

增删改合

create:增

drop、delete、truncate:删

Alter、update、SELECT INTO、INSERT INTO:改

Union:合

SQL约束

As:即alias

数据类型

SQL通用数据类型:

NULL

Select、条件

select、select top、limit

where、having

group by、order by

join

SQL主机

典型习题


增删改合

create:增

CREATE DATABASE

CREATE DATABASE database_name

CREATE TABLE

CREATE TABLE table_name
(column_name1 data_type,
column_name2 data_type,
column_name2 data_type,...);

CREATE TABLE 新表 AS SELECT * FROM 旧表

CREATE INDEX

用户无法看到索引,它们只能被用来加速查询

CREATE INDEX index_name
ON table_name (column_name)

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

UNIQUE唯一的索引意味着两个行不能拥有相同的索引值

CREATE VIEW

视图总是自动显示最新的数据;视图可以被嵌套

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

CREATE OR REPLACE VIEW

CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

SQL对大小写不敏感

id列是自动更新的,表中的每条记录都有一个唯一的数字

如果列名称包含空格,要求使用双引号或方括号

只复制表结构,不复制其数据:

create table table_name_new as select * from table_name_old where 1=2;

create table table_name_new like table_name_old

drop、delete、truncate:删

DROP VIEW

DROP VIEW view_name

DELETE

DELETE FROM table_name WHERE some_column=some_value
删除整个table:
DELETE FROM table_nameDELETE * FROM table_name

DROP DATABASE

DROP DATABASE database_name

DROP INDEX

ALTER TABLE table_name DROP INDEX index_name(MySQL)

DROP/TRUNCATE TABLE

DROP/TRUNCATE TABLE table_name

drop、delete、truncate的不同点:

  • delete:删除指定数据;删除整个表:仅删除表的所有内容,保留表的定义(又称表的结构),不释放空间,可以回滚恢复(系统的回滚段rollback segement要足够大);
  • drop:删除表内容和结构,释放空间,将表删除的一干二净,没有备份表之前要慎用;
  • truncate:删除表的内容,释放空间,但保留表的定义,没有备份表前要慎用。若是整理表内部的碎片,可用truncate加reuse stroage,再重新导入/插入数据。
  • 执行速度:drop>truncate>delete

Alter、update、SELECT INTO、INSERT INTO:改

ALTER TABLE
(ALTER DATABASE类似

ALTER TABLE table_name ADD column_name datatype

ALTER TABLE table_name DROP COLUMN column_name

UPDATE

UPDATE table_name SET column1=value, column2=... WHERE condition

如果设置了sql_safe_updates=1,那么:

update语句必须满足如下条件之一才能执行成功:

  • 使用where子句,并且where子句中列必须为prefix索引列
  • 使用limit
  • 同时使用where子句和limit(此时where子句中列可以不是索引列)

delete语句必须满足如下条件之一才能执行成功:

  • 使用where子句,并且where子句中列必须为prefix索引列
  • 同时使用where子句和limit(此时where子句中列可以不是索引列)

SELECT INTO FROM

要求目标表不存在

SELECT * INTO new_table_name [IN externaldatabase]
FROM old_table_name

or

SELECT column_name(s) INTO new_table_name [IN externaldatabase]
FROM old_table_name

INSERT INTO SELECT

要求目标表存在

INSERT INTO table2 SELECT * FROM table1;#需两个表结构一样

INSERT INTO table2 (column_name(s)) SELECT column_name(s) FROM table1;

INSERT INTO

INSERT INTO table_name VALUES (value1, value2, value3,....)

or

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,....)

Union:合

UNION

选取不同的值

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

UNION ALL

(允许重复的值

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

UNION中每个SELECT语句必须拥有相同数量的列;列也必须拥有相似的数据类型;每个SELECT语句中的列的顺序必须相同。

UNION结果集中的列名总是等于UNION中第一个SELECT语句中的列名。

只能在最后使用一个ORDER BY命令,是将两个查询结果合在一起之后,再进行排序

SQL约束

NOT NULL:指示某列不能存储NULL值。

UNIQUE:保证某列的每行必须有唯一的值。(UNIQUE和PRIMARY KEY约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY:约束拥有自动定义的UNIQUE约束。

每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARY KEY约束。

PRIMARY KEY是NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。主键列不能包含NULL值。每个表都应该有一个主键,并且每个表只能有一个主键。

FOREIGN KEY:一个表中的FOREIGN KEY指向另一个表中的UNIQUE KEY(唯一约束的键)。用于预防破坏表之间连接的行为。

CHECK:保证列中的值符合指定的条件。

DEFAULT:规定没有给列赋值时的默认值。

AUTO_INCREMENT:在新记录插入表中时生成一个唯一的数字,即自动地创建主键字段的值。默认AUTO_INCREMENT的开始值是1。

约束可以在创建表时规定(通过CREATE TABLE语句),或者在表创建之后规定(通过ALTER TABLE语句)。以MySQL为例(SQL Server、MS Access、Oracle等的语法与之不同):

添加约束:

ALTER TABLE Persons

ALTER City SET DEFAULT 'SANDNES'

删除约束:

ALTER TABLE Persons

ALTER City DROP DEFAULT

改变表中列的数据类型:

ALTER TABLE table_name

MODIFY COLUMN column_name datatype

As:即alias

SELECT column_name FROM table_name AS table_alias表的别名

SELECT column_name AS column_alias列的别名 FROM table_name

把3个列(url、alexa和country)结合在一起并创建一个名为"site_info"的别名:

SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info FROM table;

数据类型

SQL通用数据类型:

CHARACTER(n)

字符/字符串。固定长度n

VARCHAR(n)或
CHARACTER VARYING(n)

字符/字符串。可变长度最大长度n

BINARY(n)

二进制串。固定长度n

BOOLEAN

存储TRUE或FALSE值

VARBINARY(n) 或
BINARY VARYING(n)

二进制串。可变长度最大长度n

INTEGER(p)

整数值(没有小数点)。精度p

SMALLINT

整数值(没有小数点)。精度5

INTEGER

整数值(没有小数点)。精度10

BIGINT

整数值(没有小数点)。精度19

DECIMAL(p,s)

精确数值,精度p(=小数点前的位数+小数点后的位数s)

NUMERIC(p,s)

精确数值,精度p(=小数点前的位数+小数点后的位数s)

FLOAT(p)

近似数值,尾数精度p。一个采用以10为基数的指数计数法的浮点数。该类型的size参数由一个指定最小精度的单一数字组成

REAL

近似数值,尾数精度7

FLOAT

近似数值,尾数精度16

DOUBLE PRECISION

近似数值,尾数精度16

DATE

存储年、月、日的值

TIME

存储小时、分、秒的值

TIMESTAMP

存储年、月、日、小时、分、秒的值

INTERVAL

由一些整数字段组成,代表一段时间,取决于区间的类型

ARRAY

元素的固定长度的有序集合

MULTISET

元素的可变长度的无序集合

XML

存储XML数据

不同的数据库平台上一些数据类型的通用名称:

数据类型

Access

SQLServer

Oracle

MySQL

PostgreSQL

boolean

Yes/No

Bit

Byte

N/A

Boolean

integer

Number (integer)

Int

Number

Int
Integer

Int
Integer

float

Number (single)

Float
Real

Number

Float

Numeric

currency

Currency

Money

N/A

N/A

Money

string (fixed)

N/A

Char

Char

Char

Char

string (variable)

Text (<256)
Memo (65k+)

Varchar

Varchar
Varchar2

Varchar

Varchar

binary object

OLE Object Memo

Binary (fixed up to 8K)
Varbinary (<8K)
Image (<2GB)

Long
Raw

Blob
Text

Binary
Varbinary

Microsoft Access、MySQL 和 SQL Server的数据类型:

SQL MS Access、MySQL 和 SQL Server 数据类型 | 菜鸟教程

NULL

无法将NULL用比较运算符和0等比较,必须用IS NULL和IS NOT NULL

NULL函数(以MySQL为例):

SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))

FROM Products

SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))

FROM Products

Select、条件

select、select top、limit

SELECT

SELECT column_name(s) FROM table_name

SELECT *

SELECT * FROM table_name

SELECT DISTINCT

SELECT DISTINCT column_name(s) FROM table_name

SELECT TOP

SELECT TOP number|percent column_name(s) FROM table_name

变相返回后N行:select top 5 * from table order by id desc

Limit

LIMIT后面跟两个参数:第一个数表示要跳过的数量,后一位表示要取的数量

LIMIT后面跟一个参数:表示要取的数据的数量,≈top

LIMIT和OFFSET组合使用:LIMIT后只能有一个参数,表示要取的的数量,OFFSET表示要跳过的数量

where、having

WHERE

SELECT column_name(s) FROM table_name
WHERE column_name operator value

HAVING
筛选分组后的各组数据

SELECT column_name, aggregate_function(column_name) FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

增加HAVING子句原因WHERE无法与聚合函数一起用

WHERE子句中的运算符

=、<>、>、<、>=、<=

BETWEEN and、not between

LIKE:+通配符,模糊查询;not like

IN:WHERE column_name IN (value1,value2,..);not in

is null、is not null

0、1

逻辑运算的优先级:()、not、and、or

EXISTS运算符:用于判断查询子句是否有记录,若有一条或多条记录存在返回True,否则返回False。NOT EXISTS

SELECT column_name(s) FROM table_name

WHERE EXISTS (SELECT column_name FROM table_name WHERE condition);

通配符

%:0个及以上个字符

_:1个字符

like '段\_' escape '\':通过\转义,只能查出来“段_”

[charlist]:字符列中的任何单一字符

[^charlist]或[!charlist]:不在字符列中的任何单一字符

REGEXP或NOT REGEXP运算符(或RLIKE和NOT RLIKE):用来操作正则表达式

where和having的区别

  • where在group by前,having在group by之后
  • 聚合函数不能放在where后,但可放在having后

group by、order by

GROUP BY

SELECT column_name,aggregate_function(column_name) FROM table_name
WHERE column_name operator value GROUP BY column_name

ORDER BY
默认升序

SELECT column_name(s) FROM table_name ORDER BY column_name(s) [ASC|DESC]
descasc只对它紧跟着的第一个列名有效可用函数排序order by abs(a);

join

JOIN=INNER JOIN

LEFT JOIN=LEFT OUTER JOIN

RIGHT JOIN=RIGHT OUTER JOIN

FULL OUTER JOIN:结合了LEFT JOIN和RIGHT JOIN的结果

SQL主机

SQL是一种与数据库系统协同工作的标准语言,这些数据库系统包括MS SQL Server、IBM DB2、Oracle、MySQL和MS Access等等。

如果您想要您的网站存储数据在数据库并从数据库显示数据,您的Web服务器必须能使用SQL语言访问数据库系统。

如果您的Web服务器托管在互联网服务提供商(ISP=Internet Service Provider),您必须寻找SQL主机计划。

您可在各操作系统上运行SQL主机数据库。操作系统上对应运行的数据库系统:

MS SQL Server2:在Windows和Linux操作系统上运行

MySQL:在Windows,Mac OS X和Linux/UNIX操作系统上运行

MS Access(只建议用于小型网站):只在Windows OS上运行

函数

SQL Aggregate函数:

SELECT AVG/MAX/MIN/SUM(column_name) FROM table_name;

SELECT FIRST/LAST(column_name) FROM table_name;#用于MS Access

SELECT COUNT(column_name) FROM table_name;#NULL不计入

SELECT COUNT(*) FROM table_name;

SELECT COUNT(DISTINCT column_name) FROM table_name;#用于ORACLE和Microsoft SQL Server,不用于Microsoft Access

SQL Scalar函数:

SELECT UCASE/LCASE(column_name) FROM table_name;

SELECT UPPER/LOWER(column_name) FROM table_name;#用于SQL Server

SELECT MID(column_name,start[,length]) FROM table_name;#起始值是1

select substr(("列名",a,b) from <table_name>;#类似mid,用于Oracle

SELECT LEN(column_name) FROM table_name;

SELECT LENGTH(column_name) FROM table_name;#用于MySQL

SELECT ROUND(column_name[,decimals]) FROM TABLE_NAME;

SELECT NOW() FROM table_name;

SELECT FORMAT(column_name,format) FROM table_name;

典型习题

下面这些题是我看完上面的知识点后没能自己做出来的。牛客网的牛客网在线编程_SQL篇_非技术快速入门部分的其他题都能够独立做出来

嵌套表(即带括号):分组过滤练习题_牛客题霸_牛客网

2个表join:统计每个学校的答过题的用户的平均答题数_牛客题霸_牛客网

3个表join:统计每个学校各难度的用户平均刷题数_牛客题霸_牛客网

Case语句:计算25岁以上和以下的用户数量_牛客题霸_牛客网

group by的易错点、in:找出每个学校GPA最低的同学_牛客题霸_牛客网

If函数、where和having的区别:浙大不同难度题目的正确率_牛客题霸_牛客网

算法难:计算用户的平均次日留存率_牛客题霸_牛客网

### 数据库入门教程:基础概念与快上手 数据库是一种用于存储、管理和检索数据的技术体系。数据库技术,可以高效地组织大量数据并支持复杂的查询操作[^1]。 #### 一、数据库的基本概念 数据库的核心目标是实现数据的有效管理。以下是几个重要的基本概念: - **数据库(Database)** 是按照一定方式组织起来的数据集合,这些数据能够被多个用户共享且具有较小冗余度。它常由一组表组成,而每张表又包含了若干记录和字段。 - **关系型数据库(Relational Database)** 关系型数据库基于关系模型构建,其中数据以表格形式存在。每一行代表一条记录,列则表示属性或字段。常见的关系型数据库包括 MySQL 和 Oracle[^2]。 - **SQL(Structured Query Language)** SQL 是一种专门用来访问和处理关系型数据库的语言。它可以完成诸如查询、插入、更新以及删除等任务,并允许管理员定义新的数据库对象,比如表或者索引。 #### 二、如何快上手 SQL? 对于初学者来说,可以从以下几个方面入手学习 SQL: 1. **安装本地环境** 需要先下载并安装一个适合自己的 RDBMS 软件,例如 MySQLSQLite。如果是初次接触推荐使用 MySQL,因为它简单易学而且社区资源丰富[^3]。 2. **连接到数据库服务器** 使用客户端工具连接至已配置好的数据库实例。如果一切正常,在成功登录之后可以过运行简单的测试语句来确认服务状态良好。例如: ```sql SHOW DATABASES; ``` 3. **熟悉核心语法** 学习一些最基本的 SQL 查询指令是非常必要的,这有助于理解整个工作流程。下面列举了一些常用的命令及其功能描述: - `SELECT` – 提取指定条件下的数据项; ```sql SELECT * FROM employees WHERE department_id = 50; ``` - `INSERT INTO` – 向现有表中新增加一行或多行新纪录; ```sql INSERT INTO departments (department_name, manager_id) VALUES ('Sales', 10); ``` - `UPDATE` – 修改已有条目的某些特定值; ```sql UPDATE employees SET salary = salary + 1000 WHERE job_title='Manager'; ``` - `DELETE FROM` – 删除符合条件的一组记录; ```sql DELETE FROM orders WHERE order_date < '2023-01-01'; ``` 4. **实践练习项目** 尝试设计一个小规模的应用场景模拟真实世界需求,比如建立一家小型企业的员工档案管理系统。这样不仅可以巩固所学到的知识点还能积累实战经验。 #### 三、从 MySQL 到 Oracle 的迁移指南 当具备了一定程度上的 MySQL 技能后,过渡到其他类型的数据库产品如 Oracle 并不困难。两者之间虽然存在一定差异但总体逻辑相似之处颇多。主要区别体现在函数名称、日期时间格式等方面。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值