常用sql语句总结

常用sql语句总结

本文总结了常用的SQL语句,尤其适合在面试前复习你的SQL知识。你可以尝试文中的例子,温习下你很久以前在数据库系统课程上学到的知识。

配置样例数据库
为了演示每个命令的用法,我们将使用一个样例数据库。生成该数据库的脚本可以从Google网盘下载:

DLL.sql: https://drive.google.com/file/d/0B_oq3-doZhC-ME1lUlR3a3pYRU0/view

InsertStatements.sql: https://drive.google.com/file/d/0B_oq3-doZhC-TV9ud1JubkVDaXM/view

如不便访问Google网盘,可以在论智公众号(ID: jqr_AI)留言sql recap获取。

下载文件后,输入以下命令进入MySQL控制台(假设你已经装好了MySQL或MariaDB)。

mysql -u root -p
mysql会提示你输入密码,输入安装配置MySQL服务时设置的密码即可。

输入如下命令生成样例数据库:

CREATE DATABASE university;
USE university;
SOURCE <DLL.sql文件路径>;
SOURCE <InsertStatements.sql文件路径>;

好了,现在让我们开始温习SQL语句吧。

数据库

  1. 查看现有数据库

SHOW DATABASES;
2. 新建数据库

CREATE DATABASE <数据库名>;
3. 选择数据库

USE <数据库名>;
4. 从.sql文件引入SQL语句

SOURCE <.sql文件路径>;
5. 删除数据库

DROP DATABASE <数据库名>;


6. 查看当前数据库中的表

SHOW TABLES;

在这里插入图片描述7. 创建新表

CREATE TABLE <表名> (
    <列名1> <列类型1>,
    <列名2> <列类型2>,
    <列名3> <列类型3>,
    PRIMARY KEY (<列名1>),
    FOREIGN KEY (<列名2>) REFERENCES <表名2>(<列名2>)
);

主键(PRIMARY KEY)用来标识一条记录(一行),所以每条记录的主键值必须是唯一的。主键可以定义在多列上,这称为联合主键(composite primary key)。

如果我们把表视作具有某种结构的数组(例如,C语言中的struct),那么外键(FOREIGN KEY)可以视作指针。

例子:

CREATE TABLE instructor (
    ID CHAR(5),
    name VARCHAR(20) NOT NULL,
    dept_name VARCHAR(20),
    salary NUMERIC(8,2), 
    PRIMARY KEY (ID),
    FOREIGN KEY (dept_name) REFERENCES department(dept_name));

在上面的例子中,我们创建了一个教员(instructor)表,该表的主键是ID,外键是教员所在的部门名称(dept_name),关联部门(department)表。此外,教员表还包括姓名(name)、薪水(salary)。其中,姓名有约束NOT NULL,表示姓名这一项不能为空。

  1. 概述表中的列

使用如下语句查看表中的列的基本信息:

DESCRIBE <表名>;
下图显示了一些例子:

在这里插入图片描述9. 在表中插入新纪录

INSERT INTO <表名> (<列名1>, <列名2>, <列名3>, …)
    VALUES (<值1>, <值2>, <值3>, …);

也可以省略列名(依序在所有列上插入新值):

INSERT INTO <表名>
    VALUES (<值1>, <值2>, <值3>, …);
  1. 在表中更新记录
UPDATE <表名>
    SET <列名1> = <值1>, <列名2> = <值2>, ...
    WHERE <条件>;
  1. 清空表
DELETE FROM <表名>;
  1. 删除表
DROP TABLE <表名>;
查询
13. SELECT

SELECT语句可以从表中选择数据:

SELECT <列名1>, <列名2>, …
    FROM <表名>;

以下语句选择所有内容:

SELECT * FROM <表名>;

在这里插入图片描述
选中部门(department)表和课程(course)表中的所有内容
14. SELECT DISTINCT

SELECT DISTINCT过滤掉了重复的值:

SELECT DISTINCT <列名1>, <列名2>, …
    FROM <表名>;

在这里插入图片描述
15. WHERE

我们之前在更新记录时已经用到了WHERE关键字,用来指明条件。这里我们稍微详细一点地介绍下WHERE。

WHERE的条件通常是:

比较文本(text)

比较数字(numbers)

AND、OR、NOT等逻辑运算

让我们来看一些例子:

SELECT * FROM course WHERE dept_name='Comp. Sci.';
SELECT * FROM course WHERE credits>3;
SELECT * FROM course WHERE dept_name='Comp. Sci.' AND credits>3;

在这里插入图片描述

  1. GROUP BY

GROUP BY语句可以分组结果,常用于COUNT、MAX、MIN、SUM、AVG等聚合函数(aggregate functions)。

SELECT <列名1>, <列名2>, …
    FROM <表名>
    GROUP BY <列名>;

让我们来看一个例子,列出每个部门的课程数量:

SELECT COUNT(course_id), dept_name 
     FROM course 
     GROUP BY dept_name;

在这里插入图片描述

  1. HAVING

乍看起来,HAVING和WHERE很像:

SELECT <列名1>, <列名2>, …
    FROM <表名>
    GROUP BY <列名x>
    HAVING <条件>;

那么,HAVING和WHERE有什么不同呢?让我们先来看一个例子,列出开了不止一门课程的部门开设的课程数:

SELECT COUNT(course_id), dept_name 
    FROM course 
    GROUP BY dept_name 
    HAVING COUNT(course_id)>1;

这里HAVING不能换成WHERE,因为WHERE直接针对行操作,且在GROUP BY之前运行(即先通过WHERE筛选行,之后再将筛选出的行通过GROUP BY分组)。假设SQL中不存在HAVING语句,那么我们只能先新建一张表,将COUNT(course_id)作为新表的列,然后在新表上再通过WHERE进行筛选(当然,实际上SQL提供了派生表、CTE等机制,并不用真的手工建新表)。
在这里插入图片描述

  1. ORDER BY

ORDER BY可以对结果进行排序,在没有明确指定ASC(升序)或DESC(降序)的情况下,默认按升序排列。

SELECT <列名1>, <列名2>, …
FROM <表名>
ORDER BY <列名1>, <列名2>, …, ASC|DESC;

例子:

SELECT * FROM course ORDER BY credits;
SELECT * FROM course ORDER BY credits DESC;

在这里插入图片描述
19. BETWEEN

BETWEEN语句用于指定区间。

SELECT <列名1>, <列名2>, …
    FROM <表名>
    WHERE <列名x> BETWEEN <值1> AND <值2>;

其中“值”可能是数字,文本,乃至日期等。

例如,列出薪资在50000和100000之间的教员:

SELECT * FROM instructor 
    WHERE salary BETWEEN 50000 AND 100000;

在这里插入图片描述
20. LIKE

LIKE用于匹配文本中的特定模式。

SELECT <列名1>, <列名2>, …
    FROM <表名>
    WHERE <列名x> LIKE <模式>;

模式中可以使用以下两个通配符:

% (零个、一个或多个字符)

_ (单个字符)

例子:列出课程名中包含“to”的课程,以及课程ID以“CS-”开头的课程。

SELECT * FROM course WHERE title LIKE '%to%';
SELECT * FROM course WHERE course_id LIKE 'CS-___';

在这里插入图片描述
21. IN

IN语句表示值属于某个集合。

SELECT <列名1>, <列名2>, …
    FROM <表名>
    WHERE <列名n> IN (<值1>, <值2>, …);

例子:列出计算机科学、物理、电子工程部门的学生。

SELECT * FROM student 
    WHERE dept_name IN ('Comp. Sci.', 'Physics', 'Elec. Eng.');

在这里插入图片描述
22. JOIN

JOIN用来组合两张以上表中的值。下图展示了JOIN的三种类型:
在这里插入图片描述

SELECT <列名1>, <列名2>, …

    FROM <表名1>
    JOIN <表名2>
    ON <表名1.列名x> = <表名2.列名x>

让我们来看三个例子,分别对应三种JOIN的类型。

第一个例子,列出课程时包含开设课程的部门详情:

SELECT * FROM course 
    JOIN department 
    ON course.dept_name=department.dept_name;

在这里插入图片描述
第二个例子,列出所有具有前置课程的课程的详情:

SELECT prereq.course_id, title, dept_name, credits, prereq_id 
    FROM prereq 
    LEFT OUTER JOIN course 
    ON prereq.course_id=course.course_id;

在这里插入图片描述
最后一个例子,列出所有课程的详情,不管是否具有前置课程:

SELECT course.course_id, title, dept_name, credits, prereq_id 
    FROM prereq 
    RIGHT OUTER JOIN course 
    ON prereq.course_id=course.course_id;

在这里插入图片描述
23. 视图

视图(view)是虚拟的SQL表。它包含行和列,和一般的SQL表格很类似。视图总是显示数据库中的最新数据。

CREATE VIEW

创建视图:

CREATE VIEW <视图名> AS
    SELECT <列名1>, <列名2>, …
    FROM <表名>
    WHERE <条件>;
DROP VIEW

删除视图:

DROP VIEW <视图名>;

例如,创建3学分的课程视图:

CREATE VIEW my_view AS
    SELECT * FROM course
    WHERE credits=3;

在这里插入图片描述
24. 聚合函数

我们之前已经提到聚合函数,这里列出最常用的一些聚合函数:

COUNT(列名) 返回行数

SUM(列名) 返回指定列的值之和

AVG(列名) 返回指定列的平均值

MIN(列名) 返回指定列的最小值

MAX(列名) 返回指定列的最大值

  1. 嵌套子查询

在SQL请求中,可以嵌套SELECT-FROM-WHERE表达式,称为嵌套子查询(nested subqueries)。

例如,查找2009年秋、2010年春都开的课程:

SELECT DISTINCT course_id 
    FROM section 
    WHERE semester = ‘Fall’ AND year= 2009 AND course_id IN (
        SELECT course_id 
            FROM section 
            WHERE semester = ‘Spring’ AND year= 2010
    );

在这里插入图片描述

原文地址:https://towardsdatascience.com/sql-cheat-sheet-for-interviews-6e5981fa797b

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sql最全的常用命令语句 询某个数据库的连接数 select count(*) from Master.dbo.SysProcesses where dbid=db_id() --前10名其他等待类型 SELECT TOP 10 * from sys.dm_os_wait_stats ORDER BY wait_time_ms DESC SELECT *FROM sys.dm_os_wait_stats WHERE wait_type like 'PAGELATCH%' OR wait_type like 'LAZYWRITER_SLEEP%' --CPU的压力 SELECT scheduler_id, current_tasks_count, runnable_tasks_count FROM sys.dm_os_schedulers WHERE scheduler_id < 255 --表现最差的前10名使用查询 SELECT TOP 10 ProcedureName = t.text, ExecutionCount = s.execution_count, AvgExecutionTime = isnull ( s.total_elapsed_time / s.execution_count, 0 ), AvgWorkerTime = s.total_worker_time / s.execution_count, TotalWorkerTime = s.total_worker_time, MaxLogicalReads = s.max_logical_reads, MaxPhysicalReads = s.max_physical_reads, MaxLogicalWrites = s.max_logical_writes, CreationDateTime = s.creation_time, CallsPerSecond = isnull ( s.execution_count / datediff ( second , s.creation_time, getdate ()), 0 ) FROM sys.dm_exec_query_stats s CROSS APPLY sys.dm_exec_sql_text( s.sql_handle ) t ORDER BY s.max_physical_reads DESC SELECT SUM(signal_wait_time_ms) AS total_signal_wait_time_ms总信号等待时间 , SUM(wait_time_ms - signal_wait_time_ms) AS resource_wait_time_ms资源的等待时间, SUM(signal_wait_time_ms) * 1.0 / SUM (wait_time_ms) * 100 AS [signal_wait_percent信号等待%], SUM(wait_time_ms - signal_wait_time_ms) * 1.0 / SUM (wait_time_ms) * 100 AS [resource_wait_percent资源等待%] FROM sys.dm_os_wait_stats --一个信号等待时间过多对资源的等待时间那么你的CPU是目前的一个瓶颈。 --查看进程所执行的SQL语句 if (select COUNT(*) from master.dbo.sysprocesses) > 500 begin select text,CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) from master.sys.sysprocesses a end select text,a.* from master.sys.sysprocesses a CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) where a.spid = '51' dbcc inputbuffer(53) with tb as ( select blocking_session_id, session_id,db_name(database_id) as dbname,text from master.sys.dm_exec_requests a CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) ), tb1 as ( select a.*,login_time,program_name,client_interface_name,login_name,cpu_time,memory_usage*8 as 'memory_usage(KB)', total_scheduled_time,reads,writes,logical_reads from tb a inner join master.sys.dm_exec_sessions b on a.session_id=b.session_id ) select a.*,connect_time,client_tcp_port,client_net_address from tb1 a inner join master.sys.dm_exec_connections b on a.session_id=b.session_id --当前进程数 select * from master.dbo.sysprocesses order by cpu desc --查看当前活动的进程数 sp_who active --查询是否由于连接没有释放引起CPU过高 select * from master.dbo.sysprocesses where spid> 50 and waittype = 0x0000 and waittime = 0 and status = 'sleeping ' and last_batch < dateadd(minute, -10, getdate()) and login_time < dateadd(minute, -10, getdate()) --强行释放空连接 select 'kill ' + rtrim(spid) from master.dbo.sysprocesses where spid> 50 and waittype = 0x0000 and waittime = 0 and status = 'sleeping ' and last_batch < dateadd(minute, -60, getdate()) and login_time < dateadd(minute, -60, getdate()) --查看当前占用 cpu 资源最高的会话和其中执行的语句(及时CPU) select spid,cmd,cpu,physical_io,memusage, (select top 1 [text] from ::fn_get_sql(sql_handle)) sql_text from master..sysprocesses order by cpu desc,physical_io desc --查看缓存中重用次数少,占用内存大的查询语句(当前缓存中未释放的)--全局 SELECT TOP 100 usecounts, objtype, p.size_in_bytes,[sql].[text] FROM sys.dm_exec_cached_plans p OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql ORDER BY usecounts,p.size_in_bytes desc SELECT top 25 qt.text,qs.plan_generation_num,qs.execution_count,dbid,objectid FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(sql_handle) as qt WHERE plan_generation_num >1 ORDER BY qs.plan_generation_num SELECT top 50 qt.text AS SQL_text ,SUM(qs.total_worker_time) AS total_cpu_time, SUM(qs.execution_count) AS total_execution_count, SUM(qs.total_worker_time)/SUM(qs.execution_count) AS avg_cpu_time, COUNT(*) AS number_of_statements FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt GROUP BY qt.text ORDER BY total_cpu_time DESC --统计总的CPU时间 --ORDER BY avg_cpu_time DESC --统计平均单次查询CPU时间 -- 计算可运行状态下的工作进程数量 SELECT COUNT(*) as workers_waiting_for_cpu,s.scheduler_id FROM sys.dm_os_workers AS o INNER JOIN sys.dm_os_schedulers AS s ON o.scheduler_address=s.scheduler_address AND s.scheduler_id<255 WHERE o.state='RUNNABLE' GROUP BY s.scheduler_id

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值