应试速记 SQL 语法,语句

唯一、去重 DISTINCT

SELECT DISTINCT country FROM Websites;

where 条件判断

Select * from emp where empno=7900;
Select * from emp where ename='SMITH';
Select * from emp where sal > 2000 and sal < 3000; //优先级 () not and or
Select * from Websites where alexa > 15 and (country='CN' or country='USA');
select * from emp where not sal > 1500;
Select * from emp where comm is null;
Select * from emp where sal between 1500 and 3000;
SELECT * FROM Websites WHERE name BETWEEN 'A' AND 'H'; // 字符串比较下between
Select * from emp where sal in (5000,3000,1500);
Select * from emp where ename like 'M%';        // %替代0个或多个字符, _替代一个字符
Select * from emp where ename like '_M%';   
SELECT * FROM Websites WHERE name REGEXP '^[GFs]';  // ^ 表示以..开头, 以G或F或s开头
SELECT * FROM Websites WHERE name REGEXP '^[A-H]'; // 以A-H开头
SELECT * FROM Websites WHERE name REGEXP '^[^A-H]'; // 以非A-H开头, not regexp 也可表示

IF IFNULL 判断流程控制

IF(expr1,expr2,expr3) // 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
update Salary set sex=if(sex="f","m","f"); // 把 sex调换
select employee_id,salary*if(employee_id%2!=0 and name not like "M%", 1, 0) as bonus
from Employees

IFNULL(expr1,expr2) //假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。

一些函数,类似于存储过程,在数据库服务器上内定的一些功能函数

concat(s1, s2)
group_concat(select_result_list separator ',' )
upper(s)
lower(s) 
left(s, 1) // 字符串首字符
substring(name, 2) // 第二个字符起的子字符串

排序

SELECT * FROM Websites ORDER BY alexa; // 默认 ASC
SELECT * FROM Websites ORDER BY alexa DESC;
SELECT * FROM Websites ORDER BY country ASC, alexa DESC;

插入 删除 更新

INSERT INTO Websites VALUES ('百度','https://www.baidu.com/','4','CN');
INSERT INTO Websites (name, url, alexa, country) VALUES ('百度','https://www.baidu.com/','4','CN');
INSERT INTO Websites (name, url, country) VALUES ('stackoverflow', 'http://stackoverflow.com/', 'IND');
UPDATE Websites  SET alexa='5000', country='USA'  WHERE name='菜鸟教程';
UPDATE Websites SET alexa='5000', country='USA'  // update 没有(a,b,c)value(1,2,3)的搞法,要一个个赋值
DELETE FROM Websites WHERE name='Facebook' AND country='USA';

前N条 N%

select * from Websites LIMIT 2;
select top 50 percent * from Websites;
select top 5 * from table order by id desc;

别名

SELECT w.name, w.url, a.count, a.date 
FROM Websites AS w, access_log AS a 
WHERE a.site_id=w.id and w.name="菜鸟教程";

SELECT Websites.name, Websites.url, access_log.count, access_log.date
FROM Websites, access_log
WHERE Websites.id=access_log.site_id and Websites.name="菜鸟教程";

JOIN, 细分了几种多表联合查询的相连方式
联合查询两张表时,基于某一个共同意义的字段,将两表的数据行合并。使用最多的、默认情况下的是查询交集inner join。
要解决的问题是,多对应,无对应情况下,保留在查询结果中的是哪一部分,也就是集合交集、并集、差集


sql-join.png
SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a INNER JOIN mount_info b ON a.role_id = b.role_id;
SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a, mount_info b WHERE a.role_id = b.role_id; // 两句的意思一样,查询两个表中role_id相同的项。
inner join下,满足同一交叉条件下的数量在表A中,role_id=1 的有2条,表B中role_id=1的有3条,那么结果中笛卡尔积,就有6条role_id=1的项。
+---------+------------+----------+------------+
| role_id | occupation | camp     | mount_name |
+---------+------------+----------+------------+
|       1 | warrior    | alliance | horse      |
|       1 | warrior    | alliance | sheep      |
+---------+------------+----------+------------+


SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a LEFT JOIN mount_info b ON a.role_id = b.role_id; // left join下保留了A表的全部项,A中role_id在B中对应找到的,列出笛卡尔积结果;A中role_id未在B中找到对应的项,也列出在结果中但属于B的字段部分是NULL
+---------+------------+----------+------------+
| role_id | occupation | camp     | mount_name |
+---------+------------+----------+------------+
|       1 | warrior    | alliance | horse      |
|       1 | warrior    | alliance | sheep      |
|       2 | paladin    | alliance | NULL       |
|       3 | rogue      | Horde    | NULL       |
+---------+------------+----------+------------+

SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a RIGHT JOIN mount_info b ON a.role_id = b.role_id; // right join 保留了B表的全部项
+---------+------------+----------+------------+
| role_id | occupation | camp     | mount_name |
+---------+------------+----------+------------+
|       1 | warrior    | alliance | horse      |
|       1 | warrior    | alliance | sheep      |
|    NULL | NULL       | NULL     | sheep      |
+---------+------------+----------+------------+

group by , having, exists

SELECT column_name, aggregate_function(column_name) FROM table_name
WHERE column_name operator value GROUP BY column_name;
SELECT site_id, SUM(access_log.count) AS nums
FROM access_log 
GROUP BY site_id; // 按照site_id聚类结果下,统计每一类的总和 统计函数常用的有max min avg sum mid count first等

SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM (access_log
INNER JOIN Websites
ON access_log.site_id=Websites.id)
GROUP BY Websites.name
HAVING SUM(access_log.count) > 200; // 聚类中总和超过200的(where无法对聚类函数使用)

SELECT Websites.name, Websites.url 
FROM Websites 
WHERE EXISTS (SELECT count FROM access_log WHERE Websites.id = access_log.site_id AND count > 200);
SELECT Websites.name, Websites.url 
FROM Websites 
WHERE NOT EXISTS (SELECT count FROM access_log WHERE Websites.id = access_log.site_id AND count > 200);

max min avg sum mid count

SELECT site_id, count FROM access_log WHERE count > (SELECT AVG(count) FROM access_log);
SELECT COUNT(count) AS nums FROM access_log WHERE site_id=3;
SELECT COUNT(DISTINCT site_id) AS nums FROM access_log;
SELECT MAX(alexa) AS max_alexa FROM Websites;
SELECT SUM(count) AS nums FROM access_log;

表操作

DROP TABLE table_name
TRUNCATE TABLE table_name // 清空表
ALTER TABLE table_name ADD column_name datatype
ALTER TABLE table_name DROP COLUMN column_name
ALTER TABLE table_name MODIFY COLUMN column_name datatype

综合类型,嵌套查询,深层嵌套

SELECT *
   FROM CUSTOMERS
   WHERE SALARY > (SELECT SALARY
         FROM CUSTOMERS
         WHERE NAME='Komal'); // 查询工资高于Komal的人

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

推荐阅读更多精彩内容