SQL基本语句总结

SQL基本语句总结

开始学习2333…看了个挺不错的视频,把知识点做下总结吧,网上似乎木得

USE:使用某sql(目前在使用哪个数据库可以从workbench的左侧导航栏加粗字体辨别)
*:as usual,通配符

SELECT column AS other_name (AS可以赋予别名,别名可以在之后的语句用到)
FROM table
WHERE condition (condition可以进行判断,注意sql中判等是‘=’不是‘==’,不等于既可以用‘!=‘亦可以’<>’)
ORDER BY ordering [DESC] (DESC表示降序,default是升序,多个排序条件用逗号隔开)

逻辑运算符:AND、OR、NOT,你懂的小胡,注意NOT可以用于很多其他保留字的语义补充*(AND优先级高于OR)*

IN:多个相同属性的判等语法糖,eg:

WHERE country = 'China' OR country = 'British' OR country = 'American'
-- 等效于如下:
WHERE country IN ('China', 'British', 'American')
-- 附加tips:否定:NOT IN

BETWEEN:与AND联用,判定介于上下界之间的语法糖

WHERE date >= '1998-12-19' AND date <= '2000-12-11'
-- 等效于:
WHERE date BETWEEN '1998-12-19' AND '2000-12-11'
-- 用来判断日期挺有用的,sql中日期标准形式:'YYYY-MM-DD' 

LIKE:用于字符串匹配,在pattern中用’%‘表示任意个字符而用’_'表示一个字符(大小写兼容)
REGEXP:正则表达式匹配,详见正则表达式咯,这里总结一些经常用到的:

  • ‘^’ :表示开头
  • ‘$’ :表示结尾
  • ’ | ’ :表示逻辑与,多个匹配pattern的逻辑与
  • [abc] :通配’a’、‘b’、‘c’
  • [a-h] :通配从’a’到’h’

IS NULL:判断是否为空值(这个你懂的啦,C#中学过的空值就是兼容数据库这里的咯)

  • 判断空值NULL必须使用IS NULL语法,= NULL是无效的
  • = NULL可以用在赋值中

LIMIT:限制子句,LIMIT总应在最后

LIMIT 5 -- 只展示前5条记录
LIMIT 6, 3 -- 展示第7-9条记录,第一个num为偏移量,第二个num为长度,在设计网页“分页查看”中似乎很有用2333

JOIN:有内部联接和外部联接两种,目前讲INNER JOIN内部联接,INNER可以不用写(optional:可选的,缺省的)
依我看,JOIN跟在FROM后面是最好的,从一张table并加入另一张table。JOIN加表名后跟
ON condition,将两张表结合的条件,记得用“类名解析符”——’.’

SELECT *   -- 注意在SELECT以及其他子句中防止名称的ambiguous,即不同表中同名的column需要用'.'加前缀修饰
FROM country c
JOIN countrylanguage cl ON c.Code = cl.CountryCode;
-- Implicit Join Syntax 
SELECT *
FROM country c, countrylanguage cl
WHERE c.Code = cl.CountryCode;
  • 注意此段代码段,JOIN和FROM加上表名后都可以加上一个别名作为该表格别名,使其在其他子句中使用简便
  • 若要引入其他数据库的表格,记得在表格前 + ‘sql_name. ',JOIN和FROM均适用于此规则(当前操作数据库可通过USE来确定,workbench左侧导航栏也会粗体显示)
  • 还可以将一张表加入到它本身中去,但要注意这里FROM和JOIN则必须使用不同的别名以区别
  • 在进行拥有复合主键的表格联接时,将”逻辑与“即AND用于ON condition中
  • 第二种代码格式为隐式联接、能够达到相同的效果但应该尽量避免书写此种形式代码,因为很容易发生交叉联接(即两关系的笛卡尔乘积,基数会变得很大——m*n)

OUTER JOIN:外部联接,分为左联接(LEFT JOIN)和右联接(RIGHT JOIN),OUTER在此时是可选的,不必写出。

  • 左联接:LEFT JOIN,在进行左联接时,FROM中表格的记录无论是否满足ON的condition,都会在联接表格中至少保留一份记录,没有联接上的记录中未联接字段值为null
  • 右联接:RIGHT JOIN,在进行右联接时,JOIN中表格的记录无论是否满足ON的condition,都会在联接表格中至少保留一份记录,没有联接上的记录中未联接字段值为null
  • tips:左右联接的方向性将取决于该table是在FROM语句中还是JOIN语句中,与ON中condition的左右无关 。外部联接自然也是可以多层使用的。在多层联接时,尽量避免使用右联接,只使用左联接 ,因为持续的左联接将保证保留记录项条理清晰(即为FROM表单中记录),增强代码的可读性 。
  • 自我联接也可使用外部联接,不赘述。

USING:当ON中condition两个column名字相同时可使用的语法糖:

SELECT * FROM custmors c JOIN orders o USING (custmors_id) -- USING语法糖
SELECT * FROM custmors c JOIN orders o ON c.custmors_id = o.custmors_id -- 等效该句
-- USING也适用于复合主键:
SELECT * FROM order_items oi JOIN order_item_notes oin USING (order_id, product_id)

NATURE JOIN:自动联接,sql引擎将根据两张表的公共列将两表联接一起,少用、危险。
CROSS JOIN:交叉联接,两表中记录两两完全联接,交叉联接可以使用在例如“三张桌子型号大中小,三种颜色红黄蓝,要把商品种类全部匹配”的类似情况。

UNION:组合运算符,将两个查询的结果组合在一起。UNION既可以组合同一张表中的查询结果,也可以组合不同表的查询结果,但是必须满足两个查询返回的列数相同(这里也反映出对于不同表的组合sql的工作原理),列名称(即字段名)取决于第一个查询。UNION的运算完成返回一个查询,基于此可以继续添加ORDER、LIMIT等子句;UNION ALL用来合并结果并且不合并重复记录
在这里插入图片描述

  1. Datatype:数据类型,需要注意的是VARCHAR和CHAR,后面的括号中数字均为最大长度,不同的是VARCHAR是变长的可节省空间,而CHAR是定长的(最大长度)自动补充空格。
  2. PK:Primary Key:是否为主键
  3. NN:Not Null:规定该字段值能为为空
  4. AI:Auto Increase:自动递增,适用于ID,在插入新行时,对于此种可使用DEFAULT关键字使引擎自动递增分配值。

INSERT:插入新行、格式:

  1. INSERT INTO table:后紧跟VALUE关键字和(),并在括号中对每个字段进行赋值,可使用DEFAULT关键字对于某些缺省或递增值。
  2. INSERT INTO table ( field_1, field_2, … ) VALUE ( value_1, value_2, … ):如此格式对指定字段进行赋值,字段的顺序可以睡随意,但务必时赋值顺序与其保持一致。

VALUES:多行插入关键字,也具有完全式和对应式两种结构语法,在VALUES后面用多个小括号并用逗号隔开以代表多个记录。
LAST_INSERT_ID() :内置函数,返回上一次插入的id,可以用于当某一表格的主键也需要插入其它表时

复制table:CREATE TABLE table_destination AS SELECT column FROM table_source,但是,源表格中的属性(例PK、AI并不会被复制过来)
在这里插入图片描述
truncate只会删除表的数据,而drop会连同表的结构一起删除。

另一种复制表数据的方法:

INSERT INTO table_source SELECT * FROM table_destination WHERE date > '2019-01-01'
-- 在此种句法中,SELECT作为子查询为INSERT提供查询并返回相应值(要求结构相同)

UPDATE:更新记录,与SET结合使用,语法:

UPDATE table_name
SET field_1 = value_1, field_2 = value_2, ... 
WHERE condition
  • 通过等号赋值,NULL可通过= NULL赋值,也可用DEFAULT赋缺省值
  • 表达式均可,例:SET sold_price = 1.5 * primary_price, date = old_date
  • 进行多条记录更新时同理,改变好condition就行,但是要注意在且仅在MySQL中,由于安全更新模式(一次只允许更新一条记录)将会报错,关闭方法:Edit → Preferences → SQL Editor → 划到最底下找到,设置完成后记得剪切代码关掉本地窗口重新连接打开再粘贴
  • 在更新前记得先进行选中节片选运行,查看子查询是否返回正确的需要更新的记录,谨慎更新~

从其他表中筛查条件并用于此表更新:

UPDATE first_table SET field = value
WHERE client_id = / IN (SELECT client_id FROM second_table WHERE name = / IN (condition))
-- 子查询做UPDATE判断条件

DELETE:删除记录,谨慎使用:DELETE FROM table_name WHERE condition

3小时结束了2333花了两天半时间,接下来继续加油叭~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值