B站滴滴和SQL


只写编程题!!!

0904B站

1、顺时针打印矩阵

剑指offer面试题29,每次从左上角开始,打印一个圈。首先判断可以继续循环打印的条件,先分析55的矩阵,最后一层是一个数字,对于66的矩阵,最后一层是一圈。所以条件是col>start*2 && row>start*2。接下来写循环打印的子函数。每一圈都是先从左到右,从上到下,从右到左,从下到上。但是需要分析打印每一步的具体条件,第一步都是必要的,第二步的前提条件是终止行号大于起始行号,第三步终止行号大于起始行号,终止列号大于起始列号,第四步终止行号比起始行号至少大2,同时终止列号大于起始列号。

2、0变1最长子串

和完美字符串套路一样,使用双指针。

3、字符碎片平均值

就是算,相等字符子串的长度,取个平均值。

0913滴滴

1、解码

输入密文翻转位数,带有空格的字符串
输出明文

2、连通岛

输入样例数,岛,桥,款,每一个桥的连通,以及花费
输出能否修成

0917JD

1、道具最大魅力

几种道具,总钱数
道具数量,价钱,魅力值!!!

2、查询是否联通

几个岛,几条路,几次询问
路两段
询问

SQL学习

一、基本语法

SQL 是用于访问和处理数据库的标准的计算机语言。指结构化查询语言。
SQL 对大小写不敏感:SELECT 与 select 是相同的。
在这里插入图片描述

1、一些命令
SELECT - 从数据库中提取数据
UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引

2、具体的
(1)SELECT 语句用于从数据库中选取数据。
SELECT column_name,column_name FROM table_name; //选取某一列
SELECT * FROM table_name; //选取所有列

(2)SELECT DISTINCT 语句用于返回唯一不同的值。
SELECT DISTINCT column_name,column_name FROM table_name;

(3)WHERE 子句用于过滤记录。
SELECT column_name,column_name FROM table_name WHERE column_name operator value;
例:SELECT * FROM Websites WHERE country=‘CN’;SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。
不等于 <> 或者 !=
BETWEEN 在某个范围内
LIKE 搜索某种模式
Like模糊查询
Select * from emp where ename like ‘M%’;
查询 EMP 表中 Ename 列中有 M 的值,M 为要查询内容中的模糊信息。

% 表示多个字值,_ 下划线表示一个字符;
M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
%M% : 表示查询包含M的所有内容。
%M_ : 表示查询以M在倒数第二位的所有内容。
IN 指定针对某个列的多个可能值
.空值判断: is null

(4)AND & OR 运算符用于基于一个以上的条件对记录进行过滤。
SELECT * FROM Websites
WHERE alexa > 15
AND (country=‘CN’ OR country=‘USA’);

(5)ORDER BY 关键字用于对结果集进行排序。
SELECT column_name,column_name FROM table_name
ORDER BY column_name,column_name ASC|DESC;
默认ASC升序排列。ORDER BY 多列的时候,先按照第一个column name排序,在按照第二个column name排序。

(6)INSERT INTO 语句用于向表中插入新记录。
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,…);

第二种形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,…)
VALUES (value1,value2,value3,…);

例子: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’);

(7)UPDATE 语句用于更新表中的记录。
UPDATE table_name
SET column1=value1,column2=value2,…
WHERE some_column=some_value;
例子:UPDATE Websites SET alexa=‘5000’, country=‘USA’ WHERE name=‘菜鸟教程’;
执行没有 WHERE 子句的 UPDATE 要慎重,再慎重。

(8)DELETE 语句用于删除表中的记录。
DELETE FROM table_name
WHERE some_column=some_value;
例子:DELETE FROM Websites WHERE name=‘Facebook’ AND country=‘USA’;
您可以在不删除表的情况下,删除表中所有的行。这意味着表结构、属性、索引将保持不变:DELETE FROM table_name;或DELETE * FROM table_name;

二、高级教程

1、SELECT TOP 子句用于规定要返回的记录的数目。
注意:并非所有的数据库系统都支持 SELECT TOP 语句。 MySQL 支持 LIMIT 语句来选取指定的条数数据, Oracle 可以使用 ROWNUM 来选取。
SELECT TOP number|percent column_name(s) FROM table_name;

2、LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern;
例子:SELECT * FROM Websites WHERE name LIKE ‘G%’;选取 name 以字母 “G” 开始的所有客户。
‘%k’ 以字母 “k” 结尾的所有客户;
‘%oo%’ 包含模式 “oo” 的所有客户;NOT LIKE ‘%oo%’

3、通配符
通配符可用于替代字符串中的任何其他字符。
% 替代 0 个或多个字符
_ 替代一个字符
[charlist] 字符列中的任何单一字符
[ ^ charlist] 或 [!charlist] 不在字符列中的任何单一字符
例子: WHERE name LIKE ‘_oogle’; name 以一个任意字符开始,然后是 “oogle” 的所有客户
WHERE name LIKE ‘G_o_le’; name 以 “G” 开始,然后是一个任意字符,然后是 “o”,然后是一个任意字符,然后是 “le” 的所有网站。
MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。
WHERE name REGEXP ’ ^ [GFs] '; name 以 “G”、“F” 或 “s” 开始的所有网站;
WHERE name REGEXP ’ ^ [A-H] '; name 以 A 到 H 字母开头的网站;
WHERE name REGEXP ’ ^ [ ^ A-H] '; name 不以 A 到 H 字母开头的网站;

4、IN 操作符允许在 WHERE 子句中规定多个值
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,…);
IN 与 = 的异同
相同点:均在WHERE中使用作为筛选条件之一、均是等于的含义
不同点:IN可以规定多个值,等于规定一个值

5、BETWEEN 操作符用于选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;
例子:SELECT * FROM Websites WHERE (alexa BETWEEN 1 AND 20) AND country NOT IN (‘USA’, ‘IND’);
在这里插入图片描述
WHERE date BETWEEN ‘2016-05-10’ AND ‘2016-05-14’; 选取 date 介于 ‘2016-05-10’ 和 ‘2016-05-14’ 之间的所有访问记录。

6、通过使用 SQL,可以为表名称或列名称指定别名。基本上,创建别名是为了让列名称的可读性更强。
SELECT column_name AS alias_name FROM table_name;
SELECT column_name(s) FROM table_name AS alias_name;
例子:SELECT name AS n, country AS c FROM Websites;
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info FROM Websites; 把三个列(url、alexa 和 country)结合在一起,并创建一个名为 “site_info” 的别名。
在这里插入图片描述
“Websites” 表中的 “id” 列指向 “access_log” 表中的字段 “site_id”。上面这两个表是通过 “site_id” 列联系起来的。
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=“菜鸟教程”;
在下面的情况下,使用别名很有用:
在查询中涉及超过一个表
在查询中使用了函数
列名称很长或者可读性差
需要把两个列或者多个列结合在一起

7、SQL join 用于把来自两个或多个表的行结合起来。
下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。
在这里插入图片描述
最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)。 SQL INNER JOIN 从多个表中返回满足 JOIN 条件的所有行。
例子:SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites INNER JOIN access_log ON Websites.id=access_log.site_id;
INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行

SQL INNER JOIN
SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name=table2.column_name;
或:SELECT column_name(s) FROM table1 JOIN table2 ON table1.column_name=table2.column_name;
INNER JOIN 与 JOIN 是相同的。
在这里插入图片描述
INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 “Websites” 表中的行在 “access_log” 中没有匹配,则不会列出这些行。

在使用 left jion 时,on 和 where 条件的区别如下:
1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

SQL LEFT JOIN
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name=table2.column_name;
或:SELECT column_name(s) FROM table1 LEFT OUTER JOIN table2 ON table1.column_name=table2.column_name;
在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。
在这里插入图片描述
SQL RIGHT JOIN
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name=table2.column_name;
或:SELECT column_name(s) FROM table1 RIGHT OUTER JOIN table2 ON table1.column_name=table2.column_name;
在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
在这里插入图片描述
RIGHT JOIN 关键字从右表(Websites)返回所有的行,即使左表(access_log)中没有匹配。

SQL FULL OUTER JOIN
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行。FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name=table2.column_name;
在这里插入图片描述

8、UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
例子:SELECT country, name FROM Websites WHERE country=‘CN’ UNION ALL SELECT country, app_name FROM apps WHERE country=‘CN’ ORDER BY country;

使用UNION命令时需要注意,只能在最后使用一个ORDER BY命令,是将两个查询结果合在一起之后,再进行排序!绝对不能写两个ORDER BY命令。
ORDER BY 除了可以对指定的字段进行排序,还可以使用函数进行排序:
order by abs(a);

ORDER BY 只能当前 SQL 查询结果进行排序,如要对 union all 出来的结果进行排序,需要先做集合。
select aa.* from
(select country,name from websites where country = ‘CN’
union all select country,app_name from apps where country=‘CN’ ) aa
order by aa.name;

9、通过 SQL,您可以从一个表复制信息到另一个表。
SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。

注意:MySQL 数据库不支持 SELECT … INTO 语句,但支持 INSERT INTO … SELECT 。当然你可以使用以下语句来拷贝表结构及数据:CREATE TABLE 新表AS SELECT * FROM 旧表 。

我们可以复制所有的列插入到新表中:SELECT * INTO newtable [IN externaldb] FROM table1;
或者只复制希望的列插入到新表中:SELECT column_name(s) INTO newtable [INexternaldb] FROM table1;

三、SQL函数

1、SQL Aggregate 函数
SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。
有用的 Aggregate 函数:
AVG() - 返回平均值
COUNT() - 返回行数
FIRST() - 返回第一个记录的值
LAST() - 返回最后一个记录的值
MAX() - 返回最大值
MIN() - 返回最小值
SUM() - 返回总和

SQL Scalar 函数
SQL Scalar 函数基于输入值,返回一个单一的值。
有用的 Scalar 函数:
UCASE() - 将某个字段转换为大写
LCASE() - 将某个字段转换为小写
MID() - 从某个文本字段提取字符,MySql 中使用
SubString(字段,1,end) - 从某个文本字段提取字符
LEN() - 返回某个文本字段的长度
ROUND() - 对某个数值字段进行指定小数位数的四舍五入
NOW() - 返回当前的系统日期和时间
FORMAT() - 格式化某个字段的显示方式

2、AVG() 函数返回数值列的平均值。
SELECT AVG(column_name) FROM table_name

3、COUNT() 函数返回匹配指定条件的行数。
SQL COUNT(column_name) 语法
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
SELECT COUNT(column_name) FROM table_name;

SQL COUNT() 语法
COUNT(
) 函数返回表中的记录数:
SELECT COUNT(*) FROM table_name;

SQL COUNT(DISTINCT column_name) 语法
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:
SELECT COUNT(DISTINCT column_name) FROM table_name;
注释:COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,但是无法用于 Microsoft Access。

– 查询websites 表中 alexa列中不为空的记录的条数
select count(alexa) from websites;

4、FIRST() 函数
FIRST() 函数返回指定的列中第一个记录的值。

SQL FIRST() 语法
SELECT FIRST(column_name) FROM table_name;
注释:只有 MS Access 支持 FIRST() 函数。

SQL Server 语法
SELECT TOP 1 column_name FROM table_name ORDER BY column_name ASC;
实例
SELECT TOP 1 name FROM Websites ORDER BY id ASC;

MySQL 语法
SELECT column_name FROM table_name ORDER BY column_name ASC LIMIT 1;
实例
SELECT name FROM Websites ORDER BY id ASC LIMIT 1;

5、LAST() 函数
LAST() 函数返回指定的列中最后一个记录的值。

SQL LAST() 语法
SELECT LAST(column_name) FROM table_name;
注释:只有 MS Access 支持 LAST() 函数。

SQL Server 语法
SELECT TOP 1 column_name FROM table_name ORDER BY column_name DESC;
实例
SELECT TOP 1 name FROM Websites ORDER BY id DESC;
MySQL 语法
SELECT column_name FROM table_name ORDER BY column_name DESC LIMIT 1;
实例
SELECT name FROM Websites ORDER BY id DESC LIMIT 1;

6、MAX() 函数
MAX() 函数返回指定列的最大值。

SQL MAX() 语法
SELECT MAX(column_name) FROM table_name;

7、MIN() 函数
MIN() 函数返回指定列的最小值。

SQL MIN() 语法
SELECT MIN(column_name) FROM table_name;

8、SUM() 函数
SUM() 函数返回数值列的总数。

SQL SUM() 语法
SELECT SUM(column_name) FROM table_name;

9、GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。

SQL GROUP BY 语法
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;

统计 access_log 各个 site_id 的访问量:
实例
SELECT site_id, SUM(access_log.count) AS nums FROM access_log GROUP BY site_id;

SQL GROUP BY 多表连接
下面的 SQL 语句统计有记录的网站的记录数量:
实例
SELECT Websites.name,COUNT(access_log.aid) AS nums FROM access_log LEFT JOIN Websites ON access_log.site_id=Websites.id GROUP BY Websites.name;

10、HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。

SQL HAVING 语法
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value;

现在我们想要查找总访问量大于 200 的网站。
实例
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;

11、EXISTS 运算符
EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。

SQL EXISTS 语法
SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM table_name WHERE condition);
EXISTS 可以与 NOT 一同使用,查找出不符合查询语句的记录。

12、UCASE() 函数
UCASE() 函数把字段的值转换为大写。
SQL UCASE() 语法
SELECT UCASE(column_name) FROM table_name;
用于 SQL Server 的语法
SELECT UPPER(column_name) FROM table_name;

13、LCASE() 函数
LCASE() 函数把字段的值转换为小写。
SQL LCASE() 语法
SELECT LCASE(column_name) FROM table_name;
用于 SQL Server 的语法
SELECT LOWER(column_name) FROM table_name;

14、MID() 函数
MID() 函数用于从文本字段中提取字符。

SQL MID() 语法
SELECT MID(column_name,start[,length]) FROM table_name;

参数 描述
column_name 必需。要提取字符的字段。
start 必需。规定开始位置(起始值是 1)。
length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。

15、LEN() 函数
LEN() 函数返回文本字段中值的长度。
SQL LEN() 语法
SELECT LEN(column_name) FROM table_name;

MySQL 中函数为 LENGTH():
SELECT LENGTH(column_name) FROM table_name;

16、ROUND() 函数
ROUND() 函数用于把数值字段舍入为指定的小数位数。
SQL ROUND() 语法
SELECT ROUND(column_name,decimals) FROM table_name;

参数 描述
column_name 必需。要舍入的字段。
decimals 必需。规定要返回的小数位数。

17、NOW() 函数
NOW() 函数返回当前系统的日期和时间。

SQL NOW() 语法
SELECT NOW() FROM table_name;

18、FORMAT() 函数
FORMAT() 函数用于对字段的显示进行格式化。
SQL FORMAT() 语法
SELECT FORMAT(column_name,format) FROM table_name;

参数 描述
column_name 必需。要格式化的字段。
format 必需。规定格式。

下面的 SQL 语句从 “Websites” 表中选取 name, url 以及格式化为 YYYY-MM-DD 的日期:SELECT name, url, DATE_FORMAT(Now(),’%Y-%m-%d’) AS date FROM Websites;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值