当前位置: 代码迷 >> 综合 >> SQL必知必会学习笔记(主要针对MySQL)
  详细解决方案

SQL必知必会学习笔记(主要针对MySQL)

热度:75   发布时间:2024-01-29 00:17:19.0

SQL必知必会

第1课 了解SQL

数据库:保存有组织的数据的容器

表:存储某种特定类型的结构清单

模式:关于数据库和表的布局及特性的信息

列:表中的一个字段,所有表都是由一个或多个列组成的

数据类型:每一行所允许的类型

主键:唯一表示某一行的属性

行:一行一般表示所有的记录,行和记录两个概念可以相互转化。

SQL(Structed Query Language):结构化查询语言

第2课 检索数据

检索单列数据: SELECT column_name FROM table_name;

查询所有属性:使用通配符*,例如SELECT * FROM table_name;

查询不重复的列:SELECT DISTINCT column_name FROM table_name; PS:如果DISTINCT后面跟了两列会检索出所有的列,除非两列全部相等。

MySQL中输出限定数量的数据:SELECT * FROM table_name LIMIT number。如果想输出从某行起使用 LIMIT n OFFSET m,代表从m行起输出n行数据。

第3课 排序检索数据

对单列数据排序:SELECT column_name FROM table_name ORDER BY column;( PS: ORDER BY应该位于SELECT的最后一个子句,不然会报错)

对多列数据进行排序:SELECT column_name1,column_name2 FROM table_name ORDER BY column1,column2; 意思是先对column1进行排序,column1相等的两行数据再对column2进行排序。

降序排序:对想进行降序的属性列加上DESC。默认是升序。如果想要对多个列进行降序操作,应该在每一个列前都加上DESC。

ORDER BY 可用数字代表排序列: 比如SELECT column1,column2 FROM table_name ORDER BY 1,2; 代表检索数据按SELECT 后面的第一列、第二列进行排序。

第4课 过滤数据

通过WHERE进行数据过滤: 我们在SQL中可以使用WHERE来进行一些数据的过滤。

空值判断IS NULL:我们可以判断某个属性是否为空 用IS NULL

范围值检查BEWTEEN AND: 通过使用BETWEEN n AND m来检索我们需要的值在n和m之内。

第5课 高级数据过滤

AND OR: AND顾名思义就是使用与逻辑,并且的意思。 OR就是使用或逻辑,或者的意思。

AND的运行优先级要比OR高。

IN操作符:在SQL使用IN的时候,我们需要在IN的后面添加括号,括号中是值。IN的作用和OR的作用其实是一样的,但是有以下几点区别:

1.IN操作符一般要比OR操作符的速度要快

2.IN操作符简洁明了,易于阅读

3.IN最大的优点是可以包含其他语句

NOT操作符:NOT操作符的作用是否定在NOT后面的任意条件。NOT支持否定WHERE的索引条件

第6课 用通配符进行过滤

%通配符:%通配符表示的是所有匹配的字段,例如%PXR%就是匹配任何包含PXR的字段

_通配符:_通配符表示的是匹配单个字符。

通配符的注意事项:由于搜索通配符的时候会导致SQL语句的执行速度变慢,所有能不用通配符就尽量不要用通配符。

第7课:创建计算字段

AS字段:AS字段可以将检索出来的结果命名别名

MySQL中字符串进行串接:使用CONCAT()函数进行字符串的拼接。消除空格可以用RTRIM()函数。

列与列可以进行计算:列与列当中可以进行加减乘除进行运算。

第8课:使用函数处理数据

文本处理函数:

LEFT():返回函数左边的字符

LENGTH():返回字符串的长度

LOWER():将字符串变为小写

LTRIM():去除左边的空格

RIGHT():返回函数右边的字符

RTRIM():去除右边的空格

SOUNDEX():返回字符串的SOUNDEX值(一种识别语音辨识度)

UPPER():将字符串变为大写

数值处理函数:

ABS():返回绝对值

COS():返回余弦值

EXP():返回指数值

PI():返回圆周率

SIN():返回正弦值

SQRT():返回平方根

TAN():返回正切值

第9课:聚集函数

AVG():返回某列的平均值

COUNT():返回某列的行数

COUNT(*)会计算包括NULL值的行数,而COUNT(column)只会计算具有值的数

MAX():返回某列的最大值

MIN():返回某列的最小值

SUM():返回某列值之和

聚集不同的值:在SQL中,默认的是ALL,如果想聚集不同的值话,需要加上DISTINCT。

第10课:分组数据

GROUP BY:GROUP BY 是按照分组进行排列。

HAVING:HAVING是进行组过滤,它的很多作用其实和WHERE是相似的。

ORDER BY:ORDER BY和GROUP BY 要相互区分,ORDER BY 是根据任意列进行排序,而GROUP BY只是根据分组进行排序,而且GROUP BY只能选择出现的SELECT 列中。

 

第11课:使用子查询

子查询:子查询一般是使用IN后面跟着SELECT子句。

子查询可以作为条件过滤使用也可以作为计算字段使用。

第12课:联结表

创建联结

如果我们需要进行一些数据的联结,比如两个数据在A表,另外一个数据在B表。我们需要同时将他们检索出来,那么联结是十分必要的。

内联结

SELECT vend_name,prod_name,prod_price
FROM vendors
INNER JOIN products
ON
vendors.vend_id = products.vend_id;

内联结可以联结多个表

注意联结会导致SQL性能下降得很厉害,所以我们要注意不要联结不必要的表

第13课:创建高级联结

使用表别名:

SELECT cust_name,cust_contact
FROM customers AS c,orders AS O, orderitems AS OI
WHERE c.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';

使用不同类型的联结

内联结:能在一条SELECT语句中不只一次引用相同的表

用子查询的方式:

SELECT cust_id, cust_name, cust_contact
FROM Customers
WHERE cust_name = (SELECT cust_name
FROM Customers
WHERE cust_contact = 'Jim Jones');

用内联结的方式:

SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM Customers AS c1, Customers AS c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';

自然联结:无论何时对表进行联结,应该至少有一列不止出现在一个表中。自然联结排除多次出现,既每一列只返回一次。

SELECT C.*, O.order_num, O.order_date,
OI.prod_id, OI.quantity, OI.item_price
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';

外联结:外联结包含了那些相关表中没有关联行的行,这种联结称为外联结。

左外联结:

SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;

右外联结:

SELECT Customers.cust_id, Orders.order_num
FROM Customers RIGHT OUTER JOIN Orders
ON Orders.cust_id = Customers.cust_id;

全外联结:

SELECT Customers.cust_id, Orders.order_num
FROM Orders FULL OUTER JOIN Customers
ON Orders.cust_id = Customers.cust_id;

第14课:组合查询

UNION:可以将多个SELECT语句的查询结果联结起来。默认的UNION是自动去除重复行的,如果想输出所有语句要使用ALL UNION。

注意:UNION需要所有的列或聚集函数都是相同的,顺序可以不同。

UNION需要包括两个或两个以上的SELECT语句。

第15课:插入数据

基本语法:

INSERT INTO table_name VALUES(column_1,~~~,column_n);

复制数据到新表(MySQL):

CREATE TABLE
table_new AS
SELECT * 
FROM table_old;

第16课:更新和删除数据

更新:

UPDATE table_name 
SET column_1 = ''column_2 = ''
WHERE 过滤条件

删除:

DELETE FROM table_name
WHERE 过滤条件

第17课:创建和操控表

创建表:

CREATE TABLE table_name(列名1,类型··········列名n,类型);

更新表:ALTER TABLE + 要操作的步骤

例如:

增加一列

ALTER TABLE vendors
ADD vend_phone CHAR(20)

删除一列

ALTER TABLE Vendors
DROP COLUMN vend_phone;

删除表:删除表

DROP TABLE table_name

第18课:使用视图

创建视图:

CREATE VIEW view_name
FROM ..
WHERE ..
CREATE VIEW view_name AS
SELECT ..
FROM ..
WHERE ..

第19课:使用存储过程

存储过程的优点:简单、安全、高性能.

执行存储过程:

EXECUTE AddNewProduct( 'JTS01',
'Stuffed Eiffel Tower',
6.49,
'Plush stuffed toy with the text La
?Tour Eiffel in red white and blue' );

MySQL创建存储过程:

CREATE[DEFINER = { user | CURRENT_USER }]PROCEDURE sp_name ([proc_parameter[,...]])[characteristic ...] routine_bodyproc_parameter:[ IN | OUT | INOUT ] param_name typecharacteristic:COMMENT 'string'| LANGUAGE SQL| [NOT] DETERMINISTIC| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY { DEFINER | INVOKER }routine_body:Valid SQL routine statement[begin_label:] BEGIN[statement_list]……
END [end_label]

第20课:管理事务处理

MySQL创建事务:

START TRANSACTION
...

COMMIT用于保存修改

ROLLBACK用于撤销

复杂的事务需要部分ROLLBACK或者部分COMMIT那么我们就得使用保留点

MySQL创建保留点

SAVEPOINT point_name

MySQL回退至保留点

ROLLBACK TO point_name

第21课:使用游标

游标:游标(cursor)是一个存储在DBMS服务器上的数据库查询,他不是一个SELECT语句,而是被该语句检索出来的结果集。

创建游标:

DECLEARE cursor_name CURSOR
FOR 
SELECT * 
FROM ..
WHERE ..

使用游标:

OPEN CURSOR cursor_name

关闭游标:

CLOSE cursor_name

第22课 高级SQL特性

22.1约束

约束:管理如何插入或处理数据库数据的规则。

22.1.1主键

主键是唯一标识某一列的。主键有如下的特性:

主键不允许为空

主键和其他主键的值不相等

包含主键的列不允许修改

主键值不能重用。

创建主键方式:

1.在创建表的时候定义主键

CREATE TABLE table_name(
id INT NOT NULL PRIMARY KEY,
name CHAR(50) NOT NULL
);

2.修改表的时候添加主键

ALTER TABLE table_name
ADD CONSTRAINT PRIMARY KEY (column_name);

22.1.2外键

外键:外键是为了保持关系引用完整性的一个手段

创建外键的方式:

1.在创建表的时候创建外键

CREATE TABLE table_name
(..cust_id CHAR(10) NOT NULL REFERENCES Customers(cust_id);
);

2.在修改表的时候添加外键

ALTER TABLE table_name
ADD CONSTRAINT
FOREIGN KEY(cust_id) REFERENCES Customers(cust_id)

22.1.3唯一约束

唯一约束用来保证一列的数据是唯一的。

唯一约束UNIQUE

22.1.4检查约束

检查约束:用来检查输入的数值是否符合规范

检查约束使用CHECK

检查约束的创建方式:

1.在创建表的时候创建

CREATE TABLE OrderItems
(
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL CHECK (quantity > 0),
item_price MONEY NOT NULL
);

2.修改表的时候添加

ADD CONSTRAINT CHECK(gender LIKE '[MF]')

22.2索引

索引:索引用来排序数据以加快搜索和排序操作的速度。

注意:索引有一些缺点

1.索引增强了检索操作的性能,但对于数据插入、删除、更新的性能有所降低。

2.索引要占用大量的存储空间

3.并非所有数据都适合做索引,取值不多的数据(如州)不如具有更多可能值的数据(如姓或名),能通过索引得到这么多的好处。

简单的创建索引,不同的DBMS的创建索引方式不同:

CREATE INDEX prod_name_ind
ON Products(prod_name);

22.3触发器

触发器是一种特殊的存储过程。

简单创建触发器:

CREATE TRIGGER customer_state
ON Customers
FOR INSERT, UPDATE
AS
UPDATE Customers
SET cust_state = Upper(cust_state)
WHERE Customers.cust_id = inserted.cust_id;

22.4数据库安全

一般使用GRANT 和 REVOKE

  相关解决方案