一篇学会MySQL

发布于:2022-10-17 ⋅ 阅读:(394) ⋅ 点赞:(0)

一篇学会MySQL

SQL语句

DDL语句(数据定义语言)

数据库模式定义语言并非程序设计语言,DDL数据库模式定义语言是SQL语言(结构化查询语言)的组成部分.

SQL语言包括四种主要程序设计语言类别的语句:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL,本文是从DDL语句开始.

数据库模式定义语言DDL(Data Definition Language),是用于描述数据库中要存储的现实世界实体的语言.这些定义包括结构定义、操作方法定义等.

DDL数据库操作语句

注意SQL语句中不区分大小写.

#查询所有数据库
SHOW DATABASES;
#查询当前数据库
SELECT DATABAASE();
#创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名称 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
#删除数据库
DROP DATABASE [IF EXISTS] 数据库名称;
#使用某数据库
USE 数据库名;
#查询当前数据库所有表
SHOW TABLES;
#查询表结构
DESC 表名称;
#查询指定表的建表语句
SHOW CREATE TABLE 表名;

DDL-表操作语句

创建表语句
#创建一个新的表以及表中字段,字段类型
CREATE TABLE 表名(
	字段1 字段1类型[COMMENT 字段1注释],
	字段2 字段2类型[COMMENT 字段2注释],
    字段3 字段3类型[COMMENT 字段3注释],
    字段4 字段4类型[COMMENT 字段4注释]
)

常用数值类型:

image-20221015204804753

常见的日期类型:

image-20221015204821806

常见的字符串类型:

image-20221015204839620

创建testTable表

添加name字段字段类型为char,无论存放什么数据都占用10个字符,效率较高.

CHAR与VARCHAR相似,VARCHAR只占用使用的字符空间,效率较低.

添加age字段字段类型为TINYINT ,存储空间中存放无符号数,允许存放空数据

添加score字段,字段类型为DOUBLE,存放4位的空间,保留1位小数

create table testTableb(
stuname char(10) not null comment ‘名称’,
age tinyint UNSIGNED null comment ‘年龄’,
score double(4,1) comment ‘分数’
)

表结构的修改语句
#为表中新添加字段
ALTER TABLE 表名称 字段名 类型(长度) [COMMENT 注释] [约束]; 

#为testTABLE表中新添加字段

alter table testtable add field varchar(1) comment ‘新添加测试字段’

#修改表中数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
#修改表中的字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];

#修改表中数据类型
alter table testTable modify field varchar(10);
#修改表中的字段名
alter table testTable change field new_field varchar(20) comment ‘更改后的属性’;

#修改表名称
ALTER TABLE 表名 RENAME TO 新表名;

alter table testTable rename TO new_testTable;

表结构的删除语句
#将某个表中的字段删除
ALTER TABLE 表名 DROP 字段名;

alter table new_testTable dropnew_field ;

#删除某个表
DROP TABLE [IF EXISTS] 表名;
#删除指定表,并重新创建该表
TRUNCATE TABLE 表名;

DML(数据操作语言)

DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改操作.DML中最核心的是三种语句,即添加数据,修改数据,删除数据的SQL语句.

添加表数据

#给指定字段添加数据
INSERT INTO表名(字段名1,字段名2, ...) VALUES (1,2...)
#给全部字段添加数据
INSERT INTO表名VALUES (1,2, .);
#批量添加数据
INSERT INTO 表名(字段名1,字段名2,..) VALUES (1,2,..),(1,2,..),(1,2..);
INSERT INTO 表名 VALUES (1,2,...) (1,2,...) (1,...);

insert into new_testtable (stuname,age,score,new_field) values (“wjk”,20,99.9,“a”);

insert into new_testtable values (“wjk_a”,18,60,“b”);

insert into new_testtable (stuname,age,score,new_field) values (“wjk_b”,20,99.9,“a”),(“wjk_c”,20,99.9,“a”);

insert into new_testtable values (“wjk_a”,18,60,“b”),(“wjk_a”,18,60,“b”),(“wjk_a”,18,60,“b”);

修改表数据

#修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据.
UPDATE 表名 SET 字段名1=1 , 字段名2 =2....[WHERE 条件];

update new_testtable set stuname = “updateData”;

删除表数据

#DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据.
#DELETE语句不能删除某一个字段的值(可以使用 UPDATE).
DELETE FROM 表名 [WHERE 条件]

delete from new_testtable ;

DQL(数据查询语言)

DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录.

查询表数据

基本查询语句
#查询多个字段
SELECT 字段1, 字段2,字段3... FROM 表名;
SELECT * FROM 表名;
#设置别名
SELECT 字段1 [AS 别名1],字段2 [AS别名2] .. FROM 表名;
#去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;

select * from new_testtable ;

select age as ‘年龄’,score as ‘分数’ FROM new_testtable ;

select distinct stuname from new_testtable ;

条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表;
image-20221015202453660 image-20221015202512464

select * from new_testtable where age>18;

select * from new_testtable where score is null;

select * from new_testtable where score is not null;

select * from new_testtable where stuname like ‘%wjk%’;

select * from new_testtable where stuname like ‘wjk%’;

select * from new_testtable where stuname like ‘%wjk’;

select * from new_testtable where age in(18,20);

select * from new_testtable where age between 20 and 60;

等价于:

select * from new_testtable where age >=20 and age<=40;

select * from new_testtable where age != 20;

聚合函数

聚合函数是将一列数据作为一个整体,进行纵向计算,NULL值不进入聚合函数计算.下图为常用的聚合函数:

image-20221015204029211

select count(*) from new_testtable;

select count(age) from new_testtable;

select avg(age) from new_testtable;

select min(age) from new_testtable;

select sum(score) from new_testtable where age=18;

分组查询
SELECT 字段列表 FROM 表名 [WHERE条件] GROUP BY 分组字段名 [ HAVING分组后过滤条件];

where. 与having区别:
执行时机不同: where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之 后对结果进行过滤.
判断条件不同: where不能对聚合函数进行判断,而having可以.

分组查询返回的字段一般是聚合函数和分组的字段,其他的字段没有意义.

select age,count(*) from new_testtable group by age;

select age,avg(score) from new_testtable group by age;

select age,avg(score) from new_testtable group by age having avg(score) > 60;

排序查询
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 ,字段2 排序方式2;

排序方式:

  • ASC:升序(默认值)
  • DESC:降序

select * from new_testtable where age is not null order by age asc,stuname desc ;

分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;

分页查阅的注意事项:

  • 起始索引从0开始,起始索引= (查询页码-1) *每页显示记录数。
  • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
  • 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。

查询new_testtable表中,第1-5条数据

select * from new_testtable limit 0,5;

查询new_testtable表中,第6-10条数据

select * from new_testtable limit 5,5;

查询emp表中 性别为男,同时年龄在20-40之间的前五个信息,查询的结果按照年龄升序

select * from emp where gender ‘男’ and age between 20 and 40 order by age asc Limit 5 ;

到此我们的DQL语句也学习完毕,这个时候我们还需要了解不同的DQL之间的执行顺序.一般的DQL语句书写格式如下

# FROM->WHERE->GROUP BY->SELECT->ORDER BY->LIMIT
SELECT
	字段列表 
FROM
	表名列表 
WHERE
	条件列表 
GROUP BY
	分组字段列表 
HAVING
	分组后条 列表 
ORDER BY
	排序字段列表 
LIMIT 
	分页参数

DCL(数据控制语言)

DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限.

#查询用户
USE mysql;
SELECT * FROM user;
#创建用户
CREATE USER '用户名’@'主机名’ IDENTIFIED BY '密码';
#修改用户密码
SET PASSWORD FOR '用户名’@'主机名’ = PASSWORD('新密码’);
#删除用户
DROP USER '用户名'@'主机名’;

create user ‘wjk’@‘localhost’ identified by ‘123456’;

create user ‘wjk’@‘%’ identified by ‘123456’;

set password for ‘wjk’@‘localhost’ = password (‘1234567’);

drop user ‘wjk’@‘localhost’;

DCL-权限管理

#查询权限
SHOW GRANTS FOR‘用户名'@'主机名’ ;
#授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
#撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM ‘用户名'@'主机名';

show grants for ‘wjk’@‘localhost’;

grant all on testDatabase.* to ‘wjk’@‘localhost’;

grant all on . to ‘wjk’@‘localhost’;

MySQL常用函数

函数是指一段可以直接被另一段程序调用的程序或代码。

字符串函数

MySQL中内置了很多的字符串函数,常用的几个如下:

image-20221016210227397

select connat(‘hello’,‘world!’);

select lower(‘HELLO’);

select upper(‘hello’);

select lpad(‘str’,5,‘_’);

select rpad(‘str’,5,‘_’);

select trim(’ hello world! ');//不去除中间的空格

select substring(‘hello’,1,5)//print hello

update new_testtable set stuname= lpad(stuname,5,‘*’);

update new_testtable set age = lpad(age,3,‘9’)

数值函数

常见的数值函数:

image-20221016211429749

select ceil(1.1);

select floor(1.1);

select mod(5,4);

select rand();

select round(3.444,4);

select lpad(round(rand()*100000,0),6,‘0’);

日期函数

常见的日期函数:

image-20221016212403615

select curdate();

select curtime();

select now();

select year(now());

select month(now());

select day(now());

select date_add(now(),interval 70 year);

select date_add(now(),interval 70 day);

select datediff(now(),date_add(now(),interval 70 day));

流程函数

流程函数可以在SQL语句中实现条件筛选,提高语句的效率.

image-20221016213005856

select if(true,‘ok’,‘false’);

select ifnull(‘’,‘false’);

select ifnull(null,‘false’);

查询new_testtable表中,用户等级

select (case stuname when ‘wjk_a’ then ‘第一个root用户’ when ‘wjk_b’ then ‘第二个root用户’ else ‘其他用户’ end) from new_testtable;

新建score表,查询成绩等级,80以上A,60以上B,其他分数C

CREATE TABLE score (
id INT COMMENT ‘ID’,
NAME VARCHAR (20) COMMENT ‘姓名’,
math INT COMMENT ’ 数学’,
english INT COMMENT ‘英语’,
chinese INT COMMENT ‘语文’
) COMMENT ‘学员成绩表’;
INSERT INTO score (id,NAME,math,english,chinese) VALUES

​ (1,‘Tom’,67, 88, 95),

​ (2,‘Rose’,23,66,90),

​ (3,‘Jack’,56,98,76);

SELECT
( CASE WHEN math > 80 THEN ‘A’ WHEN math > 60 AND math < 80 THEN ‘B’ ELSE ‘C’ END ) AS ‘成绩’ ,
( CASE WHEN english > 80 THEN ‘A’ WHEN english > 60 AND english < 80 THEN ‘B’ ELSE ‘C’ END ) AS ‘成绩’ ,
( CASE WHEN chinese > 80 THEN ‘A’ WHEN chinese > 60 AND chinese < 80 THEN ‘B’ ELSE ‘C’ END ) AS ‘成绩’
FROM score;

MySQL约束

约束

约束是作用于表中字段上的规则,用于限制存储在表中的数据.为了保证数据库中数据的正确、有效性和完整性.

image-20221016220124442

约束是作用于表中字段.上的,可以在创建表/修改表的时候添加约束.

创建一个如下图所示约束创建表结构:

CREATE TABLE USER (
id INT PRIMARY KEY auto_increment COMMENT ‘主键’,
NAME VARCHAR ( 10 ) NOT NULL UNIQUE COMMENT ‘姓名’,
age INT CHECK (age>0 && age<=120) ,
STATUS CHAR ( 1 ) DEFAULT ‘1’ COMMENT ‘状态’,
gender CHAR ( 1 ) COMMENT ‘性别’
) comment ‘用户表’;

测试约束:

insert into user (name ,age, status, gender) values(‘Toml’ ,19,‘1’,‘男’),(‘Tom2’ ,25,‘0’,男’);
insert into user (name , age, status, gender) values (‘Tom3’ ,19,‘1’,男’);
insert into user (name , age, status, gender) values (null,19,‘1’,‘男’);
insert into user (name , age, status, gender) values (‘Tom3’ ,19,‘1’,男’);
insert into user (name , age, status, gender) values (‘Tom4’ ,80,‘1’,‘男’);
insert into user (name , age, status, gender) values (‘Tom5’ .-1,‘1’,‘男’);
insert into user (name , age, status, gender) values (‘Tom5’ ,121,‘1’,‘男’);
insert into user(name , age , gender) values ('Tom5 ',120,‘男’);

外键约束

外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性.

添加外键
CREATE TABLE表名(
	字段名数据类型,
	[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名)
);

外键的关联

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名);
ALTER TABLE 表名 DROP FOREIGN KEY外键名称;

外键的删除/更新

image-20221017214313969

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名 (主表字段名) 
ON UPDATE CASCADE 
ON DELETE CASCADE;

CREATE TABLE dept (
id INT auto_increment COMMENT ‘ID’ PRIMARY KEY,
NAME VARCHAR ( 50 ) NOT NULL COMMENT ’ 部门名称’ ) COMMENT ’ 部门表’;
INSERT INTO dept (NAME)
VALUES
(‘研发部’),
(‘市场部’),
(‘财务部’),
(‘销售部’),
(‘总经办’)

CREATE TABLE emp(
id INT auto_increment COMMENT ‘ID’ PRIMARY KEY,
NAME VARCHAR ( 50 ) NOT NULL COMMENT ‘姓名’,
age INT COMMENT ‘年龄’,
job VARCHAR (20) COMMENT ‘职位’,
salary INT COMMENT ’ 薪资’,
entrydate date COMMENT ’ 入职时间’,
managerid INT COMMENT ‘直属领导ID’,
dept_id INT COMMENT ‘部门ID’
)COMMENT ‘员工表’;

INSERT INTO emp (NAME,age,job,salary,entrydate,managerid,dept_id )
VALUES
( ‘金庸’,66,‘总裁’, 20000,‘2000-01-01’,NULL, 5 ),
(‘张无忌’, 20,‘项目经理’,12500,'2005-12-05 ', 1, 1 ),
(‘杨道’, 33, ‘开发’, 8400, ‘2000-11-03’, 2, 1 ),
(‘韦一笑’, 48, ‘开发’, 11000, ‘2002-02-05’, 2, 1 ),
(‘常遇春’,43, ‘开发’,10500, ‘2004-09-07’, 3, 1 ),
(‘小昭’, 19,‘程序员鼓励师’, 6600, '2004-10-12 ',2,1);

//插入外键,添加后外键关联字段不能随意修改

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

//删除外键

alter table emp drop foreign key fk_emp_dept_id ;

//外键更新/删除时关联表受到影响

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;

多表查询

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系.

基本上分为三种: 一对多(多对一)、多对多、一对一

一对多(多对一):

  • 案例: 部门与员工的关系
  • 关系:一个部门对应多个员工, 一个员工对应一个部门
  • 实现: 在多的一方建立外键,指向一的一方的主键

多对多:

  • 案例:学生与课程的关系
  • 关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
  • 实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

create table student(
id int auto_increment primary key comment ‘主键ID’,
name varchar(10) comment ‘姓名’,
no varchar(10) comment ‘学号’
)comment ‘学生表’;
insert into student values (NULL,‘黛绮丝’,‘2000100101’), (NULL,‘谢逊’,‘2000100102’),(NULL,‘殷天正’,‘2000100103’);

CREATE TABLE course ( id INT auto_increment PRIMARY KEY COMMENT ‘主键ID’, NAME VARCHAR ( 10 ) COMMENT ‘课程名称’ ) COMMENT ‘课程表’;
INSERT INTO course
VALUES
( NULL, ‘Java’ ),
( NULL, ‘PHP’ ),
( NULL, ‘MySQL’ ),
( NULL, ‘Hadoop’ );

CREATE TABLE student_course (
id INT auto_increment COMMENT ‘主键’ PRIMARY KEY,
studentid INT NOT NULL COMMENT ‘学生ID’,
courseid INT NOT NULL COMMENT ‘课程ID’,
CONSTRAINT fk_courseid FOREIGN KEY (courseid) REFERENCES course ( id ),
CONSTRAINT fk_studentid FOREIGN KEY (studentid ) REFERENCES student ( id )
) COMMENT ‘学生课程中间表’;
INSERT INTO student_course
VALUES
( NULL, 1, 1 ),
( NULL, 1, 2 ),
( NULL, 1, 3 ),
( NULL, 2, 2 ),
( NULL, 2, 3 ),
( NULL, 3, 4 );

一对一:

  • 案例:用户与用户详情的关系
  • 关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一 张表中,其他详情字段放在另一张表中,以提升操作效率
  • 实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

CREATE TABLE tb_USER (
id INT auto_increment PRIMARY KEY COMMENT ‘主键ID’,
NAME VARCHAR ( 10 ) COMMENT ‘姓名’,
age INT COMMENT ‘年龄’,
gender CHAR ( 1 ) COMMENT “1:男,2:女”,
phone CHAR ( 11 ) COMMENT ‘手机号’
) COMMENT ‘用户基本信息表’;
CREATE TABLE tb_user_edu (
id INT auto_increment PRIMARY KEY COMMENT ‘主键ID’,
degrele VARCHAR ( 20 ) COMMENT ‘学历’,
major VARCHAR ( 50 ) COMMENT ’ 专业 ',
primaryschool VARCHAR ( 50 ) COMMENT ‘小学’,
middleschool VARCHAR ( 50 ) COMMENT ‘中学’,
university VARCHAR ( 50 ) COMMENT ‘大学’,
userid INT UNIQUE COMMENT ‘用户ID’,
CONSTRAINT fk_userid FOREIGN KEY ( userid ) REFERENCES tb_user ( id )
) COMMENT ‘用户教育信息表’;

;
INSERT INTO tb_USER ( id, NAME, age, gender, phone )
VALUES
( NULL,‘黄渤’, 45, ‘1’, ‘188800111’ ),
( NULL,‘冰冰’, 35, ‘2’, ‘1800002222’ ),
( NULL,‘码云’, 55, ‘1’, ‘1880008888’ ),
( NULL,‘李彦宏’,50,‘1’,‘188000999’ );
);
INSERT INTO tb_user_edu (degrele,major,primaryschool,middLeschool,university,userid)
VALUES
( ‘本科’, ‘舞蹈’, ‘静安区第一小学’, ‘静安区第一中学’, ‘北京舞蹈学院’, 1 ),
( ‘硕士’, ‘表演’, ‘朝阳区第一小学’, ‘朝阳区第一中学’, ‘北京电影学院’, 2 ),
( ‘本科’, ‘英语’, ‘杭州市第一小学’, ‘杭州市第一中学’, ‘杭州师范大学’, 3 ),
( ‘本科’, ‘应用数学’, ‘阳泉第一小学’, ‘阳泉区第一中学’, ‘清华大学’, 4 );

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

网站公告

今日签到

点亮在社区的每一天
去签到