sql笔记

1、数据库

1、 数据库概念

​ 数据库是存储的数据的集合,为了方便我们进行数据的管理,使用数据库管理系统程序。

2、数据库分为关系(relational)型数据库和非关系(NoSql)型数据库

​ 关系型数据库中我们将使用关系相互连接的表称为关系数据库

​ Mysql、SQL server、oracle标准规范是SQL规范。所以大部分SQL是一样的,如今最受欢迎的是MySQL(因为:免费、开源)。

非关系数据库:他们没有表格或关系。不懂SQL他们有自己的查询语言。

3、SQL历史

​ SQL最初是在IBM开发,70年代成为SEQUEL(Structrred English Query Language)

2、实操

1、表字段的设计

	ID用于唯一标识。

​ 我们在订单表(另一个表)使用用户的ID,通过用户ID查询用户的信息,而不是把用户信息也放一份到订单表中,用户信息修改后查询的还是用户的正确信息,能防止信息的错误。

3、检索即查询信息

USE sql_store;

SELECT *
FROM customers
WHERE customer_id = 1
ORDER BY first_name

使用库,做选择、从哪里、设过滤、搞排序

USE , SELECT , FROM , WHERE , ORDER BY

4、探讨SELECT语句

1、查询的字段值为数字,可以进行基本的运算(加减乘除)

​ SELECT 后填写的字段(行名),查询出来就先显示哪一行。数字的字段(行)可以进行基本的运算。

2、规范写法:

SELECT 
    last_name,
    first_name,
    points,
    points * 10 +100
FROM customers

3、设置别名(AS),‘’ :单引号表示你想要的会将内容原封不动提交。

AS 后填写别名,单引号表示你想要的,会原封不动提交内容给程序。

4、去重复 DISTINCT

​ 通过使用distinct 去掉重复的内容。

5、学习WHERE

sql语句中大小写不区分,即使的是单引号中也不区分。

1、用等于设置条件

​ 过滤,进行条件判断:state字段内容等于VA

2、用大于、小于、等于符号设置条件

字段名必须正确,包括“—“也要写上,否则报错

SELECT *
FROM customers
WHERE birth_date > '1990-01-01';

3、多条件使用 and or

SELECT * 
FrOM customers
WHERE birth_data > "1990-01-01" or 
	  (points > 1000 and state = 'VA')

4、相反使用 NOT

​ 一开始查出1,3,而使用NOT相反条件后查出2,4

SELECT *
FROM customers
WHERE NOT (birth_date > '1990-01-01' or points > 1000)

5、在...之间:BETWEEN - AND(包含端点)

SELECT *
FROM customers
WHERE birth_data BETWEEN '1990-01-01' AND '2000-01-01';

6、like 相似

目的:找出顾客表,要求输出地址包含TEAIL或AVENUE的顾客记录

SELECT *
FROM customers
WHERE address LIKE '%TEAIL%' OR 
	  address LIKE '%AVENUE%'
	  
-- % any number of characters
-- _ single character

符号的作用: 占位符 % 表示任意长度的字母, _ 表示一个字母。

7、正则表达 REGEXP

目的:查找顾客表,要求输出

​ 1、姓名ELKA或AMBUR的顾客

​ 2、名以EY或ON结尾的顾客

​ 3、名以MY开头并且包含SE顾客

​ 4、名中包含B,且B之后是R或U(多行输出卸载注解里)

SELECT * 
FROM customers
WHERE first_name REGEXP 'elka|ambur'
-- WHERE last_nam REGEXP 'ey$|on$'
-- WHERE last_name REGEXP '^my|se'
-- WHERE last_name REGEXP 'b[ru]'

-- ^ beginning
-- $ end
-- | logical or
-- [abcd]
-- [a-h]

6、面试题

SQL语句的排列顺序:

SELECT -- 选择显示的字段
FROM  -- 从哪张表中获取
WHERE  -- 过滤的条件
GROUP BY  -- 分组,提出的字段内容去重复
HAVING -- 等到结果后再次过滤
ORDER BY  -- 顺序
LIMIT  -- 显示的数据,从哪条开始,显示多少条

1、GROUP BY 分组

SELECT 
	name,
	grade,
	count(*),
	sum(salary),
	avg(salary),
	max(salary),
	min(salary)
FROM student
GROUP BY name;

7、面试实操

学习来源:https://zhuanlan.zhihu.com/p/70896731

1.学生表
Student(SId,Sname,Sage,Ssex)

SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别

create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-12-20' , '男');
insert into Student values('04' , '李云' , '1990-12-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-01-01' , '女');
insert into Student values('07' , '郑竹' , '1989-01-01' , '女');
insert into Student values('09' , '张三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2012-06-06' , '女');
insert into Student values('12' , '赵六' , '2013-06-13' , '女');
insert into Student values('13' , '孙七' , '2014-06-01' , '女');

2.课程表
Course(CId,Cname,TId)
CId 课程编号,Cname 课程名称,TId 教师编号

create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');

3.教师表
Teacher(TId,Tname)
TId 教师编号,Tname 教师姓名

create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');

4.成绩表
SC(SId,CId,score)
SId 学生编号,CId 课程编号,score 分数

create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);

数据库表分析

学生表(student):SId,Sname,Sage,Ssex

课程表(Course):CId,Cname,TId(教师编号)

教师表(Teacher):TId,Tname

成绩表(SC):SId, CId, score

1、查询“01”课程比“02”课程成绩高的学生的信息及课程分数

方法一:

-- 查询出 01 课程所有学生的成绩
SELECT *
FROM sc
WHERE cid = '01';

-- 查询出课程“02”所有学生的成绩
SELECT *
FROM sc
WHERE cid = '02';

-- 此处注意,from后填的表可以有两张表,将两张表连接在一起
SELECT * 
FROM (SELECT *
	FROM sc
	WHERE cid = '01') AS a,
	(SELECT *
	FROM sc
	WHERE cid = '02') AS b;

-- 此处注意,from后填的表可以有两张表,将两张表连接在一起
SELECT * 
FROM (SELECT *
	FROM sc
	WHERE cid = '01') AS a,
	(SELECT *
	FROM sc
	WHERE cid = '02') AS b
WHERE 
	a.sid = b.sid AND -- 成绩对比前提是同一个学生
	a.score > b.score; -- 对比成绩

--  有了新表取出需要的列
SELECT a.sid,a.score as class1,b.score as class2
FROM (SELECT *
	FROM sc
	WHERE cid = '01') AS a,
	(SELECT *
	FROM sc
	WHERE cid = '02') AS b
WHERE 
	a.sid = b.sid AND -- 成绩对比前提是同一个学生
	a.score > b.score; -- 对比成绩

JOIN

查询中右并联,某个表用:

SELECT *
FROM table1 
	RIGHT JOIN 
		table2 
	ON 
		table1.id = table2.id;

-- 即表示显示table1表后,在右边接上table2的内容,连接条件是 table1.id =table2.id
--  最后一步,题目是要求学生信息以及课程成绩
SELECT *
FROM student
		RIGHT JOIN
			(SELECT a.sid,a.score as class1,b.score as class2
			FROM (SELECT *
				FROM sc
				WHERE cid = '01') AS a,
				(SELECT *
				FROM sc
				WHERE cid = '02') AS b
			WHERE 
				a.sid = b.sid AND -- 成绩对比前提是同一个学生
				a.score > b.score) AS t1
			ON student.sid = t1.sid;

方法二

SELECT *
FROM student 
	RIGHT JOIN
		 (SELECT s1.sid,s1.score AS score01,s2.score AS score02 
			FROM sc AS s1
				JOIN sc AS s2
				ON s1.sid = s2.sid  -- 并联条件是sid相等
			WHERE s1.cid = '01' AND  -- 过滤条件,每一行中要符合条件 s1.cid = '01'
				s2.cid ='02' AND       -- 每一行中要符合条件 s2.cid = '02'
				s1.score > s2.score) AS t1 -- 每一行中要符合条件 s1.score > s2.score
		ON t1.sid = student.sid;     -- 过滤条件每一行中,要符合条件:student.sid = t.sid 

2、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

-- 按学号分组,查询出每个学生的平均成绩
SELECT sid,AVG(score)
FROM sc
GROUP BY sid
HAVING AVG(score) >= 60;
-- 查找平均成绩大于等于60的学生相关信息
SELECT t1.*,s1.sname -- t1.* 表示t1的所有字段,加上s1表的sname字段
FROM student s1
	RIGHT JOIN
		(SELECT sid,AVG(score)
		 FROM sc
		 GROUP BY SId
		 HAVING AVG(score) >= 60) AS t1
	ON t1.sid = s1.sid;

8、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 table_name (column1,column2,..)
VALUES 
	(value1,value2,...),
	(value1,value2,...),
	(value1,value2,...);

实操:

INSERT INTO student (Sid,Sname,Sage,Ssex)
VALUES 
	(14,'zhou','1997-09-10','男'),
	(15,'yong','1998-01-10','男'),
	(16,'fan','1998-05-25','女');

9、update

update语句用于修改表中已存在的记录

UPDATE table_name
SET 
	column1 = value1,
	column2 = value2,
	column3 = value3
WHERE condition; -- 过滤条件比如 id = 3

实操:

UPDATE student
SET
	SId = 11,
  Sname = 'zhou',
  Sage = '2020-07-26',
	Ssex = '男'
WHERE SId = 1;

10、DELETE

DELETE语句用于删除表中记录

语法如下:

DELETE FROM table_name 
WHERE condition; -- 条件如:id =3

11、limit

​ limit语句主要是显示部分数据,

select * 
FROM student
-- HAVING sid > 5;
limit 5,3; -- 从第6个数据开始,显示后续的三个数据
原文地址:https://www.cnblogs.com/zhouyongyin/p/13381222.html