SQL语言超详细笔记——MySQL数据库、DDL、DML、DQL、多表设计与查询

发布于:2022-12-27 ⋅ 阅读:(502) ⋅ 点赞:(0)

数据库概述

1、我们为什么要学习数据库?

①、实现数据持久化到本地。

②、使用完整的管理系统统一管理,可以实现结构化查询,方便管理。

2、数据库全称是数据库管理系统

数据库是为了方便数据的存储和管理,将数据存储在磁盘上的仓库,使用sql语言对数据进行管理(创建表结构,增删改查)。

3、数据库分类:

关系型数据库(RDBMS):表与表之间的关联关系。

mysql sqlserver orace db2

非关系型数据库:

redis(专业做缓存用)

在这里插入图片描述

MySQL数据库

1、由瑞典MySQL AB 公司开发,目前属于Oracle旗下产品。

MySql软件是一种开放源码软件,可以修改源码来开发自己的 Mysql 系统。

MySql数据库服务器具有快速、可靠和易于使用的特点。

MySql使用标准的sql语言,并且支持多种操作系统,支持多种语言。

2、【Mysql的安装】:百度。
【cmd命令行方式连接mysql】 :

登录:mysql [-hlocalhost -P3306](本机可省略) -uroot -p(可以直接写密码,不能有空格)

-h:主机名

-P:端口号

-u:用户名

-p:密码

退出:exit

【查看mysql数据库的版本】

select version();

【MySQL的常用命令】

查看当前所有的数据库:show databases;

选择指定的库:use 库名

查看当前的所有表:show tables;

查看其他库的所有表:show tables from 库名;

【可视化客户端工具】

SQLyog / Navicat

3、MySQL语法规范

● 不区分大小写,建议关键字大写,表名、列名小写

● 每句话用;

● 注释

● 单行注释:#注释文字

● 单行注释:

– 注释文字(要有空格)

● 多行注释:

/* 注释文字 */

4、sql语言:

全称:结构化查询语言,一种特殊目的的编程语言。

优点:简单易学,几乎所有DBMS都支持SQL ,灵活使用可以进行非常复杂和高级的数据库操作。

DDL数据定义语言

1、【创建,删除数据库表结构 】

常用的语句:create ,alter,drop,rename

2、创建数据库并设置编码格式

CREATE DATABASE [if not exists] 数据库名 [ CHARSET utf8]

删除数据库

DROP DATABASE 数据库名 / [IF EXISTS数据库名];

修改字符集

ALTER DATABASE 数据库名 CHARSET gbk;

3、数据库表的基本概念:

数据表:表由行和列组成,分别都包含着数据。

记录:记录是一行数据。

字段:字段是表里的一列,用于保存每条记录的特定信息。

4、设计表:

● 表名(表信息)

● 表中的字段

● 字段的数据类型和长度

● 哪些约束

列的数据类型:
在这里插入图片描述

5、约束:

①.主键约束 PRIMARY KEY :

②.在一张表中代表唯一的一条记录,不能为空,不能重复

③.主键列在一张表中只能有一个,主键列不能为空,不能重复

④.mysql还支持主键列自动增长(必须为整数类型):AUTO_INCREMENT

⑥.不能为空约束:NOT NULL

⑦.唯一约束:UNIQUE

⑧.检查约束:设置条件

⑨.外键约束(多表)

6、创建表语法:

CREATE TABLE 表名(列名 数据类型 [约束] [默认值] [ 注释],…)

CREATE TABLE t_user(
id INT [PRIMARY KEY NOT NULL AUTO_INCREMENT],
number INT(5) NOT NULL,
stuname VARCHAR(10) NOT NULL,
age INT(3) CHECK(age>18),
birthday DATE,
weight DOUBLE, 
opertime datetime,
[CONSTRAINT 约束名 约束规则]
)

7、删除表,修改表名:

删除表
DROP TABLE 表名
修改表名
RENAME TABLE 旧表名 TO 新表名
复制表结构,没有数据
CREATE TABLE 新表名 LIKE 被复制表名;

DML数据操纵语言

数据操纵语言DML常用语句:insert,delete,update
在这里插入图片描述

删除数据:

DELETE FROM 表名 WHERE 条件 – 逐行删除数据
DROP TABLE 表名 – 删除表结构
TRUNCATE TABLE 表名 – 清空整张表数据 是一个ddl级别的操作

修改数据:

UPDATE 表名 SET 列名 = ‘新值’WHERE 条件

DQL数据查询语言

SQL是使用频率最高的一个操作,可以从一个表或多个表中查询数据。

select 结果列 from 表名 where 条件 order by 排序 group by 分组 limit0,2

1、查询结果:

– 特定列查询:

select column1 column2... from 表名

SELECT num,sname,gender FROM student

– 查询所有的列

SELECT * FROM student

– 查询结果使用算数运算符±*/ + 只能作为算数运算

  SELECT num,sname,height+1 FROM student
  SELECT num,sname,height+num FROM student

– DISTINCT 去除重复数据,重复数据指的是每列的值都是相同的.

 SELECT DISTINCT sname,gender FROM student

select 语句后使用函数:

单行函数: 会对每行数据进行处理( 字符串处理、逻辑处理、日期、算数)

分组函数/聚合函数/统计函数: 将多条结果转为一条 sum max count

– length(列名) 返回列的长度 以字节为单位 中文3个字节

  SELECT num,LENGTH(sname) FROM student

– char_length(列名) 以字符为单位的长度

   SELECT num,CHAR_LENGTH(sname)sname FROM student

– concat(“”,“”,“”…) as 别名

   SELECT CONCAT(num,":",sname,":",gender)AS studentInfo FROM student

   SELECT UPPER(sname)FROM student
   SELECT LOWER(sname)FROM student

– SUBSTRING(列,开始位置,截取长度)

 SELECT num,SUBSTRING(sname,2,2) FROM student

– instr(列名,查找的字符) 返回指定字符在字符串中首次出现的位置

   SELECT num,INSTR(sname,"i") FROM student

– trim(列名) 去掉前后的空格

   SELECT CHAR_LENGTH(TRIM(sname)) FROM student 

– trim(子串 from 列名) 去掉列名前后的指定子串

   SELECT TRIM("a" FROM sname) FROM student 

– 左填充指定内容到指定长度

   SELECT LPAD(sname,5,"a"),RPAD(sname,5,"a") FROM student 

– 替换

   SELECT REPLACE(sname,"i","I") FROM student

– 对查询结果进行逻辑处理

SELECT num,sname,
       (CASE WHEN height>=1.80 THEN '大高个' ELSE '不是大高个' END)height,
       (CASE 
            WHEN height>=1.80 THEN '大高个'
            WHEN height<1.80 AND height>1.60 THEN '中等'
            ELSE '低个子' END)height                                 
      FROM student

– ifnull(列,默认值)

 SELECT num,sname,IFNULL(address,'暂未录入')  FROM student 

– if(条件,条件成立返回,不成立返回)

 SELECT num,sname,IF(height>1.80,'大高个子',"不是大高个")height    FROM student

SELECT num,sname,ROUND(height) FROM student 
  SELECT num,sname,FLOOR(height) FROM student 

– 截断 不会进位 RAND() 随机生成 0-1之间的随机数

 SELECT num,sname,TRUNCATE(height,1),RAND() FROM student 

 SELECT num,sname,NOW(),CURDATE(),CURTIME() FROM student

 SELECT num,sname,YEAR(birthday),MONTH(birthday) FROM student


– 字符串转 日期类型

 SELECT STR_TO_DATE('2002-1-1',"%Y-%m-%d") FROM student

– 日期转字符串类型

 SELECT DATE_FORMAT(birthday,"%Y-%m")birthday FROM student  

 SELECT DATE_FORMAT(birthday,"%Y")birthday FROM student 

– 计算两个日期之间的天数

 SELECT DATEDIFF(CURDATE(),birthday) FROM student

– 分组函数/聚合函数/统计函数 多变一
– sum() avg()只能处理数值类型的列
– max() min() count() 可以处理任何数据类型

 SELECT SUM(height),AVG(height),MAX(height),MIN(height) FROM student

 SELECT COUNT(*) FROM student
 SELECT COUNT(num) FROM student
 SELECT MAX(sname),MIN(sname) FROM student

2、条件查询

语法:select 结果 from 表名 where条件

条件 比较 =, != 或<>, >, <, >=, <=

逻辑 and or not

– is null 查询值为空的

SELECT * FROM student WHERE  address IS NULL
SELECT * FROM student WHERE  address IS NOT NULL

– like %关键字% % 匹配任意个字符 _ 匹配一个字符

SELECT * FROM student WHERE sname LIKE "张_"
SELECT * FROM student WHERE sname LIKE "%三%"

– union 合并多个查询语句结果 可以去除多条结果中重复数据 多条查询结果列相同

SELECT num FROM student WHERE gender = "男"
 UNION 
SELECT num FROM student 

– union all 将多条查询合并 不会去除重复数据

SELECT * FROM student WHERE gender = "男"
 UNION  ALL
SELECT * FROM student 

3、排序查询

– 默认按主键从小到大排序

SELECT * FROM student 

– order by 列 asc(升序) desc(降序)

SELECT * FROM student  ORDER BY reg_time ASC
SELECT * FROM student  ORDER BY reg_time DESC
SELECT * FROM student  ORDER BY height ASC
SELECT * FROM student  WHERE gender = "男" ORDER BY height ASC

SELECT * FROM student   ORDER BY height ASC, reg_time DESC

– 分页显示数据 假设每页显示4条
– limit 开始的位置(从0开始),每次查询的数量

SELECT * FROM student WHERE num>0 ORDER BY num ASC  LIMIT 0,4
SELECT * FROM student WHERE num>0 ORDER BY num ASC  LIMIT 4,4

4、分组查询 group by 分组条件 把分组条件相同的数据划分到同一个组中处理

SELECT gender,COUNT(*),MAX(height),AVG(height) FROM student GROUP BY gender

– 子查询

SELECT * FROM(SELECT gender,COUNT(*)c FROM student   GROUP BY gender)AS t WHERE t.c>3

– where 是对分组前(表中的原始数据)筛选, HAVING对已经分组后的数据再进行筛选

SELECT gender,COUNT(*)c FROM student WHERE num>0   GROUP BY gender HAVING c>3

多表设计_关联查询

1、数据库设计范式

第一范式:要求列保持原子性(不可拆分、例如电话号码)。

第二范式:有逐渐,其他字段依赖主键。

第三范式:消除冗余,一表存一类信息。

2、外键:引用另外一个数据表的某条记录。

外键列类型与主键列类型一致
数据表之间的关联/引用是靠主键和外键建立起来的。

3、

·当主表中没有对应的记录时,不能将记录添加到从表
·不能更改主表中的值而导致从表中的记录孤立
·从表存在与主表对应的记录,不能从主表中删除该行
·删除主表前,先删从表

4、关联查询
在这里插入图片描述

①.内连接(inner join):

把满足了条件的两张表中的交集数据查询出来

(1).内关联(等值连接) 把两张表中满足条件的数据查询出来

SELECT * FROM 表1 INNER JOIN 表2 ON 表1.column1 = 表2.column2

(2).非等值连接,用于区分范围、积分等级

eg: SELECT * FROM students INNER JOIN height-level h ON s.height BETWEEN h.level-lower AND h.leve-upper

(3).自连接,例如中国行政单位表,收货地址:省市县区

eg:SELECT * FROM area WHERE pif=…

SELECT * FROM area al INNER JOIN area a2 ON a1.pid=a2.pid

​ INNER JOIN area a3 ON a3.pid=a2.pid

​ WHERE a1.id=6100101

②.外连接:

(1).左外连接(left join):

select 结果 from 表1 left join 表2 on 表1.column1 = 表2.column2

(2).右外连接(right join):
select 结果 from 表1 right join 表2 on 表1.column1 = 表2.column2

4、子查询:出现在其他语句中的select语句,称为子查询或内查询;外部的查询语句,称为主查询或外查询

子查询出现在:
select后面:支持标量子查询(一行一列)
from后面:支持表子查询(多行多列)
where后面:支持标量子查询(一行一列)和列子查询(一列多行)

本文含有隐藏内容,请 开通VIP 后查看