当前位置: 移动技术网 > IT编程>数据库>MSSQL > SQL 笔记

SQL 笔记

2020年07月18日  | 移动技术网IT编程  | 我要评论

笔记摘自廖雪峰官网的SQL教程。详情请访问 SQL教程-廖雪峰的官方网站。网站提供了在线运行SQL的功能。

查询

1. 基本查询

语法:SELECT * FROM <表名>;
eg:SELECT * FROM students;

2. 条件查询

语法:SELECT * FROM <表名> WHERE <条件表达式>;
举例 => SELECT * FROM students WHERE score >=90;

 1. 条件表达式
	条件表达式里面可以有多个分支条件,对于条件1、条件2等,可以用 AND、OR、NOT 来修饰。用法:
	<条件1> AND <条件2>
	<条件1> OR <条件2>
	NOT <条件1> 

 2. 不相等,<>
	score <> 80
	name <> 'abc' 

 3. 相似 LIKE
	name LIKE 'ab%'
	name LIKE '%bc%'
 
 4. 区间 BETWEEN
	查询分数在60分(含)~90分(含)之间的学生可以使用的WHERE语句:
	=> WHERE score >= 60 AND score <= 90
	=> WHERE score BETWEEN 60 AND 90
 
  5. 查询结果重命名
	SELECT 列名1 别名1, 列名2 别名2, 列名3 别名3 FROM ...

3. 投影查询

SELECT 列1, 列2, 列3 FROM...
仅返回指定的列,即投影. 

4. 排序

+ 使用 ORDER BY 列名 规则, 放在<条件表达式>后面;
+ 默认的排序规则是 ASC, 即"升序",从小到大. ASC可以省略; 
+ 如果要 从大到小, 可以添加条件 DESC, 即"倒序";
+ 当数据相同时需要进一步排序,可以再ORDER BY 列名1 后面继续添加列名2,如:  ORDER BY score
	 DESC,gender, 即先按照 score 倒序排列,相同分数的按照 gender 排序;
+ 举例:查询一班同学的分数,按照分数倒序(高->低),性别排序
	=>SELECT id,name,gender,score FROM students WHERE class_id = 1 ORDER BY score 
	DESC, gender;

5. 分页查询

 1. 用法: LIMIT <M> OFFSET <N>, 每页M条数据,查询当前搜素结果集的第N个记录.
 2. 若结果集有s条记录,则N取值范围是 [0, s-1],超出范围则查询结果为空.
 3. 举例: 
	=> SELECT id,name,gender,score FROM students ORDER BY score DESC LIMIT 3 OFFSET 9;

6. 聚合查询

 1. 聚合函数
	COUNT() 计数
	SUM() 某列求和
	AVG() 某列求平均值
	MAX() 列最大值
	MIN() 列最小值
 2. 分组查询
	GROUP BY 列名1, 列名2, ...;
 3. 举例
	=>统计各班男女生人数:
		SELECT class_id, gender, COUNT(*) num FROM students GROUP BY class_id, gender;
	=>查询各班级平均分:
		SELECT class_id, AVG(score) point FROM students GROUP BY calss_id;
	=>查询每个班级男生和女生的平均分、最高分:
		SELECT class_id, gender, AVG(score) avg_score, MAX(score) max_score FROM students 
		GROUP BY class_id, gender ORDER BY class_id, gender;

7. 多表查询

SELECT * FROM <表1> <别名1>,<表2> <别名2>...
	=> SELECT s.id sid, s.name, s.gender, s.score, c.id cid, c.name cname FROM 
	students s,classes c WHERE s.gender = 'M' AND c.id = 1;

8. 连接查询

 1. JION: 先确定一张主表为结结果集,然后将其他表有选择地"连接"在主表的结果集上.
 2. SELECT ... FROM tableA 
	(INNER)/ LEFT OUTER/ RIGHT OUTER/ FULL OUTER JION tableB 
	ON tableA.column1 = tableB.column2;
	=>  SELECT s.id, s.name, s.class_id, c.name class_name, s.gender 
		FROM students s 
		RIGHT OUTER JOIN classes c 
		ON s.class_id = c.id;

内连外连(INNER)/ LEFT OUTER/ RIGHT OUTER/ FULL OUTER JION 的区别见
连接查询.

修改

插入增加 INSERT

 -  语法: INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);
 -  字段即待插入表的列名. 如果一个字段有默认值, 则在 INSERT 语句中可以省略;
 -  可以一次性添加多条记录, 在 VALUES 子句中指定多个记录值.
	=> INSERT INTO students (class_id, name, gender, score) VALUES (2, '大宝', 'M', 87), (3, '二宝', 'F', 81);

更新 UPDATE

 -  语法: UPDATE <表名> SET 字段1 = 值1, 字段2 = 值2, ... WHERE...;
 -  最好先 SELECT 出要修改的结果集, 再进行 UPDATE;
 -  不加 WHERE 语句的话, UPDATE 会对整张表进行更新;
	=> UPDATE students SET name='小牛', score = score+10 WHERE id>=5 AND id<=7;
	=> UPDATE students SET score=60;

删除 DELETE

 -  语法: DELETE FROM <表名> WHERE ...;
 -  不带WHERE条件的DELETE语句会删除整个表的数据;
	=> DELETE FROM students WHERE id>=5 AND id<=7;

数据库管理

 - 一个数据库 database 里面存放多张数据表 table ;
 - 列出服务器上所有的数据库: SHOW DATABASES;
 - 创建新数据库: CREATE DATABASE test;
 - 删除数据库: DROP DATABASE test;
 - 对一个数据库进行操作, 需要先选中该数据库: USE test;

 - 列出当前数据库的所有表: SHOW TABLES;
 - 查看一个表的结构: DESC students;
 - 查看创建表的SQL语句: SHOW CREATE TABLE students;
 - 创建表: (示例)
		CREATE TABLE `students` (                             
             `id` bigint(20) NOT NULL AUTO_INCREMENT,            
             `class_id` bigint(20) NOT NULL,                     
             `name` varchar(100) NOT NULL,                       
             `gender` varchar(1) NOT NULL,                       
             `score` int(11) NOT NULL,                           
             PRIMARY KEY (`id`)                                  
           ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 
 - 删除表: DROP TABLE students;
 - 新增一列: 如果要给students表新增一列 birth.
		=> ALTER TABLE students ADD COLUMN birth VARCHAR(10) NOT NULL;
 - 修改列: 把列名改为 birthday ,类型改为VARCHAR(20).
		=> ALTER TABLE students CHANGE COLUMN birth birthday VARCHAR(20) NOT NULL;
 - 删除列: ALTER TABLE students DROP COLUMN birthday;

实用 SQL 语句

详情查阅实用 SQL 语句.

 - 插入或替换
	REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
 - 插入或更新
	INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99) ON DUPLICATE KEY UPDATE name='小明', gender='F', score=99;
 - 插入或忽略
	INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
 - 快照
	CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1;
 - 写入查询结果集
	INSERT INTO statistics (class_id, average) SELECT class_id, AVG(score) FROM students GROUP BY class_id;

事务

 - 定义: 多条语句作为一个整体进行操作的功能,被称为数据库事务;
 - 隐式事务: 对于单条SQL语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务;
 - 显式事务: 要手动把多条SQL语句作为一个事务执行,使用BEGIN开启一个事务,使用COMMIT提交一个事务,这种事务被称为显式事务;
	BEGIN;
	UPDATE accounts SET balance = balance - 100 WHERE id = 1;
	UPDATE accounts SET balance = balance + 100 WHERE id = 2;
	COMMIT;
 - 回滚: 用ROLLBACK回滚事务,主动让事务失败.
	BEGIN;
	UPDATE accounts SET balance = balance - 100 WHERE id = 1;
	UPDATE accounts SET balance = balance + 100 WHERE id = 2;
	ROLLBACK;

隔离级别

对于两个并发执行的事务,如果涉及到操作同一条记录的时候,可能会发生问题。因为并发操作会带来数据的不一致性,包括脏读、不可重复读、幻读等。数据库系统提供了隔离级别来让我们有针对性地选择事务的隔离级别,避免数据不一致的问题。
SQL标准定义了4种隔离级别,分别对应可能出现的数据不一致的情况:
隔离级别(Isolation Level ) 脏读(Dirty Read) 不可重复读(Non Repeatable Read) Read) 幻读(Phantom Read)
Read Uncommitted Yes Yes Yes
Read Committed - Yes Yes
Repeatable Read - - Yes
Serializable - - -

详情见隔离级别

索引

详情见索引强制使用指定索引

本文地址:https://blog.csdn.net/River_in_mind/article/details/107401486

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网