SQL 基础

SQL基础篇
前言:
本篇博客是一些简单的sql使用方式,并没有深入,以后会出一篇SQL高级应用的。本篇博客主要是借鉴了SQL必知必会的书籍。
这里的SQL语句执行的场景都是MYSQL数据库,其他数据库会略有差异。
一、什么是SQL?
SQL是Structured Query Langusge(结构化查询语言)的缩写。SQL是一种专门用来与数据库沟通的语言。
二、检索数据
2.1、检索语句格式:SELECT 列名1,列名2,……列名n FROM 表名 WHERE 检索条件;
例1:

  SELECT prod_name FROM products WHERE prod_id='BR01';

注:(1) SQL语句不区分大小写,关键字select、from、where等大小写是相同的语句;
(2) select 后可通过 “*” 来代表检索所有列;
(3) 搜索不需要的列通常会降低检索速度和应用程序的性能。
2.2、去重
去重的关键字是:DISTINCT,它必须放在列名前边。
DISTINCT 作用于查询出的所有列,并不只是作用于DISTINCT后边的列。
例2:

  SELECT DISTINCT vend_id FROM products;

2.3、限制结构:LIMIT
LIMIT用来取多少行的数据,有三种格式:LIMIT n;LIMIT n OFFSET m;LIMIT n,m;
LIMIT n 表示取n行,从0行开始区=取;
LIMIT n OFFSET m 表示从m行开始取,取n行;
LIMIT m,n 是上一条的简写,表示从m行开始取,取n行。
例3:

  SELECT prod_name FROM products LIMIT 3,5;

2.4、排序:ORDER BY
排序的关键词是:ORDER BY,格式:ORDER BY 列名1 [ASC|DESC],列名2 [ASC|DESC], 列名n[ASC|DESC]
ASC:按正序排序,默认为ASC,可省略;
DESC:按倒叙排序。
注:ORDER BY 语句应该放在SELECT语句的最后一条,否则会出错。
例4:

  SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price ASC, prod_name DESC;

注:在ORDER BY 后有多列时,先按前面的列排序,前边的列有重复的,所重复的数据在按后边的列排序。
2.5、过滤条件
where后接需要过滤的条件,多个条件用AND或OR连接,AND表示并关系,OR表示或的关系。
注:当where后同时有AND和OR时,优先处理AND。
例5:

  SELECT prod_name,prod_price FROM products WHERE vend_id='DLL01' OR vend_id='BRS01' AND prod_price >= 10;

2.6、通配符过滤
通配符是使用LIKE关键字进行模糊匹配的,并且只能用于文本字段。
常用通配符有%、_、[]。
%:匹配多个字符;_匹配单个字符;[]匹配字符集。
例6:

  SELECT * FROM products WHERE prod_name LIKE '%bean bag%';
  SELECT * FROM products WHERE prod_name LIKE '_ inch teddy bear';

注:使用通配符检索比普通检索要耗费更长的处理时间。
2.7、聚合函数
聚合函数包括:
AVG():返回某列的平局值;
COUNT():返回某列的行数;
MAX():返回某列的最大值;
MIN():返回某列的最小值;
SUM():返回某列值的和;
例7:

  SELECT AVG(prod_price) AS avg_price FROM products;
  SELECT MAX(prod_price) AS max_price FROM products;
  SELECT MIN(prod_price) AS min_price FROM products;
  SELECT SUM(prod_price) AS sum_price FROM products;
  SELECT COUNT(*) AS num FROM products;

注:使用COUNT(*)计算行数时不忽略空值,使用COUNT(列名)时,忽略空值;max、min、sum都会忽略空值。
2.8、分组
SQL通过关键字GROUP BY 对数据进行分组,使用分组有如下规定:
(1)group by 可以包含任意数量的列,进行分组嵌套;
(2)group by 子句中列出的每一列都必须是检索列或有效的表达式,但不能是聚合函数;
(3) select 语句中的每一列都必须在group by 子句中给出;
(4)group by 必须出现在where之后,order by之前。
例8:

  SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id;

2.9、语句顺序

  SELECT
  FROM
  WHERE
  GROUP BY
  HAVING
  ORDER B

三、表关联
笛卡尔积:没有关联条件的表关联,返回的结果的数量是第一个表中的行数乘以第二个表中的行数。
注:连接的表越多,性能下降的越快。
3.1、子查询
子查询是将一个查询语句的返回值作为另一个查询语句的过滤条件的筛选值,使用关键字IN
注:作为子查询的select语句只能查询单个列。
例9:

  SELECT cust_name,cust_contact FROM customers WHERE cust_id IN (
      SELECT cust_id FROM orders WHERE order_num IN ( 
	SELECT order_num FROM orderitems WHERE prod_id = 'RGAN01' 
	) 
)

3.2、内连接
内连接将返回两个表相等的数据,语法格式:INNER JOIN 关联的表 ON 关联条件
例10:

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

3.3、外连接
外连接分为左外连接、右外连接、全连接。
3.3.1、左外连接
左外连接是将左边的表的数据都查出来,以及右表的符合关联条件的数据。
左外连接:LEFT JOIN 关联的表 ON 关联条件。
3.3.2、右外连接
右外连接将右表都查出来呢,以及左边符合关联条件的数据。
右外连接:RIGHT JOIN 关联的表 ON 关联条件。
3.3.3、全外连接
全外连接查询两表的关联数据,未关联的数据也会返回。
全外连接:FULL JOIN 关联的表 ON 关联条件。
注:mysql不支持FULL JOIN
例11:

  SELECT c.cust_id,o.order_num FROM customers c LEFT JOIN orders o ON c.cust_id = o.cust_id;
  SELECT c.cust_id,o.order_num FROM customers c RIGHT JOIN orders o ON c.cust_id = o.cust_id; 

3.4、组合查询
组合查询是将多个查询合并在一起返回结果,关键字是:UNION。
规则:1>、UNION 必须由两条或两条以上的SELECT语句组成;
2>、UNION 中的每个查询必须包含相同的列;
3>、列的数据类型必须兼容。
注:UNION从查询结果中自动去除重复的行;若要返回所有的行使用 UNION ALL。
注:UNION只能使用一条ORDER BY 子句,并且必须位于最后一条SELECT语句之后。
例12:

  SELECT cust_name,cust_contact,cust_email FROM customers WHERE cust_state IN ('IL','IN','MI')
  UNION
  SELECT cust_name,cust_contact,cust_email FROM customers WHERE cust_name = 'Fun4All';

四、更新数据
4.1、插入数据
格式:INSERT INTO 表名(字段1,字段2,……,字段n) VALUES(值1,值2,……,值n);
像一个表中插入一条数据,字段和值相对应。
例13:

  INSERT INTO customers(cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country) VALUES (1000000006,'Toy Land','123 Any Street','New York','NY','11111','USA')

注:INSERT SELECT 是特殊的插入语句,将查询结果插入到表中。
格式:INSERT INTO 表名(字段1,字段2,……,字段n) SELECT 列1,列2,……,列n FROM 表名 WHERE 条件。
例14:

  INSERT INTO customers(cust_id,cust_contact,cust_name,cust_state) SELECT cust_id,cust_contact,cust_name,cust_state FROM custnew;

注:INSERT SELECT 中字段和列是按位置对应的,与名称无关。
4.2、复制表
格式:CREATE TABLE 新表名 AS SELECT 列1,列2,……,列n FROM 表名。
通过查询来复制出一个新表,若是想复制某个表的全部列,则可以直接使用SELECT *
例15:

  CREATE TABLE custcopy AS SELECT * FROM customers;

4.3、修改数据
格式:UPDATE 表名 SET 字段1=值1,字段2=值2,……,字段n=值n WHERE 条件
通过update语句可以修改表中某个字段的值;
例16:

  UPDATE customers SET cust_contact = 'Sam Roberts',cust_email='sam@toyland.com' WHERE cust_id=1000000006;

注:update语句最好不要省略where子句,避免更新表中所有数据。
4.4、删除数据
格式:DELETE FROM 表名 WHERE 条件
注:delete语句最好也不要省略where条件,避免将整个表数据删除。
例17:

  DELETE FROM customers WHERE cust_id=1000000006;

五、操作表
5.1、创建表
格式:CREATE TABLE 表名 (字段1 数据类型 是否为空 [默认值],字段2 数据类型 是否为空 [默认值],……,字段n 数据类型 是否为空 [默认值]);
使用create table可以创建一张新表,默认值可以不写,是否为空若是不写则默认为空。
例18:

  CREATE TABLE products (
      prod_id 		CHAR ( 10 ) 			NOT NULL,
      prod_name 	CHAR ( 10 ),
      prod_price 	DECIMAL ( 8, 2 )		NOT NULL DEFAULT 0,
      prod_desc 	VARCHAR ( 1000 ) 		NULL 
  );

5.2、更新表
格式:ALTER TABLE 表名 操作[ADD添加、DROP删除] 列名 数据类型 是否为空;
注:多数数据库是不建议修改表的。
例19:

  ALTER TABLE vendors ADD vend_phone CHAR(10);

5.3、删除表
格式:DROP TABLE 表名
例20:

  DROP TABLE custcopy;

六、视图
视图是虚拟的表,它不包含任何列或数据,包含的是一个查询。
6.1、视图的优点
1>重用SQL语句;
2>简化复杂的SQL语句;
3>使用表的一部分,而不是整张表;
4>保护数据;
5>更改数据格式和表示。
注:性能问题,若使用多个连接和过滤创建复杂的视图或嵌套了视图,性能可能下降的很厉害。
注:视图命名必须唯一,视图不能索引,多数数据库在视图查询中禁止使用ORDER BY子句
6.2、创建视图
格式:CREATE VIEW 视图名 AS 查询语句
例21:创建视图

  CREATE VIEW productsView AS SELECT cust_name, cust_contact,prod_id FROM customers c,orders o, orderitems i WHERE c.cust_id=o.cust_id AND i.order_num=o.order_num;

例22:使用视图

  SELECT cust_name, cust_contact FROM productsView WHERE prod_id='RGAN01';

6.3、删除视图
格式:DROP VIEW 视图名
例22:

  DROP VIEW productsview;

注:视图中的where语句和视图外的where语句将自动组合。
七、索引
索引是用来排序数据以加快搜索和排序操作的数据。
注:
1>索引改善检索操作的性能,但是降低了数据插入、修改和删除的性能;
2>索引数据可能要占用大量的存储空间;
3>索引用于数据过滤和数据排序;
4>索引用CREATE INDEX 语句创建;
5>索引必须唯一命名。

原文地址:https://www.cnblogs.com/masy-lucifer/p/14264643.html