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
用来合并结果并且不合并重复记录
- Datatype:数据类型,需要注意的是VARCHAR和CHAR,后面的括号中数字均为最大长度,不同的是VARCHAR是变长的可节省空间,而CHAR是定长的(最大长度)自动补充空格。
- PK:Primary Key:是否为主键
- NN:Not Null:规定该字段值能为为空
- AI:Auto Increase:自动递增,适用于ID,在插入新行时,对于此种可使用DEFAULT关键字使引擎自动递增分配值。
INSERT:插入新行、格式:
- INSERT INTO table:后紧跟VALUE关键字和(),并在括号中对每个字段进行赋值,可使用DEFAULT关键字对于某些缺省或递增值。
- 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花了两天半时间,接下来继续加油叭~