SQL必知必会

一、SQL是Structured Query Language结构化数据语言。

是一种专门用来与数据库沟通的语言
基本概念:

  • 数据库:database,保存有组织的数据的容器(通常是一个文件或一组文件)

  • 数据库软件:DBMS,管理和操作数据库的软件

  • 表:某种特定类型数据的结构化清单。

    • 表名:一个数据库中每一个表的表名都是唯一的。
    • 模式:关于数据库和表的布局以及特性的信息。
  • 主键:一列或一组列,用来唯一标识表中的每一行,也就是每一条记录

    • 任意两行的主键值不能相同
    • 每一列都必须有个主键值,不允许为null
    • 主键值不允许修改或更新
    • 主键值不能重用

二、检索数据:SELECT

1、SELECT语句
SELECT .....FROM.....

select count(*) as count ,ip , create_date
from merchant_info
where ip is not null 
group by ip having count(*) > 3

Select后面跟几个词,就显示几列,count(*)是查询包括null在内的所有行数。
然而后面加上了where过滤条件 以及group by的分组条件,所以是每一个分组出一个count的数据

Paste_Image.png

三、排序检索数据:ORDER BY

  • 1、ORDER BY子句:必须是最后一条子句。
    SELECT prod_name
    FROM Products
    ORDER BY prod_name;
  • 2、按多个列排序,指定列名,用逗号隔开即可,临近的优先。
    SELECT prod_id, prod_price , prod_name
    FROM Products
    ORDER BY prod_price , prod_name;
    先按照price,再按照name进行排序
  • 3、可以按相对列的位置进行排序。
    SELECT prod_id , prod_price , prod_name
    FROM Products
    ORDER BY 2,3;
  • 4、指定排序方向
    SELECT prod_id, prod_price , prod_name
    FROM Products
    ORDER BY prod_price DESC , prod_name;
    按照价格降序来排列产品。DESC只作用于其前面的列名上。ASC升序是默认的。

四、过滤数据:WHERE

1、搜索条件(过滤条件)WHERE,位于FROM之后,ORDER BY之前

 SELECT prod_name, prod_price
 FROM Products
 WHERE prod_price = 3.49;

2、WHERE子句操作符:等于,不等于,小于,大于

五、高级数据过滤:AND/ IN/ NOT

1、AND操作符, 可以连接两个条件。
组合WHERE子句 WHERE .....AND......
2、OR操作符
当AND和OR连用的时候,AND的优先级更高,所以需要用括号将语句括起来。
WHERE (ven_id = "A" OR ven_id="B")AND prod_price = 10;
3、IN操作符,用来指定条件范围。
语法更清楚直观。求值顺序更容易管理。
比OR执行的快。可以包含其他的SELECT语句。
4、NOT操作符,否定其后跟的任何条件。

六、用通配符进行过滤:*、%

1、通配符:用来匹配值的一部分的特殊字符。
搜索模式:由字面值、通配符或两者组合构成的搜索条件。
通配符搜索只能用于文本字符串
2、百分号%操作符。表示任何字符出现任意次数。区分大小写

 WHERE prod_name LIKE 'Fish%';找出所有以词FIsh开头的产品。
 '%bean bag%'表示任何位置包含bean bag的文本
 WHERE email LIKE 'b%@forta.com' 查找电子邮件
 WHERE prod_name LIKE 'F%y' 表示F起头y结尾的值

3、下划线_通配符,匹配单个字符。
WHERE first_name LIKE '_l%'
4、方括号([ ])通配符,指定一个字符集,必须匹配指定位置的一个字符
MYSQL好像不支持

七、创建计算字段——需要将数据库中的信息转格式再输出:CONCAT

1、计算字段并不实际存在于数据库表中,而是运行时在SELECT语句中创建的。
字段:相当于列
2、拼接字段
SELECT CONCAT(first_name,' ',last_name)
3、使用别名,也就是sql创建一个新的列,包含这个拼接的值。客户端可以 引用这个新的列
SELECT CONCAT(first_name,' ',last_name) AS name
4、 执行算术计算 +-*/

 SELECT prod_id , quantity, item_price, 
 quantity*item_price AS price

八、使用函数处理数据

1、每一个DBMS都有 特定的函数
提取字符串的组成部分:SUBSTRING()
数据类型转换:CONVERT()
取当前日期:CURDATE()
2、UPPER——转换成大写

   SELECT first_name,UPPER(first_name) AS first_name_up  

常用的文本处理函数P67
LEFT() 返回字符串左边的字符
LENGTH()返回字符串的长度
LOWER() 将字符串转换为小写
LTRIM() 除去字符串左边的空格
3、 数值处理函数

九、汇总数据:COUNT()

1、聚集数据
AVG() 返回某列的平均值
COUNT()返回某列的行数
COUNT(*)包含null值的行
COUNT(column)忽略null值的行

 MAX()     返回某列的最大值
 MIN()     返回某列的最小值
 SUM()    返回某列值之和

十、分组数据——汇总表内容的子集:HAVING

1、SELECT vend_id ,COUNT(*) AS num_prods FROM Products GROUP BY vend_id;
按照ven_id来分组,显示个数。

Paste_Image.png

GROUP BY 可以包含任意数目的列,因而可以对分组进行嵌套
建立分组时,所有的列都一起计算
用的表达式必须和SELECT中的相同
SELECT中的每一列都必须在GROUP BY中给出
在WHERE之后,ORDER BY之前

2、过滤分组——HAVING
HAVING相当于WHERE,只是专门用来过滤分组的。
>SELECT warn_trade_amount,COUNT(*) AS count
FROM merchant_info
GROUP BY warn_trade_amount
HAVING warn_trade_amount>=49200
对大于49200的进行分组
3、GROUP BY 和 ORDER BY的区别
P90
4、顺序:SELECT--FROM--WHERE--GROUP BY--HAVING--ORDER BY

十一、使用子查询——嵌套在其他查询中的查询

1、查询的嵌套:

Paste_Image.png

子查询是从内向外处理的。
2、注意:子查询的Select语句只能查询单个列,查询多个列将返回错误。
这里是将查出的count作为oders,也就是orders为订单数 。然后是将两个表的id连接,传入id来对orders表进行查询

SELECT cust_name, cust_state,
(SELECT COUNT(*) FROM orders WHERE orders.cust_id=customers.cust_id) AS orders
FROM customers ORDER BY cust_name;

注:用多个表的时候要完全限定列名,而且子查询并不是效率最高的。

十二、联结表:INNER JOIN

1、关系表:将信息分解成多个表,一类数据一个表。各表通过某些共同的值相互关联,所以才叫关系型数据库。
2、

SELECT vend_name , prod_name ,prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id

这是等值连接(equijoin),基于两个表之间的相等测试,也称为内联结(inner join)。可以对这种联结使用稍微不同的语法,明确指定联结的类型。

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

这里指定是以内联结的方式
3、联结多个表:

SELECT prod_name , vend_name , prod_price , quantity
FROM orderitems, products, vendors
WHERE products.vend_id = vendors.vend_id
AND orderitems.prod_id = products.prod_id
AND order_num = 20007

这个查询是得出订单20007中的物品信息:包括产品名,价格,供应商和数量。
其中,产品名和价格在products表中,供应商信息在vendors表中,数量在orderItems表中。
而最后一个联结条件是用来指定订单号。
注意:1、联结非常耗费资源。联结的越多,性能下降的越厉害。
2、联结中的最大数目是有限制的。、

十三、创建高级联结:JOIN

1、使用表别名。可以对被检索的列使用别名,也可以对表使用别名。
可以缩短SQL语句
允许在一条SELECT语句中多次使用相同的表。

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_item = o.order_num
AND prod_id = "RGAN01"

表别名可以在WHERE、SELECT、ORDER BY以及其他部分。
2、使用不同类型的联结。
除了简单联结(内联结/等值联结),还有自联结(self-join)、自然联结(natural-join)和外联结(outer join)
1)自联结:就是

5、使用带聚集函数的联结。需要检索所有顾客以及每个顾客所下的订单数

SELECT customers.cust_id, COUNT(orders.order_num) AS num_ord
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id
Paste_Image.png

这个语句将使用INNER JOIN将Customers和Orders表互相关联。
Group By 按照顾客分组,用COUNT对每个顾客的订单计数,将它作为num_ord返回

十四、组合查询——多条SELECT语句并在一起:UNION

在一个查询中从不同的表返回数据结构
对一个表执行多个查询,按一个查询返回数据

1、使用UNION创建组合查询——需要Illonois、Indiana、Michigan等美国几个州的所有顾客的报表,还想包括不管位于哪个州的Fun4All

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'

等价于

SELECT cust_name, cust_contact , cust_email
FROM customers
WHERE cust_state IN('IL','IN','MI')

![Uploading 1_965426.jpg . . .]
OR cust_name = 'Fun4All'
对于较复杂的过滤条件,UNION比where效率更高。
2、UNION从查询结果中自动去除了重复的行。UNION ALL不去除。
3、对组合查询结果排序,只能使用一条order by语句。

十五、插入数据:INSERT

插入有几种方式:插入完整的行,插入行的一部分,插入某些查询的结果
1、插入完整的行
1)

Paste_Image.png

存储到表中每一列的数据都在VALUES中给出
必须每一列给一个值或者null
各列必须按照表中的顺序来填充

缺点:不安全,死板,依赖于表结构
2)或者可以列出列名一一对应,好处是即使表结构改变也起作用,所以列出的列的顺序不必要和表中相同——推荐方法。
2、插入部分行:
也就是可以省略一些列名,不需要完全列出。但是必须满足两个条件
该列定义允许为NULL
在表定义中给出默认值,如果表中没给,插入时也不而给,就会报错

3、插入检索出的数据:INSERT SELECT

Paste_Image.png

这个例子将CustNew中的所有数据导入到Customer中。
4、从一个表复制到另一个表:SELECT INTO

Paste_Image.png

创建一个名为CustCopy的新表,并把Customer表中的所有内容复制到新表中。
*可以改成列名,可以选择性复制。
任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY
可以利用联结从多个表中插入数据
不管从多少个表中检索数据,数据都只能插入到一个表中

十六、更新和删除数据:UPDATE、DELETE

1、更新数据
更新表中特定的行
更新表中所有行

Update的组成
要更新的表
列名和他们的新值
确定要更新哪些行的过滤条件

Paste_Image.png

删除某个列的值,可以设置它为NULL

Paste_Image.png

2、删除数据
从表中删除特定的行
从表中删除所有的行

Paste_Image.png

如果省略WHERE,将会删除所有的顾客
DBMS通常可以防止删除某个关系需要用到的行
DELETE可以删除所有的行,但是不删除表。TRUNCATE TABLE删除所有行更快

十七、创建和操纵表

1、创建表
多数DBMS都具有交互式创建和管理数据库表的工具
表也可以直接用SQL语句操纵

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容