CREATE TABLE Student ( SName VARCHAR(50), Age INT, Enroll DATE, IsMale BIT );
又称之为“插入(INSERT)”,标准写法:
-- Student表现有两列:SName 和 age INSERT Student(SName, Age, Enroll, IsMale) VALUES('atai',23,'2022-11-17', 1);语法注意事项:
|
T-SQL | mysql |
日期,忘了单引号,比如:2022-11-17 |
不会报错,而是按数值进行运算,并转换成(错误)日期 |
报错 |
INSERT Student VALUES('atai',23,'2022-11-17', 1);或者,我们可以只插入某一列的数据:
INSERT Student(SName) VALUES('atai');
注意:没有赋值的列为NULL值。
但行数据不能和表结构定义(definition)相冲突!
演示报错:
T-SQL | mysql |
Unicode编码的文本,前面还要加上一个N:
INSERT Student(SName) VALUES(N'阿泰'); |
完全不需要 |
使用SELECT,可以查询得到表数据,比如:
SELECT * FROM Student;
其中,星号(*)代表所有列,等同于:
SELECT SName, Age, Enroll, IsMale FROM Student;运行上述SQL语句,返回的就是Student表的所有行所有列的内容。
我们也可以指定其中的某些列:
-- 只查出Age列的数据 SELECT Age FROM Student;
SELECT还可以显示出在原表列的基础上进行运算的结果,比如:
SELECT Age+1 FROM Student
所以,我们还可以使用AS(可省略)给它指定一个名称:
SELECT Age+1 AS BigAge FROM Student; SELECT Age+1 BigAge FROM Student; --省略掉AS
AS也可以在已有列上使用,改变列名的显示(改变过后的列名又被称之为“别名”):
SELECT Id AS Number FROM Student; --Number就是Id的别名 SELECT Id Number FROM Student; --AS一样是可以省略的
注意:SELECT只是改变的呈现结果,永远不会更改数据本身。
最后,通配符*还可以和指定列一起共同使用:
SELECT Age+10 AS BigAge, * FROM Student;
可以在SELECT(以及接下来要学习的UPDATE和DELETE)后面添加WHERE子句,以进行条件查询和精确更新/删除。
比如,我们要查询所有年龄(Age)大于18岁的同学:
SELECT * FROM Student WHERE Age > 18;
Age > 18:一个能返回真/假(boolean)值的运算表达式(复习)。
SQL中使用的比较运算符和其他编程语言类似:(使用SELECT 1 WHERE 演示)
上述运算符可以比较数值和日期,以及文本。
其中,文本的比较是按字符的编码。
|
T-SQL | mysql |
文本的末尾空格 |
会被忽略,即:'abc' = 'abc '的运算结果为真。 |
不会被忽略 |
不使用符号,直接使用英语单词:
(NOT 3<2) -- 3<2为假,NOT之后为真
(3>2 AND 5>3 AND '2019/10/14'<'2019/11/23') --全部为真,AND之后还是为真 (3>2 AND 5>3 AND '2019/10/14'>'2019/11/23') --一个为假,AND之后就为假
(3>2 OR 5<3 OR '2019/10/14'>'2019/11/23') --只要一个为真,OR之后就是为真 (3<2 OR 5<3 OR '2019/10/14'>'2019/11/23') --只有全部为假,OR之后才为假
#体会#:BETWEEN...AND...实际上也就是两个表达式的AND运算
通配符:
IF( 'ABCD' LIKE '_BC%')
如果要查文本里有没有%呢?我们需要:
IF( '源栈87%的就业率' LIKE '%%%') -- 这样写是不行的,%会被认为是“任意字符” IF( '源栈87%的就业率' LIKE '%#%%' ESCAPE '#') -- 转义字符为#除了%和_,还有[]^都是需要转义的。注意UNICODE文本任然需要在单引号前面加N,如:N'源栈欢迎您!'
注意这里的删,删除的是表里面的行数据,不是表本身!
注意:mysql workbench需要修改Safe Update默认设置
可以用两种方式删除表数据:
--删除Student表的所有行 DELETE FROM Student;
--注意有TABLE关键字 TRUNCATE TABLE Student;
常见面试题:TRUNCATE和DELETE有什么区别呢?
DELETE Student WHERE Age < 20;
参考:(设计到日志/事务/缓存……需要同学们在学习完成SQL课程后才能理解,^_^)
-- 把Student的Age列上所有值改为18 UPDATE Student SET Age = 18;
或者同时更改好几列:
UPDATE Student SET Age = 18, SName='xj';
也可以让列本身参与运算,比如:
UPDATE Student SET Age = Age + 18; -- Age列所有值都加上18 UPDATE Student SET Score = Score + Age; -- Score列所有值都加上Age的值
#体会#:SQL的“集合运算”特性,它直接了当的在Age列所有行上进行运算,不需要像其它一些编程语言那样,进行循环迭代,一行一行的取出数据再进行运算……
以上都会更新表中所有行数据,和DELETE语句一样,通常都会带着WHERE子句。比如:给所有入学时间(Enroll)在9月的同学成绩加上10分:
UPDATE Student SET Age += 10 WHERE Enroll BETWEEN '2017/8/31' AND '2017/10/1';
大体上来说,SQL中常用的运算和其他编程语言类似:
复习/参考:JavaScript / J&C字符串 / C#类库 / Java类库……
|
T-SQL | mysql |
取长度 |
LEN() |
length() |
查找:在string中找到target,返回其所在下标,找不到返回0 |
CHARINDEX(target, string) |
instr(string, target) |
重复:将string重复n次 |
REPLICATE(string, n) |
repeat(string, n) |
|
T-SQL |
mysql |
当前时间 |
GETDATE() |
now() |
在date的上增加number个datetype(YEAR/MONTH/WEEK/DAY……) |
DATEADD(datetype,number,date) |
date_add(date, interval number datetype) |
start和end之间有多少datetype(mysql只有DAY) |
DATEDIFF(datetype, start, end) |
datediff(start, end) |
|
T-SQL |
mysql |
CAST(express AS datatype) |
datatype同建表时声明 |
不一定同建表时声明,比如不是varchar而是char,不是int而是signed(带正负符号的)/unsigned(不带正负符号的), |
CONVERT: |
(datatype, express) |
(express, datatype) 参数位置区别 |
飞哥专门做了一个总结,NULL值和任何值(包括NULL值):
SELECT 1 WHERE(NULL > 0); -- mysql:SELECT 1 as result……更清晰 SELECT 1 WHERE(NULL < 0); SELECT 1 WHERE(NULL = 0); SELECT 1 WHERE(NULL <> 0); SELECT 1 WHERE(NULL = ''); SELECT 1 WHERE(NULL = NULL); SELECT 1 WHERE(NULL <> NULL);
SELECT 1 WHERE(NOT NULL = 0);
SELECT NULL+23; SELECT NULL+'23';
那么,如何判断一个值是不是NULL呢?我们只能使用 IS NULL:
SELECT 1 WHERE(NULL IS NULL);
NULL值的特殊性将在以后的排序、聚合运算、集合运算……中不断体现
@想一想@:怎么样才能避免“删库跑路”?数据库操作能不能Ctrl+Z?
只要我们把SQL语句放在事务(transaction)中,就可以选择提交(commit)或回滚(rollback),回滚就类似于Ctrl+Z的功能。
显式的开始一个事务:
T-SQL | mysql |
BEGIN TRANSACTION --或者 BEGIN TRAN说明:T-SQL中很多关键字都可以简写成前4个字符 |
BEGIN -- 不是可以,而是必须省略TRAN START TRANSACTION -- 或者 |
这样,就可以将其后的SQL语句处于一种“悬置”状态,比如:
DELETE FROM Student;
执行上述SQL语句,查看Student表的内容,似乎已经被删除了。但其实不是的,运行:
ROLLBACK; -- 回滚事务
然后我们会发现Student表又回来了!这就是事务的回滚。
PS:事务的回滚一般通过日志文件实现。
如果要真的删除Student表里的内容,我们需要继续调用:
COMMIT; -- 提交事务
提交之后的事务就再也无法回滚了!
PS:按SQL标准,
而TRUNCATE又属于DDL,所以……
mysql仍然遵循这一规则,但SQL Server的高版本突破了这一限制。
事务的更多内容我们会再后面继续学习。
UserName |
Password |
17bang |
1234 |
Admin |
NULL |
Admin-1 |
|
SuperAdmin |
123456 |
UserName |
Password |
17bang |
1234 |
Admin |
NULL |
Admin-1 |
|
SuperAdmin |
123456 |
多快好省!前端后端,线上线下,名师精讲
更多了解 加: