美文网首页
SQL:Structured Query Language

SQL:Structured Query Language

作者: 涛涛抄书 | 来源:发表于2022-01-18 11:34 被阅读0次

速查语法

查询

实用语句:https://www.liaoxuefeng.com/wiki/1177760294764384/1246617682185952

常规查询

  • SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM students(表) WHERE(后跟条件) score >= 80
    可以加上DESC表示“倒序”:
SELECT id, name, gender, score
FROM students
WHERE class_id = 1
ORDER BY score DESC;
LIMIT <N-M> OFFSET <M>

条件运算:按照NOT、AND、OR的优先级进行,即NOT优先级最高,其次是AND,最后是OR。加上括号可以改变优先级。

分页查询:确定每页需要显示的结果数量pageSize(这里是3),然后根据当前页的索引pageIndex(从1开始),确定LIMIT和OFFSET应该设定的值: LIMIT总是设定为pageSize;OFFSET计算公式为pageSize * (pageIndex - 1)。

条件表达式(字符串需要使用单引号引起来)
=:判断相等
>:判断大于
>=:判断大于或相等
<:判断小于
<=:判断小于或相等
<>:判断不相等
LIKE:判断相似
BETWEEN XX AND XX:数值范围
IN (60, 90):表示在括号内的值,此处只有60和90

聚合查询

  • COUNT(*)
  • SUM()
  • AVG()
  • MAX()
  • MIN()
查询数量
SELECT COUNT(*) FROM students;
其他方法
SELECT AVG(score) average FROM students WHERE gender = 'M';

分组查询

  • GROUP BY
SELECT class_id, gender, COUNT(*) num FROM students GROUP BY class_id, gender;

多表查询

乘积,中间使用逗号分开
  • 慎用,会生成一个很大的表格,100*100=10000
  • 查询的时候不能直接使用别名,可用c.id,不能用cid
  • 使用别名不是必须的,但可以更好地简化查询语句
SELECT
    s.id sid,
    s.name,
    s.gender,
    s.score,
    c.id cid,
    c.name cname
FROM students s, classes c
WHERE c.id = 1;
连接查询
  • INNER JOIN:只返回同时存在于两张表的行数据
  • RIGHT OUTER JOIN:返回右表都存在的行
  • LEFT OUTER JOIN:返回左表都存在的行
  • FULL OUTER JOIN:把两张表的所有记录全部选择出来
    先确定主表,仍然使用FROM <表1>的语法;
    再确定需要连接的表,使用INNER JOIN <表2>的语法;
    然后确定连接条件,使用ON <条件...>,这里的条件是s.class_id = c.id,表示students表的class_id列与classes表的id列相同的行需要连接;
    可选:加上WHERE子句、ORDER BY等子句。
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;

增、删、改

  • INSERT:插入新记录;
    INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);
  • UPDATE:更新已有记录;
    UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...;
  • DELETE:删除已有记录。
    DELETE FROM <表名> WHERE ...;
  • 没有选中不会报错(mysql会有提示),如果没有加WHERE会更新整表,高风险操作
INSERT INTO students (class_id, name, gender, score) VALUES
  (1, '大宝', 'M', 87),
  (2, '二宝', 'M', 81);
UPDATE students SET name='小牛', score=77 WHERE id>=5 AND id<=7;
DELETE FROM students WHERE id>=5 AND id<=7;

MySQL

登录

  • mysql -u root -p:
  • SHOW DATABASES:显示数据库
    nformation_schema、mysql、performance_schema和sys是系统库,不要去改动它们。
  • CREATE DATABASE test;
  • DROP DATABASE test;
  • USE test;
  • SHOW TABLES;
  • DESC students; 查看表结构
  • SHOW CREATE TABLE students;查看创建表的SQL语句
  • DROP TABLE students;
  • ALTER TABLE students ADD COLUMN birth VARCHAR(10) NOT NULL;新增一列
  • ALTER TABLE students CHANGE COLUMN birth birthday VARCHAR(20) NOT NULL;要修改birth列,例如把列名改为birthday,类型改为VARCHAR(20):
  • ALTER TABLE students DROP COLUMN birthday;
  • exit

其他

  • 不带from可以直接进行运算,一般会通过SELECT 1;来判断是否正常连接到数据库
  • 通常情况下,字段应该避免允许为NULL。不允许为NULL可以简化查询条件,加快查询速度,也利于应用程序读取数据后无需判断是否为NULL。
  • 身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。作为主键最好是完全业务无关的字段,我们一般把这个字段命名为id,可以使用自增整数类型或全局唯一GUID类型(一般程序可生成)

数据类型

名称 类型 说明
INT 整型 4字节整数类型,范围约+/-21亿
BIGINT 长整型 8字节整数类型,范围约+/-922亿亿
REAL 浮点型 4字节浮点数,范围约+/-1038
DOUBLE 浮点型 8字节浮点数,范围约+/-10308
DECIMAL(M,N) 高精度小数 由用户指定精度的小数,例如,DECIMAL(20,10)表示一共20位,其中小数10位,通常用于财务计算
CHAR(N) 定长字符串 存储指定长度的字符串,例如,CHAR(100)总是存储100个字符的字符串
VARCHAR(N) 变长字符串 存储可变长度的字符串,例如,VARCHAR(100)可以存储0~100个字符的字符串
BOOLEAN 布尔类型 存储True或者False
DATE 日期类型 存储日期,例如,2018-06-22
TIME 时间类型 存储时间,例如,12:20:59
DATETIME 日期和时间类型 存储日期+时间,例如,2018-06-22 12:20:59

键与索引

外键:通过定义外键约束实现,会降低性能,一般通过程序保证正确,不设置外键约束

添加:
ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);
删除:(并没有删除外键列)
ALTER TABLE students
DROP FOREIGN KEY fk_class_id;

索引:索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。
索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。

创建索引:
ALTER TABLE students
ADD INDEX idx_score (name,score);
创建唯一索引:
ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);
创建唯一约束不创建索引:
ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);

事务

在执行SQL语句的时候,某些业务要求,一系列操作必须全部执行,而不能仅执行一部分。

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
主动让事务失败:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
ROLLBACK;

搬运自

廖雪峰的官方网站:https://www.liaoxuefeng.com/

相关文章

网友评论

      本文标题:SQL:Structured Query Language

      本文链接:https://www.haomeiwen.com/subject/kafkcrtx.html