SQL的介绍
SQL的定义:结构化查询语句
SQL的作用:对库和表进行操作
SQL的常用分类
- DDL 数据定义语言(Data Definition Language)
- DCL 数据控制语言(Data Control Language)
- DML 数据操作语言(Data Manipulation Language )
- DQL 数据查询语言(Data Query Language)
表的核心属性介绍
列的属性
数据类型
## 数值类型
- tinyint 极小整数数据类型(0-255)
- INT 常规大小的整数数据类型
## 字符类型
- CHAR 固定长度字符串、最多为255个字符
- VARCHAR 可变长度字符串、最多为65535个字符
- ENUM 有一个固定的合法值组成的枚举(相当组成个选项列表)
- 时间类型
- DATETIME 范围从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
- TIMESTAMP 范围从 1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
注意:TIMESAMP会受到时区的影响
## 二进制类型
一般不使用(MYSQL不适合存储图片,视频等)
neo4J 专门用来做图片视频的存储
约束((一般建表时添加))
primary key #主键约束
设置为主键的列,此列的值必须非空且唯一,主键在一个表中只能有一个,但是可以有多个列一起构成。
not null #非空约束
列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0
unique key #唯一键
列值不能重复
其他属性
unsigned #无符号
针对数字列,非负数。
key #索引
可以在某列上建立索引,来优化查询,一般是根据需要后添加
default #默认值
列中,没有录入值时,会自动使用default的值填充
auto_increment #自增长
针对数字列,顺序的自动填充数据(默认是从1开始,将来可以设定起始点和偏移量)
comment #注释
表的属性
存储引擎
默认存储引擎:INNoDB
字符集
GBK //一个中文字符占用2个字节
UTF8 //一个中文字符占用3个字节
utf8mb4 //一个中文字符占用4个字节长度
UTF8与UTF8MB4区别:
UTF8MB4支持emoji 支持音标
校对规则(collation)
校对规则是跟着字符集走的.
例如: utf8mb4
utf8mb4_general_ci --> 通用的校对,默认值,大小写不区分(默认规则)
utf8mb4_bin --> 大小写区分
-- 查看字符集校对规则
show collation;
-- 修改字符集校对规则
alter database world charset utf8mb4 collate utf8mb4_bin;
SQL基础操作-DDL
库的定义
建库
create database school;
create schema sch;
CREATE DATABASE test CHARSET utf8;
create database xyz charset utf8mb4 collate utf8mb4_bin;
--
建库规范:
库名使用小写
库名不能是数字开头
库名要和业务有关
建库时要添加字符集
--
删库
drop database test;
改库
alter database test charset utf8mb4;
查库
show databases; //查看所有库
show create database test; //查看单个库
表定义
建表
-- 建表格式:
create table 表名(
列名1 数据类型 约束 其他属性,
列名2 数据类型 约束 其他属性,
列名n 数据类型 约束 其他属性,
)engine=innodb charset=utf8mb4;
USE school;
CREATE TABLE stu(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname VARCHAR(255) NOT NULL COMMENT '姓名',
sage TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
sgender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性别',
sfz CHAR(18) NOT NULL UNIQUE COMMENT '身份证',
intime TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入学时间'
) ENGINE=INNODB CHARSET=utf8mb4 COMMENT '学生表';
#DEFAULT NOW() 当前时间的意思
#ENGINE 指定使用的表结构
建表规范:
1.表名小写,无数字开头,与业务有关
2.必须要有主键,一般是一个自增长的无关列
3.选择合适的数据类型,字符长度要适中
4.每个列都非空,并设置默认值
5.每个列必须要有注释
6.必须设置存储引擎和字符集
删表
-- 表定义和数据全部删除
drop table stu;
-- 清空表的区,数据清空,表定义保留
truncate table stu;
改表
-- 在表中插入一列(默认最后列)
ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL UNIQUE COMMENT 'qq号'; //在stu表中添加qq列
-- 在指定列后插入一列--AFTER
ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT '微信号' AFTER sname; //在sname后添加wechat列(after)
-- 在第一列前插入一列-- FIRST
ALTER TABLE stu ADD num INT NOT NULL COMMENT '数字' FIRST;
-- 删除列
ALTER TABLE stu DROP wechat;
-- 修改列的数据类型的属性 -- MODIFY
ALTER TABLE stu MODIFY sname VARCHAR(128) NOT NULL;
-- 修改列名称(数据类型需要指定) -- CHANGE
ALTER TABLE stu CHANGE sgender sg CHAR(1) NOT NULL DEFAULT 'n' ;
查表
-- 查看表结构
desc xs;
-- 查看单张表
show create table xs;
-- 查看当前库中所有表
show tables;
复制表结构
CREATE TABLE ceshi LIKE stu; //将stu表结构复制到ceshi
SQL基础操作-DCL
权限回收
-- revoke 权限 on 范围 from 用户;
revoke delete on zhihu.* from [email protected]'10.0.0.%';
用户授权
-- grant 权限 no 对象 to 用户
grant all on *.* to [email protected]'10.0.0.%' identified by '123456';
grant all on *.* to [email protected]'10.0.0.%' identified by '123456' with grant option;
//with grant option:超级管理员才具备的,给别的用户授权的功能
SQL基础操作-DML
插入表数据 -- INSERT
USE school //进入指定库
-- 插入一条数据-最简单写法
INSERT INTO student VALUES(1,'oldguo','22654481',18);
-- 插入一条数据(标准) //推荐
INSERT INTO student(sno,sname,sage,ssex)
VALUES (2,'zhang3',18,'m');
-- 插入多条数据 //推荐
INSERT INTO student(sno,sname,sage,ssex)
VALUES
(3,'zhang4',18,'m'),
(4,'li4',18,'m'),
(5,'wang5',19,'f');
-- 针对性录入数据
INSERT INTO student(sname,sage,ssex)
VALUES ('zhang3',18,'m');
修改表数据 - UPDATE
-- 语法格式
UPDATE 表名 SET 列名='值' where 列名='值' AND 列名='值' //UPDATE一定要加where条件,多个条件加AND
-- 将student表中名字li4为zhang1
update student set sname='zhang1' where sno=3;
-- 将1号学员的1001课程分数修改为89
update sc set score=89 where sno=1 and cno=1001;
删除表数据 -- DELETE
-- 删除1号学员的所有成绩信息(sno为1)
delete from sc_bak where sno=1;
使用update代替delete -- 伪删除
1.额外添加一个状态列
alter table student add status enum(1,0) default 1;
2.使用update
update student set status='0' where sid=1;
3.应用查询存在的数据(业务语句查询语句进行调整)
select * from student where status=1;
SQL基础应用 - DQL
SELECT 语句应用
SELECT (单表)的执行逻辑
select 列1,列2
from
where
group
having
order by
limit
SELECT 单独使用的情况(MySQL独家)
-- SELEECT @@参数
SELECT @@datadir;
SELECT @@port;
SELECT @@socket;
SELECT @@innodb_flush_log_at_trx_commit;
SHOW VARIABLES LIKE 'innodb%';
-- select 函数()
SELECT NOW();
SELECT DATABASE();
SELECT USER();
SELECT 12*12;
SELECT CONCAT('HELLO WORD');
SELECT CONCAT(USER,'@',HOST) FROM mysql.user;
SELECT GROUP_CONCAT(USER,'@',HOST) FROM mysql.user;
FROM 子句应用
以下操作使用world库,world说明
SELECT * FROM city; //查看city的所有信息
SELECT NAME,countrycode FROM city; //查看city的name和countrtcode列
where 子句应用
-- 等值查询
SELECT * FROM city WHERE CountryCode='CHN'; //查询中国所有城市的信息
-- 不等值查询 (>,<,<=,>=,<>)
SELECT * FROM city WHERE Population<100; //查询人口数据小于100人的城市
SELECT * FROM city WHERE countrycode!='CHN'; //查询不是中国的城市(尽量不要使用,可能不走索引)
SELECT * FROM city WHERE countrycode<>'CHN'; //查询不是中国的城市(尽量不要使用,可能不走索引)
-- 模糊查询
SELECT * FROM city WHERE CountryCode LIKE 'CH%'; //查询国家代号为CH开头的城市信息
-- 逻辑连接符(and,or)
SELECT * FROM city WHERE countrycode='CHN' AND Population>5000000; //查询中国城市人口超过500W的城市信息
SELECT * FROM city WHERE district='shandong' OR District='hebei'; //查看山东省或河北的城市信息
-- 配合between and 使用
SELECT * FROM city WHERE Population BETWEEN 1000000 AND 2000000; //查询人口数在100W-200W区间的城市信息(包含头尾,)
-- 配合 in 使用
SELECT * FROM city WHERE district IN ('shandong','hebei'); //查询山东省或河北的城市信息
-- 配合 not in 使用
SELECT * FROM city WHERE countrycode NOT IN ('CHN','USA'); //查询不是中国或美国的城市信息
group by 常用聚合函数
作用
根据 by后面的条件进行分组,方便统计,by后面跟一个列或多个列
常用的聚合函数
COUNT() -- 计数
AVG() -- 平均值
SUM() -- 求和
MIN() -- 最小值
MAX() -- 最大值
group_concat() -- 列转行
举个例子
-- 统计每个国家的城市个数
SELECT countrycode,COUNT(id) FROM city
GROUP BY countrycode;
-- 统计每个国家的总人口数
SELECT countrycode,SUM(Population) FROM city
GROUP BY countrycode;
-- 统计各个国家的城市名列表
SELECT countrycode ,GROUP_CONCAT(NAME)
FROM city
GROUP BY countrycode
having 子句使用
-- 统计中国,每个省的,城市个数,省总人口数
-- 只显示人口总数大于800w的省
SELECT District,COUNT(NAME),SUM(Population) FROM city
WHERE countrycode='CHN'
GROUP BY District
HAVING SUM(Population)>8000000;