数据库SQL语句学习

牛客练习网址

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 函数基于输入值,返回一个单一的值。

面试常见问题总结

  1. 字节面试问题

  2. 招银网络科技
    问:数据表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
  • 题目:
  1. 获取当前薪水第二高的员工
select emp_no,salary from salaries  order by salary desc limit 1,1
  1. 统计入职最晚的员工
select * from employees where hire_date = (select max(hire_date) from employees)
  1. 查找入职员工时间排名倒数第三的员工所有信息
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)

  • 题目
  1. 查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t
SELECT emp_no, COUNT(emp_no) AS t FROM salaries 
GROUP BY emp_no HAVING t > 15
  1. 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
    注意对于重复的emp_no进行忽略
select title ,count(DISTINCT emp_no) t from titles group by title  having t>=2

4. 平均 avg()

  • 题目
  1. 统计出当前(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值