我不会记录的特别详细
大体框架
这个分类有很多种,大致了解下即可
CREATE
、DROP
、ALTER
INSERT
、DELETE
、UPDATE
、SELECT
等。SELECT
用的最多.GRANT
、REVOKE
、COMMIT
、ROLLBACK
、SAVEPOINT
等。这个必须遵守
单行注释 #和–,多行注释 /**/
# 单行注释
-- 单行注释
/*
多行注释
*/
这个了解即可
create database a;//正确
create database a;//错误,已经存在
use a;
create table order(id int);//错误,order是关键字
create table `order`(id int);//正确
source sqlFile
select … from TableName;
为什么不推荐使用*
因为获取所有的列会降低性能,让效率变低
就比如你要计算年工资,你总不能存一个年工资和月工资把,这样浪费空间,还不是起一个别名
注意事项
别名使用双引号,列名和别名之间加入AS,若别名有空格必须使用双引号,别名要见名知义
例子:
SELECT name,salary,salary * 12 AS "annual salary" FROM employee;
去重的,对所在列以及后面的列去重
例如:
SELECT DISTINCT departmentId From employee;//对departmentId进行去重
SELECT DISTINCT departmentId,salary FROM employee;//对部门id和工资这个组合进行去重
/*
若有两条记录
departmentId salary
1 8000
1 7800
那么这两条记录会保留
若两条记录是
departmentId salary
1 8000
1 8000
这个是保留一个
*/
只要有NULL结果必定为NULL
注意:NULL不是空,他占存储空间,NULL的长度为空
这个我没有试过,明天试试
就比方说我想要把公司A的所有部门都列出来,格式如下:
公司A | 部门名称 |
---|---|
公司A | 部门1 |
公司A | 部门2 |
公司A | 部门3 |
可以这么写
SELECT "公司A",departmentName from deparments;
DESC或者DESCRIBE
DESCRIBE departments;
desc departments;
结果中有两列是Key和Extra,只记录这两个
这个太简单了,不记录了
加->+
减->-
乘->*
除->/
取余->%,比如 17 % 5 = 2 (17 -3*5)
这个很简单,简要记录
真为1,假为0,其他为null
他比等于多一个对null的判断,只有他是针对null的,就是当两边都是null的时候返回1;一边为null一边不为null返回0
SELECT NULL <=> NULL, 1<=>1;
与或非,异或没了,这里简单记录,
注意这里只要有一个参数是NULL那么结果必定为NULL,优先级:NOT > AND > OR(XOR)
运算符 | 规则 | 例子 |
---|---|---|
NOT 或! | 若为0结果为1,若为1,结果为0 | SELECT NOT |
AND 或 && | 同一则一,有一个0就是0 | SELECT 1 && 1 |
OR 或 || | 有一个一就是一,全为0结果就是0 | SELECT 1 OR 0 |
XOR | 两个不一样就是1,一样就是0 | SELECT 1 XOR 0 |
我的理解就是把操作数转换为补码按照指定的运算符的规则进行运算,再把结果转换为十进制数字
支持的运算符
运算符 | 含义 | 例子 |
---|---|---|
& | 按位与(AND) | SELECT A & B |
| | 按位或(OR) | SELECT A | B |
^ | 按位异或(XOR) | SELECT A ^ B |
~ | 按位取反 | SELECT ~A |
>> | 按位左移 | SELECT A <<1 |
<< | 按位右移 | SELECT B >>1 |
解释: 以 8 和-2 为例
8转换为补码是 0 1000
-2的原码是 1 0010
-2的反码是 1 1101
-2的补码是 1 1110
8 & -2
0 1000
& 1 1110
——————
0 1000
这里直接转二进制即可,结果是8
8 | -2
0 1000
| 1 1110
——————
1 1110
最高位是1,是负数,要求真值,对1 1110取补等于1 0010 转换为二进制数为-2 ,但是显示的结果是18446744073709551614
,应该是默认情况下数字以bigint类型存储的,bigint类型是8个字节,他的结果解释方式应该是把二进制解释成无符号数,要不然不会这么大的数字,如果是按照这么来的话,那1 1110
需要进行符号位扩展,扩展如下
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110
,就是在1 1110
的最高位1前面加了79个1,把这一串数字转换为十进制等于18446744073709551614
8 ^ -2
0 1000
| 1 1110
——————
1 0110
符号位扩展,扩展成64位,扩展结果
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0110
,把这东西转换为十进制18446744073709551606
~ -2
-2的补码(64位)等于1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110
# 1111 1111 -> 0000 0000
# 1111 1111 -> 0000 0000
# 1111 1111 -> 0000 0000
# 1111 1111 -> 0000 0000
# 1111 1111 -> 0000 0000
# 1111 1111 -> 0000 0000
# 1111 1110 -> 0000 0001
# 从上到下,把->后面的数字串起来为1前面63个0,当成无符号数,转换为十进制为1,所以答案就是1
1 >> 2
tips:在一定的条件下,可以当作除以2的n次幂来用
右移的规则:右移指定的位数后,右边低位的数值被移出并丢弃,左边高位空出的位置用0补齐。
这里不做符号位扩展了,简要的记录一下
1的补码是0 1,右移一位,01的最低位1就没了,高位补零,那么直接移成了0
1 << 2
tips: 在一定的条件下,可以当成乘以2的n次幂来用
就是乘以了2n,n就是右移的位数,可能会溢出
SELECT LEAST(1,2,3,4) FROM DUAL;
SELECT GREATEST(1,2,3,4) FROM DUAL;
SELECT 2 between 1 and 2;
SELECT 2 NOT IN (1,2);
SELECT 2 NOT IN (1,2);
SELECT 'abcd' LIKE 'a__d';
SELECT DepartmentId FROM DEPT WHERE DepartmentId like 'EM\%'
or DepartmentId like 'EM\_';
//这个用的比较少,了解
SELECT DepartmentId FROM DEPT WHERE DepartmentId like 'EMa%' ESCAPE 'a'
or DepartmentId like 'EMb_' ESCAPE 'b';
‘^’:匹配以该字符后面的字符开头的字符串
‘$’:匹配以该字符前面的字符结尾的字符串
'. ': 匹配任何一个但字符
“[…]”:匹配出现在方括号里面的字符,如匹配所有字母:[a-zA-Z]
‘*’:匹配零个或多个在它前面的字符,
SELECT * FROM `user` where name REGEXP '^ea';
SELECT * FROM `user` where name REGEXP 'or$';
SELECT * FROM `user` where name REGEXP 'e.a';
SELECT * FROM `user` where name REGEXP '^ce+';
SELECT * FROM `user` WHERE name REGEXP 'ea';
SELECT * FROM `user` WHERE name REGEXP 'ea | or';
SELECT * FROM `user` WHERE name REGEXP '[a-dw-y]
SELECT * FROM `user` WHERE id REGEXP '[^a-h1-8]';
{n,}
”表示至少匹配n
次前面的字符;“字符串{n,m}
”表示匹配前面的字符串不少于n
次,不多于m
次。例如,or{2,}
表示or连续出现至少2
次,也可以2
次;ea{2,4}
表示ea连续出现最少2
次,最多不能超过4
次。运算符一章完成,明天完成排序的一半