1. SQL简介
SQL 是用于访问和处理数据库的标准的计算机语言。全称是 Structured Query Language。
2. mySql 的语法结构
https://www.runoob.com/sql/sql-top.html
3. 自我总结
基本功能语句
包括数据库的增删改查等操作。
3.1 创建表
CREATE TABLE 语句用于创建数据库中的表。
表由行和列组成,每个表都必须有个表名。
CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);
column_name 参数规定表中列的名称。
data_type 参数规定列的数据类型(例如 varchar、integer、decimal、date 等等)。
size 参数规定表中列的最大长度。
示例:
CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
PersonID 列的数据类型是 int,包含整数。
LastName、FirstName、Address 和 City 列的数据类型是 varchar,包含字符,且这些字段的最大长度为 255 个字符。
3.2 插入
INSERT INTO 语句用于向表中插入新记录。
- 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, country)
VALUES ('stackoverflow', 'http://stackoverflow.com/', 'IND');
3.3 查询
SELECT 语句用于从数据库中选取数据。结果被存储在一个结果表中,称为结果集。
SELECT column_name,column_name
FROM table_name;
与
SELECT * FROM table_name;
SELECT语句常见的限制条件
- SELECT DISTINCT
SELECT DISTINCT 语句用于返回唯一不同的值。
SELECT DISTINCT column_name,column_name
FROM table_name;
但是在数据量比较大的表中,不建议用distinct做不重复查找操作。可以用group By来代替。
- AND & OR
AND & OR 运算符用于基于一个以上的条件对记录进行过滤。
SELECT * FROM Websites
WHERE alexa > 15
AND (country='CN' OR country='USA');
- WHERE
WHERE 子句用于提取那些满足指定条件的记录。
SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;
- LIKE
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;
示例
SELECT * FROM Websites
WHERE name LIKE 'G%'; //查找以G开头的
SELECT * FROM Websites
WHERE name LIKE '%k'; //以k结尾的
SELECT * FROM Websites
WHERE name LIKE '%oo%'; //包含oo
- IN
IN 操作符允许您在 WHERE 子句中规定多个值。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
- BETWEEN
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
3.4 删除
DELETE 语句用于删除表中的行。
DELETE FROM table_name
WHERE some_column=some_value;
约束
SQL 约束用于规定表中的数据规则。
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
1. NOT NULL
- 指示某列不能存储 NULL 值。
2. UNIQUE
- 保证某列的每行必须有唯一的值。
3. PRIMARY KEY
- NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
4. FOREIGN KEY
- 保证一个表中的数据匹配另一个表中的值的参照完整性。
5. CHECK
- 保证列中的值符合指定的条件。
6. DEFAULT
- 规定没有给列赋值时的默认值。
连接
SQL join 用于把来自两个或多个表的行结合起来。
下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。
- INNER JOIN:如果表中有至少一个匹配,则返回行
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行
函数
SQL 拥有很多可用于计数和计算的内建函数
SQL Aggregate 函数
SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。
有用的 Aggregate 函数:
- AVG() - 返回平均值
- COUNT() - 返回行数
- FIRST() - 返回第一个记录的值
- LAST() - 返回最后一个记录的值
- MAX() - 返回最大值
- MIN() - 返回最小值
- SUM() - 返回总和
SQL Scalar 函数
SQL Scalar 函数基于输入值,返回一个单一的值。
面试常见问题总结
-
字节面试问题
-
招银网络科技
问:数据表livemark中mark_name字段出现10次以上的项输出
select mark_name ,COUNT(0) AS 重复数据 FROM livemark GROUP BY mark_name HAVING COUNT(mark_name)>10`在这里插入代码片`
剑指offer SQL 题目
1. 返回前几 或者第几的数据 limit
max()
min()
limit语法
SELECT * FROM table LIMIT m,n; // 检索记录从m+1行开始的n行
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
SELECT * FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。
max(),min()语法
max() min()用于返回某一列的最大值、最小值
SELECT MAX(column_name) FROM table_name
SELECT MIN(column_name) FROM table_name
- 题目:
- 获取当前薪水第二高的员工
select emp_no,salary from salaries order by salary desc limit 1,1
- 统计入职最晚的员工
select * from employees where hire_date = (select max(hire_date) from employees)
- 查找入职员工时间排名倒数第三的员工所有信息
select * from employees order by hire_date desc limit 2,1
2. 多表连接 A join B on A.col = B.col
三个表依次左连接,语法格式
select last_name,first_name,dept_name from employees as e left join dept_emp as d
on e.emp_no = d.emp_no left join departments as p on d.dept_no = p.dept_no
3. 次数 count(column_name)
- 题目
- 查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t
SELECT emp_no, COUNT(emp_no) AS t FROM salaries
GROUP BY emp_no HAVING t > 15
- 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
注意对于重复的emp_no进行忽略
select title ,count(DISTINCT emp_no) t from titles group by title having t>=2
4. 平均 avg()
- 题目
- 统计出当前(titles.to_date=‘9999-01-01’)各个title类型对应的员工当前(salaries.to_date=‘9999-01-01’)薪水对应的平均工资。结果给出title以及平均工资avg。
SELECT t.title,avg(s.salary)
FROM salaries as s INNER JOIN titles as t
ON s.emp_no = t.emp_no
AND s.to_date = '9999-01-01'
AND t.to_date = '9999-01-01'
GROUP BY title