MySQL

SQL语句基础

结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序 设计语言,用于存放数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。 结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数 据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系 统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使 它具有极大的灵活性和强大的功能

1. SQL分类

1.1 数据定义语言(DDL)

数据定义语言 (Data Definition Language, DDL) 是SQL语言集中,负责数据结构定义与数据库对象 定义的语言,由CREATE、ALTER与DROP三个语法所组成,最早是由 Codasyl (Conference on Data Systems Languages) 数据模型开始,现在被纳入 SQL 指令中作为其中一个子集。

1.2 数据操纵语言(DML)

数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据 访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。

1.3 数据查询语言(DQL)

数据查询语言(Data Query Language, DQL)是SQL语言中,负责进行数据查询而不会对数据本身 进行修改的语句,这是最基本的SQL语句。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其 他DQL常用的保留字有FROM,WHERE,GROUP BY,HAVING和ORDER BY。这些DQL保留字常与其 他类型的SQL语句一起使用。

1.4 数据控制语言(DCL)

数据控制语言 (Data Control Language) 在SQL语言中,是一种可对数据访问权进行控制的指令, 它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。由 GRANT 和 REVOKE 两个指令组成。DCL以控制用户的访问权限为主,GRANT为授权语句,对应的 REVOKE是撤销授权语句。

2.DDL (数据定义语言)

数据定义语言 (Data Definition Language, DDL) ,它主要包括三个关键字:create ,alter , drop (数据库关键字不分大小写 ),主要操作对象 有数据库、表、索引、视图等.

2.1操作数据库

创建数据库

create databases 数据库名称;

使用这个数据库

use 数据库名称;

删除这个数据库

drop database 数据库名称;

注意:执行的SQL语句不区分大小写,一个SQL语句末尾要加上 ;

2.2 操作表结构

表【TABLE】是数据库中存储数据的载体。

2.2.1 语法结构

CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
);
​

例:创建一张用户表

create table t_user(
id int(3) ,
user_name varchar(30) 
);

2.2.2 添加注释

为了让别人能清楚我们定义的字段的含义,我们需要给我们创建的字段添加对应的注释来说明。

create table t_user(
id int(3) ,
user_name varchar(30) comment '用户名'
)comment = '用户表';

或者在建表之后添加

alter table t_user modify column user_name varchar(20) comment '用户名';

2.2.3删除表

删除表通过 DROP 关键字来实现

drop table t_user;

2.2.4修改表

添加字段

alter table t_user add adderss varchar(3);

修改字段类型

alter table t_user modify adderss varchar(50);

修改字段名称

alter table t_user rename column address to age;

删除字段

alter table t_user drop column age;

2.2.5表结构的约束

非空约束

CREATE TABLE T_USER(
id INT(5) NOT NULL COMMENT '主键',
user_name VARCHAR(20) COMMENT '账号' ,
age INT(2) COMMENT '年龄' 
)COMMENT='用户表' ;
​

或者在建表之后添加

alter table t_user change id id int not null comment '主键';

默认值

CREATE TABLE T_USER(
id INT(5) NOT NULL COMMENT '主键',
user_name VARCHAR(20) COMMENT '账号' ,
age INT(2) COMMENT '年龄' DEFAULT 18
)COMMENT='用户表' ;
​

唯一约束

该字段中不能出现相同的值,null除外

CREATE TABLE T_USER(
id INT(5) unique COMMENT '主键',
user_name VARCHAR(20) COMMENT '账号' ,
age INT(2) COMMENT '年龄' DEFAULT 18
)COMMENT='用户表' ;

或者在建表之后添加

ALTER TABLE t_user add CONSTRAINT unique_name UNIQUE(user_name);
alter table t_user add unique (user_name);

主键

能唯一标识一条记录的字段,不能为空,唯一约束,只能有一个主键。

DROP TABLE T_USER;
CREATE TABLE T_USER(
id INT(5) PRIMARY KEY COMMENT '主键',
user_name VARCHAR(20) COMMENT '账号' ,
age INT(2) COMMENT '年龄' DEFAULT 18
)COMMENT='用户表' ;

联合主键:多个字段组合的信息是不能出现重复的(多个字段可以组成一个主键)

alter table t_user add primary key (id,user_name);

外键

外键就是在主表中可以重复出现,但是它的值是另一个表的主键,外键使两个表相关,外键可约束表的数据的更新,外键和主键表联系,数据类型要统一,长度(存储大小)要统一,在更新数据的时候会保持一致性

CREATE TABLE T_USER(
id INT(5) PRIMARY KEY COMMENT '主键',
user_name VARCHAR(20) COMMENT '账号' ,
age INT(2) COMMENT '年龄' DEFAULT 18,
deptid INT(30) ,
CONSTRAINT FK_DEPT_ID FOREIGN KEY(deptid) REFERENCES T_DEPT(dept_id)
)COMMENT='用户表' ;
​

或者在建表之后添加

ALTER TABLE T_USER ADD CONSTRAINT FK_DEPT_ID FOREIGN KEY(deptid) REFERENCES T_DEPT(dept_id);

注意:外键字段的级联关系,如果我们要删除外键对应的主键记录,那么必须要先删除该主键对应的所有的外键记录,否则删除不成功,

实际开发中我们对外键的使用比较少。

check

粒度更细的约束

CREATE TABLE T_USER(
id INT(5) PRIMARY KEY COMMENT '主键',
user_name VARCHAR(20) COMMENT '账号' ,
age INT(3) COMMENT '年龄' ,
CHECK (age > 0 AND age < 40)
)COMMENT='用户表' ;
​

2.2.6 字段类型

MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。

MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换

3.DML(数据操纵语言)

数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据 访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。

3.1 INSERT

插入单行记录

INSERT into 表名(列名,。。)values(,)
insert into t_user(id,user_name,age) value(1,'liuliu',20);

id是主键字段,插入的时候可以省略

insert into t_user(user_name,age) value('longlong',20);

如果所有字段都要插入信息,字段列表可以省略,但插入的所有字段信息必须和表结构顺序和类型一致

 insert into t_user value(3,'zhong42',1,1);

插入多行记录

表结构的复制 数据复制

create table t_user_1 as select * from t_user;

复制表结构 不复制数据(当where条件不成立的时候,只复制表结构不复制数据)

create table t_user_2 as select * from t_user where 1 != 1;

把一个表中的数据插入到另一个表中

insert into t_user_2(id,user_name) select id,user_name  from t_user;

插入语句后面可以跟多个插入的信息

insert into t_user(user_name,age) value('浩辰',21),('浩宇',22),('龙龙',10);

3.2 UPDATE

语法结构

update 表名 set 字段名=值,字段名=值。。 where 。。。

创建一个学生表

create table t_student
( 
  id int(3) primary key auto_increment,
  stuname varchar(30) not null,
    sex char(3),
    birthday date
);

把学生表中的性别全部改为女

update t_student set sex = '女'; 

把'42'的性别改成'男'

update t_student set sex = '男' where stuname = '42';

把出生日期改成当前时间now()

# select now()
update t_student set birthday = now();

把性别为女的 所有的出生日期改成2022-09-21

#str_to_date 把字符串转换为日期类型
update t_student set birthday = str_to_date('2022-09-21','%Y-%m-%d') where sex = '女';

从别的表把值设置到本表中

create table t_student_1 as select * from t_student ;
update t_student_1 t1,t_student t2 set t1.stuname = t2.stuname where t1.id = t2.id;

3.3 DELETE

清除表结构中id为4的记录

delete from t_student where id = 4;

如果不带where条件,那么则表示删除该表中所有的数据 慎用!!! 删表跑路哈哈哈哈哈哈哈哈哈哈哈

delete from t_user_1;

truncate 直接清空表结构中的所有的数据,效率高,但是不能回滚

truncate table t_user_2;

4.DQL

4.1 单表查询

不带条件的单表查询

查询语句的语法规则 SELECT <字段列表> FROM <表名> [WHERE <查询条件>] [ORDER BY <排序字段>] [GROUP BY <分组字段>]

例 创建两个表

create table t_student
(
id int(3) primary key auto_increment,
stuname varchar(30) not null,
age int(3),
sex varchar(20),
birthday date,
address varchar(50),
class_id int(3)
);
​
create table t_class
(
class_id int(3) primary key,
class_name varchar(30) unique,
class_deac varchar(50)
);

1.查询所有的学生信息

select * from t_student;

2.查询所有学生的姓名和性别

select stuname,sex from t_student;

3.对查询的表和列设置对应的别名

select stuname as '姓名',sex as '性别' from t_student;

别名简称可以省略as 和 ' '

select stuname 姓名 , sex 性别 from t_student;

表名也可以取别名

简化前

select t_student.stuname , t_student.sex from t_student;

简化后

select t1.stuname , t1.sex from t_student as t1;

再简化后

select t1.stuname , t1.sex from t_student t1;

自己增加查询字段

select stuname,sex,18 常量 from t_student;

4.查询出所有的学生信息,并显示的信息是 liuliu-->【20】啦!

concat( ) 把变量和常量连接起来的函数

select stuname,age ,concat(stuname,'--> 【',age ,'】岁啦!') from t_student;

带条件的单表查询

1.查询出学生表中liuliu的所有信息

select * from t_student where stuname = 'liuliu';

2.查询出表中年纪在18~22之间的学生的信息

(age between 18 and 22 等价于 age >= 18 and age <=22)

select * from t_student where age >= 18 and age <=22;
​
select * from t_student where age between 18 and 22;

3.查询出表中编号为1和3的学生

(id = 1 or id = 3 等价于 id in(1,3) )

select * from t_student where id = 1 or id = 3;
​
select * from t_student where id in(1,3);

4.查询出表中地址信息是空的学生信息

错误的语句

select * from t_student where address = ' ';
​
select * from t_student where address = null;

正确的语句

select * from t_student where address is null;

查询出表中地址信息不是空的学生信息

select * from t_student where address is not null;

5.查询出所有liu姓学生的所有信息

--模糊查询 like

select * from t_student where stuname like 'liu%';

如果不加 % 结果和 '=liu' 一样

select * from t_student where stuname like 'liu';

6.查询出学生表中年龄大于18的男生的所有信息

select * from t_student where age > 18 and sex = '男';

7.查询表中年龄大于18或者家庭住址是郑州的同学的信息

select * from t_student where age > 18 or address like '%郑州%';

8.查询出所有的学生信息,根据id降序

desc 降序 asc 升序 ( 默认就是升序,就是说asc阔以省略 )

select * from t_student order by id desc;
 
 select * from t_student order by id asc;
 
 select * from t_student order by id;

先根据age降序排序,如果age有相同的信息,那么再根据id升序排序

阔以多个字段排序,前面的字段优先排序

select * from t_student order by age desc , id asc;

4.2聚合函数

-- 一般用于统计

1.统计表中学生的总数 count 统计某列中非空的数据条数的总和

select count(*) from t_student;
select count(id) from t_student;
select count(address) from t_student;

实际开发中我们使用 count(1) 来统计,效率会更高

select 1,id from t_student;
select count(1) from t_student;

2.统计表中学生最大的年纪

select max(age) from t_student;

3.统计表中学生最小的年纪

select min(age) from t_student;

4.统计表中学生平均的年纪

select avg(age) from t_student;

5.统计表中学生的年纪总和

select sum(age) from t_student;

4.3分组查询

通常用于统计,一般和聚合函数配合使用

1.统计出表中男生和女生的人数用一条sql语句

select sex,count(1) from t_student group by sex;

2.统计出表中每个班级的人数

select class_id,count(1) from t_student group by class_id;

3.统计出表中每个班级中男生和女生的人数

聚合函数统计的是分组后的最小单位

select class_id,sex,count(1) from t_student group by class_id,sex;

4.统计出每个班级的人数,班级编号为空的不统计

where 是在分组之前对要分组的数据源做条件过滤(见4.1查询语句的语法规则)

select class_id,count(1) 
from t_student 
where class_id is not null 
group by class_id;

对比

select class_id,count(1)
from t_student
group by class_id
having class_id is not null;

结果一样,然而应该选择前者,效率问题 where 在分组之前执行,统计数据会减少 having 在分组之后执行,统计完成之后做过滤

5.统计出学生表中班级不为空的学生的人数,且人数大于1的记录

select class_id,count(1)
from t_student
where class_id is not null
group by class_id
having count(1) > 1; #对统计的结果做过滤

6.统计出学生表中年龄在18到26之间的各个班级中的男生和女生的人数大于等于1的记录

在分组函数中 select 之后的字段列表只能出现 分组的字段(本表中的字段)和聚合函数

select class_id,sex,count(1)
from t_student
where age between 18 and 26
group by class_id,sex
having count(1) >= 1;

7.group by 单独使用的情况和使用distinct关键字的作用是一样的

select class_id
from t_student
group by class_id;

一般不会单独使用group by distinct 是去除重复列的含义

select distinct class_id from t_student;

4.4常用函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值