SQL基础

作者: 挑战_bae7 | 来源:发表于2020-11-10 11:29 被阅读0次

2.SQL 基础

2.1 数值类型

tinyint: -128~127
int :-2^31~2^31-1 
手机号码 一般使用char类型

2.2 字符类型

char(11) :
定长 的字符串类型,在存储字符串时,最大字符长度11个,立即分配11个字符长度的存储空间,如果存不满,空格填充。
varchar(11):
变长的字符串类型看,最大字符长度11个。在存储字符串时,自动判断字符长度,按需分配存储空间。
enum('bj','tj','sh'):
枚举类型,比较适合于将来此列的值是固定范围内的特点,可以使用enum,可以很大程度的优化我们的索引结构。

2.3 时间类型

DATE   YYYY-MM-DD 2020-11-10
TIME   hh:mm:ss[.uuuuuu] 08:59:02.123456
DATETIME  YYYY-MM-DD hh:mm:ss[.uuuuuu]  上面两个的综合
TIMESTAMP 跟上面一样 但是会根据时区变化
YEAR YYYY 2020

2.4 表属性

约束(一般建表时添加):
**primary key** :主键约束
设置为主键的列,此列的值必须非空且唯一,主键在一个表中只能有一个,但是可以有多个列一起构成。
**not null**      :非空约束
列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0
**unique key** :唯一键
列值不能重复
**unsigned** :无符号
针对数字列,非负数。

其他属性:
**key** :索引
可以在某列上建立索引,来优化查询,一般是根据需要后添加
**default**           :默认值
列中,没有录入值时,会自动使用default的值填充
**auto_increment**:自增长
针对数字列,顺序的自动填充数据(默认是从1开始,将来可以设定起始点和偏移量)
**comment ** : 注释

2.5 字符集和校对规则

utf8
utf8mb4

3. DDL语言

3.1 创建数据库

CREATE DATABASE school CHARSET utf8;  ##创建数据库 指定字符集
CREATE SCHEMA sch;
SHOW CHARSET;  ##查看指定的字符集
SHOW COLLATION; ##查看字符集指定的排序方式 例如utf8_general_ci 正常排序 utf8_bin 排序支持大小写
CREATE DATABASE stu CHARSET utf8mb4 COLLATE utf8mb4_bin; ##指定排序规则

建库规范:
1.库名不能有大写字母   
2.建库要加字符集   默认拉丁文      
3.库名不能有数字开头
4. 库名要和业务相关

3.2 删除数据库

DROP DATABASE sch;

3.3 修改数据库名

alter database school charset utf8mb4; ##字符集 从小的改成大的
3306 [(none)]>show create database school; ##查看创建的命令
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| school   | CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.01 sec)

3.4 表的定义

create table stu(
列1  属性(数据类型、约束、其他属性) ,
列2  属性,
列3  属性
)

样例

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=utf8 COMMENT '学生表';

3.5 表的删除

drop table stu;

3.6 表的修改

MariaDB [school]> show create table stu;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| stu   | CREATE TABLE `stu` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `sname` varchar(255) NOT NULL COMMENT '学生',
  `sage` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
  `sgender` enum('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性别',
  `sfz` char(18) NOT NULL COMMENT '身份证',
  `intime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入学时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `sfz` (`sfz`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='学生表'                   |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

表中添加 字段

注意 添加或者删除 字段 会锁表
ALTER TABLE stu ADD qq VARCHAR(20) UNIQUE NOT NULL COMMENT 'QQ号';  ##在最后添加字段
ALTER TABLE stu ADD wxchat VARCHAR(64) NOT NULL UNIQUE COMMENT '微信号' AFTER sname;  ## 在sname后添加
ALTER TABLE stu ADD sid INT NOT NULL  COMMENT '数字' FIRST; ## 在首行添加数据

表中删除 字段

ALTER TABLE stu DROP sid;

表中修改 字段

ALTER TABLE stu MODIFY sname VARCHAR(128) NOT NULL COMMENT '学生';  ##注意 修改字段属性 需要将之前的表属性都带上 默认覆盖
ALTER TABLE stu CHANGE sgender sg CHAR(1) NOT NULL DEFAULT 'n' COMMENT '性别'; ##修改字段 名字 属性 用change

CREATE TABLE ceshi LIKE stu; ##创建一个表跟stu表一样的结构

4 DML语句 对数据操作

4.1 数据插入 insert

DESC stu;
录入一条记录
INSERT INTO stu VALUES(2,'zs',18,'m','123456',NOW());
针对性录入
INSERT INTO stu (sname,sfz) VALUES ('ww','3456568');
批量录入
INSERT INTO stu (sname,sfz) VALUES 
('w5','5656565665'),
('w6','565656e665'),
('w7','5656565365'),
('w8','5656565w65');
查询
SELECT * FROM stu;

4.2 更新 update

DESC stu;
查询
SELECT * FROM stu;
根据条件修改 不然全表跟新
UPDATE stu SET sname='zhaoshi' WHERE id=2;

4.3 删除 delete

危险 删除 必须带where 删除后只是将数据标记为可覆盖 但是实际数据没有删除 会有碎片 缝隙
DELETE FROM stu WHERE id=3;

TRUNCATE TABLE stu ;  清空表  相当于dd命令 无法恢复
DELETE   FROM  stu ;  删除表 空间没有释放 相当于 vim 

区别:
delete: DML操作, 是逻辑性质删除,逐行进行删除,速度慢.
truncate: DDL操作,对与表段中的数据页进行清空,速度快.

伪删除

添加状态列
ALTER TABLE stu ADD state TINYINT NOT NULL DEFAULT 1 ;

UPDATE stu SET state=0 WHERE id=2;

SELECT * FROM stu WHERE state=1;

5 DQL语言 对数据行查询

5.1 select 用法

--- SELECT @@xxx 查看系统参数
 SELECT @@port ;
 SELECT @@datadir ;
 SELECT @@socket ;
 SELECT @@server_id ;
 SELECT @@log_error ;
 SELECT @@log_bin_basename ;
 
--- SHOW VARIABLES 模糊查询参数
 SHOW VARIABLES LIKE "innodb%";
 SHOW VARIABLES LIKE "port";

---SELECT 函数
SELECT NOW();
SELECT DATABASE();
SELECT USER();
SELECT CONCAT("Hello Word!"); ##拼接

SELECT USER,HOST FROM mysql.user;
SELECT CONCAT(USER,'@',HOST) FROM mysql.user;
SELECT GROUP_CONCAT(USER,'@',HOST) FROM mysql.user; ##将多列整成一列

5.2 from

SELECT 列1,列2 FROM 表
SELECT  *  FROM 表

例如

SELECT * FROM stu;
SELECT sname,sfz FROM stu WHERE id<2;

5.3 where

等值查询

SELECT sname,sfz FROM stu WHERE id=2;

where配合比较操作符(> < >= <= <>)

SELECT sname,sfz FROM stu WHERE id<2;

where配合逻辑运算符(and or )

SELECT * FROM stu WHERE sg='n' AND sage>2;

where 模糊查询 like

SELECT * FROM city WHERE district LIKE "guang%";

where 配合in 语句 下面两个例子 结果一样

SELECT * FROM city WHERE countrycode='CHN' OR countrycode='USA';
SELECT * FROM city WHERE countrycode IN ('CHN','USA')

where 配合 between and

SELECT * FROM city WHERE population >100000 AND population <200000;
SELECT * FROM city WHERE population BETWEEN 100000 AND 200000;

5.4 group by +聚合函数

常用聚合函数

**max()**      :最大值
**min()**      :最小值
**avg()**      :平均值
**sum()**      :总和
**count()**    :个数
group_concat() : 列转行

例如


SELECT countrycode,SUM(population) FROM city GROUP BY countrycode; ##统计各个国家的人口总数
查找       国家        个数         从     表   根据      国家   分类
SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district; ##统计中国每个省的人数
SELECT countrycode,COUNT(NAME) FROM city  GROUP BY countrycode; ##统计各个国家城市的个数 count
SELECT district,GROUP_CONCAT(NAME) FROM city WHERE countrycode='CHN' GROUP BY district; ##统计中国 各个省的城市
SELECT district,AVG(population) FROM city WHERE countrycode='CHN' GROUP BY district; ##统计中国每个省的人数平均值

having group by 后再次统计 注意 having后 不走索引
where|group|having

SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district HAVING SUM(population)<10000000 ; ##统计中国每个省的人数 再统计人口总数小于100w的信息

5.5 order by

顺序 SELECT    FROM    WHERE    GROUP BY    HAVING    ORDER BY   LIMIT

例如:

SELECT * FROM city WHERE countrycode='CHN'  ORDER BY population   DESC ; ##ASC 从小到大
SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district ORDER BY population DESC;  ##统计各个省的数量 并排序
SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district HAVING SUM(population) >5000000 ORDER BY SUM(population)  DESC; ##统计各个省的个数 并找出大于500W 排序

5.6 limit 显示几个

SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district HAVING SUM(population) >5000000 ORDER BY SUM(population) DESC LIMIT 3; 

LIMIT n,m 从n开始 显示m个
LIMIT M OFFSET N  跳过N行 显示M行  跟上一样效果

5.7 DISTINCT distinct

DISTINCT 去重复

SELECT DISTINCT(countrycode) FROM city; ## 显示所有国家名称

5.7 union 联合

UNION ALL 不检查数据中重复行
UNION 检查数据中重复的行 去重
SELECT * FROM city WHERE countrycode IN ('CHN','USA')
SELECT * FROM city WHERE countrycode='CHN' UNION ALL  SELECT * FROM city WHERE countrycode='USA' ;
一般情况下 将AND 或 OR 转成 UNION ALL  提高 执行效率速度快

5.8 多表查询

use school
student :学生表
sno:    学号
sname:学生姓名
sage: 学生年龄
ssex: 学生性别

teacher :教师表
tno:     教师编号
tname:教师名字

course :课程表
cno:  课程编号
cname:课程名字
tno:  教师编号

score  :成绩表
sno:  学号
cno:  课程编号
score:成绩

-- 项目构建
drop database school;
CREATE DATABASE school CHARSET utf8;
USE school

CREATE TABLE student(
sno INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname VARCHAR(20) NOT NULL COMMENT '姓名',
sage TINYINT UNSIGNED  NOT NULL COMMENT '年龄',
ssex  ENUM('f','m') NOT NULL DEFAULT 'm' COMMENT '性别'
)ENGINE=INNODB CHARSET=utf8;

CREATE TABLE course(
cno INT NOT NULL PRIMARY KEY COMMENT '课程编号',
cname VARCHAR(20) NOT NULL COMMENT '课程名字',
tno INT NOT NULL  COMMENT '教师编号'
)ENGINE=INNODB CHARSET utf8;

CREATE TABLE sc (
sno INT NOT NULL COMMENT '学号',
cno INT NOT NULL COMMENT '课程编号',
score INT  NOT NULL DEFAULT 0 COMMENT '成绩'
)ENGINE=INNODB CHARSET=utf8;

CREATE TABLE teacher(
tno INT NOT NULL PRIMARY KEY COMMENT '教师编号',
tname VARCHAR(20) NOT NULL COMMENT '教师名字'
)ENGINE=INNODB CHARSET utf8;

INSERT INTO student(sno,sname,sage,ssex)
VALUES (1,'zhang3',18,'m');

INSERT INTO student(sno,sname,sage,ssex)
VALUES
(2,'zhang4',18,'m'),
(3,'li4',18,'m'),
(4,'wang5',19,'f');

INSERT INTO student
VALUES
(5,'zh4',18,'m'),
(6,'zhao4',18,'m'),
(7,'ma6',19,'f');

INSERT INTO student(sname,sage,ssex)
VALUES
('oldboy',20,'m'),
('oldgirl',20,'f'),
('oldp',25,'m');


INSERT INTO teacher(tno,tname) VALUES
(101,'oldboy'),
(102,'hesw'),
(103,'oldguo');

DESC course;
INSERT INTO course(cno,cname,tno)
VALUES
(1001,'linux',101),
(1002,'python',102),
(1003,'mysql',103);

DESC sc;
INSERT INTO sc(sno,cno,score)
VALUES
(1,1001,80),
(1,1002,59),
(2,1002,90),
(2,1003,100),
(3,1001,99),
(3,1003,40),
(4,1001,79),
(4,1002,61),
(4,1003,99),
(5,1003,40),
(6,1001,89),
(6,1003,77),
(7,1001,67),
(7,1003,82),
(8,1001,70),
(9,1003,80),
(10,1003,96);

SELECT * FROM student;
SELECT * FROM teacher;
SELECT * FROM course;
SELECT * FROM sc;

例如

统计 国土小于100的 城市名 国家名 国土面积
SELECT city.name,country.name,country.surfacearea 
FROM city JOIN country
ON city.countrycode=country.code 
WHERE city.population <100;

5.9 别名 as

AS 列别名 为了好看

SELECT city.name AS 城市,
country.name AS 国家,
country.surfacearea  AS 国土面积 
FROM city JOIN country
ON city.countrycode=country.code 
WHERE city.population <100;

AS 表别名

查询沈阳的人口 国土面积 国家名
SELECT a.name,b.name,b.surfacearea 
FROM city AS a JOIN country AS b
ON a.countrycode=b.code 
WHERE a.name="shenyang"

例如

张三 学习几门课
USE school
SELECT * FROM student;
SELECT * FROM teacher;
SELECT * FROM course;
SELECT * FROM sc;

SELECT a.sname,COUNT(b.cno)
FROM student AS a JOIN sc AS b
ON a.sno=b.sno
WHERE a.sname="zhang3"
张三 学习课程名称
SELECT a.sname,GROUP_CONCAT(c.cname)
  FROM
    student AS a
    JOIN sc AS b
      ON a.sno = b.sno
    JOIN course AS c
      ON b.cno = c.cno
  WHERE a.sname = "zhang3"
 查询oldguo 所交课程的平均分数
USE school
SELECT * FROM student;
SELECT * FROM teacher;
SELECT * FROM course;
SELECT * FROM sc;
  
SELECT a.`tname`,AVG(c.`score`)
FROM teacher AS a 
JOIN course AS b
ON a.tno=b.tno
JOIN sc AS c
ON b.cno=c.cno
WHERE a.tname="oldguo"
 查询oldguo所教的不及格的学生姓名
SELECT a.tname,d.sname,c.score
FROM teacher AS a
JOIN course AS b
ON a.tno=b.tno
JOIN sc AS c
ON b.cno=c.cno
JOIN student AS d 
ON c.sno=d.sno
WHERE c.score <60 AND tname="oldguo"; 
查询平均成绩大于60分的同学的学号和平均成绩;
SELECT a.sno,a.sname,AVG(b.score)
FROM student AS a 
JOIN sc AS b
ON a.sno=b.sno
WHERE b.score>60
GROUP BY b.score;
查询所有同学的学号、姓名、选课数、总成绩;
SELECT a.sno,a.sname,GROUP_CONCAT(c.cname),SUM(b.score)
FROM student AS a 
JOIN sc AS b
ON a.sno=b.sno
JOIN course AS c 
ON b.cno=c.cno
GROUP BY a.sname
查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
SELECT a.cno AS 课程ID,
       MAX(b.score) AS 最高分,
       MIN(b.score) AS 最低分
FROM course AS a 
JOIN sc AS b
ON a.cno=b.cno
GROUP BY b.cno

6.视图 information_schema.tables视图

视图库 虚拟库

USE school 
CREATE VIEW zhangsan AS  ##创建视图
SELECT student.sname,GROUP_CONCAT(course.cname)
  FROM
    student 
    JOIN sc 
      ON student.sno = sc.sno
    JOIN course 
      ON sc.cno = course.cno
  WHERE student.sname = "zhang3"

information_schema.TABLES 存储整个mysql中所有的表信息 属性

DESC information_schema.TABLES 
TABLE_SCHEMA    ---->库名
TABLE_NAME      ---->表名
ENGINE          ---->引擎
TABLE_ROWS      ---->表的行数
AVG_ROW_LENGTH  ---->表中行的平均行(字节)
INDEX_LENGTH    ---->索引的占用空间大小(字节)
ENGINE --->代表引擎
表占用空间 TABLE_ROWS  * AVG_ROW_LENGTH +INDEX_LENGTH 

例如:

查询整个数据库中所有库和所对应的表信息
SELECT table_schema,GROUP_CONCAT(table_name)
FROM  information_schema.tables
GROUP BY table_schema;

统计所有库下的表个数
SELECT table_schema,COUNT(table_name)
FROM  information_schema.tables
GROUP BY table_schema;

查询所有innodb引擎的表及所在的库
SELECT table_schema,GROUP_CONCAT(table_name),ENGINE
FROM  information_schema.tables
WHERE ENGINE="innodb"
GROUP BY table_schema;

统计world数据库下每张表的磁盘空间占用
SELECT table_name,CONCAT((TABLE_ROWS*AVG_ROW_LENGTH+INDEX_LENGTH)/1024,"KB") AS size 
FROM information_schema.tables
WHERE table_schema="world";

统计所有数据库的总的磁盘空间占用
SELECT 
TABLE_SCHEMA,
CONCAT(SUM(TABLE_ROWS*AVG_ROW_LENGTH+INDEX_LENGTH)/1024," KB") AS size 
FROM information_schema.tables
GROUP BY table_schema;
生成整个数据库下的所有表的单独备份语句

模板语句:
mysqldump -uroot -p123 world city >/tmp/world_city.sql

SELECT CONCAT('mysqldump -uroot -p123 ',table_schema," ",table_name," >/bak/",table_schema,"_",table_name,".sql")
FROM information_schema.tables
WHERE table_schema='world'
INTO OUTFILE '/tmp/world.sh'
vim /etc/my .conf
secure-file-priv=/tmp ##指定安全路径 
107张表,都需要执行以下2条语句
ALTER TABLE world.city DISCARD TABLESPACE;
ALTER TABLE world.city IMPORT TABLESPACE;
SELECT CONCAT("alter table ",table_schema,".",table_name," discard tablespace")
FROM information_schema.tables
WHERE table_schema='world'
INTO OUTFILE '/tmp/dis.sql';

show 命令

help show  ##查看帮助文件
show  databases;                          #查看所有数据库
show tables;                                          #查看当前库的所有表
SHOW TABLES FROM                        #查看某个指定库下的表
show create database world                #查看建库语句
show create table world.city                #查看建表语句
show  grants for  root@'localhost'       #查看用户的权限信息
show  charset;                                   #查看字符集
show collation                                      #查看校对规则
show processlist;                                  #查看数据库连接情况
show index from                                 #表的索引情况
show status                                         #数据库状态查看
SHOW STATUS LIKE '%lock%';         #模糊查询数据库某些状态
SHOW VARIABLES                             #查看所有配置信息
SHOW variables LIKE '%lock%';          #查看部分配置信息
show engines                                       #查看支持的所有的存储引擎
show engine innodb status\G               #查看InnoDB引擎相关的状态信息
show binary logs                                    #列举所有的二进制日志
show master status                                 #查看数据库的日志位置信息
show binlog evnets in                             #查看二进制日志事件
show slave status \G                             #查看从库状态
SHOW RELAYLOG EVENTS               #查看从库relaylog事件信息
desc  (show colums from city)               #查看表的列定义信息
http://dev.mysql.com/doc/refman/5.7/en/show.html

相关文章

  • sql

    sql-基础sql-基础查询-1sql-基础查询-2sql-更新 概览 数据库(Database,DB):将大量数...

  • SQL基础及元数据获取(数据类型,表的属性)

    1、SQL基础应用 ①.SQL的介绍SQL标准:SQL-92、SQL-99SQL_MODE:都是为了保证SQL语句...

  • MySql手动注入

    information_schema SQL基础 1.1 什么是sql? SQL(structured query...

  • MySQL

    数据类型 sql基础 数据库表 SQL SELECT 语句: SQL WHERE 子句: SQL AND & OR...

  • SQL语句

    SQL基础应用 SQL语句自动补全 SQL的介绍 SQL-92标准SQL-99标准 image SQL常用分类 表...

  • SQL高级运用

    -- =================================sql基础补充==============...

  • mysql的用法2

    -- =================================sql基础补充==============...

  • Oracle学习-day26:SQL语句

    一、SQL语言基础 1.什么是SQL语言? (1)SQL, Structured Query Language, ...

  • oracle 基础复习

    1. SQL 基础 https://mubu.com/doc/3ANPHhveeK 2. PL/SQL 基础 ht...

  • mysql手工注入

    SQL基础 1.1 什么是sql? SQL(structured query language),即结构化查询语言...

网友评论

      本文标题:SQL基础

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