SQL

143 阅读5分钟

SQL 通用数据类型

数据类型描述
CHARACTER(n)字符/字符串。固定长度 n。
VARCHAR(n) 或 CHARACTER VARYING(n)字符/字符串。可变长度。最大长度 n。
BINARY(n)二进制串。固定长度 n。
BOOLEAN存储 TRUE 或 FALSE 值
VARBINARY(n) 或 BINARY VARYING(n)二进制串。可变长度。最大长度 n。
INTEGER(p)整数值(没有小数点)。精度 p。
SMALLINT整数值(没有小数点)。精度 5。
INTEGER整数值(没有小数点)。精度 10。
BIGINT整数值(没有小数点)。精度 19。
DECIMAL(p,s)精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数,小数点后有 2 位数的数字。
NUMERIC(p,s)精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同)
FLOAT(p)近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。
REAL近似数值,尾数精度 7。
FLOAT近似数值,尾数精度 16。
DOUBLE PRECISION近似数值,尾数精度 16。
DATE存储年、月、日的值。
TIME存储小时、分、秒的值。
TIMESTAMP存储年、月、日、小时、分、秒的值。
INTERVAL由一些整数字段组成,代表一段时间,取决于区间的类型。
ARRAY元素的固定长度的有序集合
MULTISET元素的可变长度的无序集合
XML存储 XML 数据

SQL 约束

  • NOT NULL - 指示某列不能存储 NULL 值。
  • UNIQUE - 保证某列的每行必须有唯一的值。
  • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
  • CHECK - 保证列中的值符合指定的条件。
  • DEFAULT - 规定没有给列赋值时的默认值。

sql语句里面的<>、!=以及=、like有哪些区别

<> != 都是用于不等判断。<> 这个是最早的用法。!=是后来才加上的。两者意义相同,在可移植性上前者优于后者

,故而sql语句中尽量使用<>来做不等判断

like用于模糊查询,=用于精准查询

创建数据库
CREATE DATABASE `database`;
查看数据库
SHOW DATABASES;
删除数据库
DROP DTABASE `sql_tutorial`;

image.png

选择数据库
USE `sql_tutorial`;
建表
CREATE TABLE `student`(
    // 数据类型为int,且设置主键
    `student_id` INT PRIMARY KEY,
    // 数据类型为最大20位的字符串
    `name` VARCHAR(20),
    `major` VARCHAR(20),
);
或者
CREATE TABLE `student`(
    `student_id` INT,
    `name` VARCHAR(20),
    `major` VARCHAR(20),
    PRIMARY KEY(`student_id`)
);
列出指定表或视图中的所有列
DESCRIBE `student`;

// ALTER TABLE 语句用于在已有的表中添加、删除或修改列
ALTER TABLE `student` ADD gpa DECIMAL(3,2);
ALTER TABLE `student` DROP COLUMN gpa;
// INSERT INTO 语句用于向表中插入新记录。
INSERT INTO `student` VALUES(1,'小白','历史')
INSERT INTO `student` VALUES(2,'小黑','生物')
INSERT INTO `student` VALUES(3,'小绿',NULL)
INSERT INTO `student`(`name`,`major`, `student_id`) VALUES('小蓝',NULL4)
INSERT INTO `student`(`major`, `student_id`) VALUES('英语'5)

CREATE TABLE `student`(
    `student_id` INT,
    `name` VARCHAR(20),
    // 给个默认值
    `major` VARCHAR(20) DEFAULT '历史',
    PRIMARY KEY(`student_id`)
);

于从数据库中选取数据
SELECT * FROM `student`;

image.png

获取资料
// 查询学科是英语或分数不等于70的数据的按照分数从低到高前3条数据
SELECT *
FROM `student`
WHERE `major` = '英语' OR `score` <> 70
ORDER BY `score`
LIMIT 3;
// 查询学科是英语或历史的数据的按照分数从低到高前3条数据
SELECT *
FROM `student`
WHERE `major` IN('历史', '英语')
ORDER BY `score`
LIMIT 3;
限制约束
CREATE TABLE `student`(
    //自增1
    `student_id` INT AUTO_INCREMENT,
    `name` VARCHAR(20),
    `major` VARCHAR(20),
    PRIMARY KEY(`student_id`)
);
更新修改
UPDATE `student`
SET `major` = '生化'
WHERE `major` = '生物' OR `major` = '生物';
设置外键
CREATE TABLE `branch`(
    // 数据类型为int,且设置主键
    `branch_id` INT PRIMARY KEY,
    // 数据类型为最大20位的字符串
    `branch_name` VARCHAR(20),
    `manager_id` INT,
    // 设置manager_id为外键,REFERENCES 外键依赖的表 ,--删除的时候置为null(如果是 ON DELETE CASCADE指当删除主表中被引用列的数据时,级联删除子表中相应的数据行)
    FOREIGN KEY (`manager_id`) REFERENCES `employee`(`emp_id`) ON DELETE SET NULL
);

image.png

SQL 函数


SQL 拥有很多可用于计数和计算的内建函数。


SQL Aggregate 函数

SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。

有用的 Aggregate 函数:

  • AVG() - 返回平均值
  • COUNT() - 返回行数
  • FIRST() - 返回第一个记录的值
  • LAST() - 返回最后一个记录的值
  • MAX() - 返回最大值
  • MIN() - 返回最小值
  • SUM() - 返回总和

SQL Scalar 函数

SQL Scalar 函数基于输入值,返回一个单一的值。

有用的 Scalar 函数:

  • UCASE() - 将某个字段转换为大写
  • LCASE() - 将某个字段转换为小写
  • MID() - 从某个文本字段提取字符,MySql 中使用
  • SubString(字段,1,end) - 从某个文本字段提取字符
  • LEN() - 返回某个文本字段的长度
  • ROUND() - 对某个数值字段进行指定小数位数的四舍五入
  • NOW() - 返回当前的系统日期和时间
  • FORMAT() - 格式化某个字段的显示方式
获取所有员工的平均薪水
SELECT avg(`salary`) FROM `employee`;
取得所有员工薪水总和
SELECT sum(`salary`) FROM `employee`;

union和unionAll


员工薪水union销售金额(union,合并两个或多个 SELECT 语句的结果集(去重相同的数据),unionall合并两个或多个 SELECT 语句的结果集(不去重相同的数据))
SELECT `salary` AS `total_money`;
FROM `employee`
UNION
SELECT `total_sales`
FROM `employee`

员工id + 员工名字  union 客户id + 客户名字
SELECT `emp_id` AS `total_id`, `name` AS `total_name`;
FROM `employee`
UNION
SELECT `client_id`, `client_name`
FROM `client`

image.png

join连接

image.png

找出研发部门经理的名字
SELECT `name` from `employee` WHERE `emp_id` = (
  SELECT `manager_id` FROM `branch` WHERE `manager_name` = '研发'
)
获取所有人员及其对应的部门
SELECT `employee`.`emp_id`,`employee`.`name`,`branch`.`branch_name`
FROM `employee` LEFT JOIN `branch`
ON `employee`.`emp_id` = `branch`.`manager_id`

image.png