前言
这是我听老师讲课做的笔记,考试要看的。 这是视频地址
作者:RodmaChen
关注我的csdn博客,更多Linux笔记知识还在更新
本人只在csdn写博客
配套这篇文章练习更香新手入门——MySQL中基于SQL语言增删改查等基础的练习
SQL是Structured QueryLanguage的缩写,即结构化查询语言。SQL是一门标准的计算机语言,用于访问和操作数据库,其主能包括数据定义、数据操纵、数据查询和数据控制。SQL已成为RDBMS的标准语言,但不同的RDBMS使用的SQL版本有一些差异,它们都有一些私有
扩展。
按照功能用途,可以将SQL语言分为4类:DDL、DML、DQL和DCL。
数据库、表、视图等的建立、删除
show databases;
create database 数据库名;
drop database 数据库名;
create table 数据表名(表结构)
use 数据库名;
show tables;
desc 数据表;或 show columns from 数据表;
drop table 数据表;
alter table contacts add sex varchar(1);
添加、删除和修改数据表中的记录
命令 | 功能 |
---|---|
insert into 数据表名(列表名)values(‘输入值’); |
插入数据 |
updata 数据表名 set 列表名='输入的值'; |
修改数据 |
delete from 数据表名[where 列表名]; |
插入单条数据命令:
insert into table_name (field1, field2, ..., fieldN)
values(value1, value2, ..., valueN);
插入多条数据命令:
insert into table_name (field1, field2, ..., fieldN)
values(valueA1, valueA2, ..., valueAN), (valueB1,valueB2,
..., valueBN),…, (valueN1, valueN2, ..., valueNN);
注意事项:
1、如果字段是字符型,值必须使用单引号或者双引号,如”value”;如果值本身带单引号或双引号,需要转义
2、如果所有列都要添加数据,insert into语句可以不指定列,即
INSERT INTO table_name VALUES
(value1, value2, ..., valueN);
修改语句:
update table_name set field1=newValue1,
field2=newValue2 [where Clause]
注意事项:
1、可以同时更新一个或多个字段
2、可以通过where子句来指定更新的范围,如果不带where,则更新数据表中的所有记录
delete语法:
delete from table_name [where Clause]
注意事项:
1、可以通过where子句来指定删除的范围,如果不带where,则删除数据表中的所有记录
数据库对象的权限管理和事务管理
我们知道,SQL语言按功能用途分为4类,分别是DDL、DML、DQL和DCL。其中,DCL是数据控制语言,主要用于管理用户和权限。在企业中,这部分工作通常是由DBA完成,一般开发人员很少接触。
DCL主要能做什么?
MySQL的权限体系大致分为5个层级,全局层级、数据库层级、表层级、列层级和子程序层级。
MySQL的权限信息主要存储在以下几张表中,当用户连接数据库时,MySQL会根据这些表对用户进行权限验证。
注意!:在MySQL中,使用CREATE USER
来创建用户,用户创建后没有任何权限。
CREATE USER '用户名' [@'主机名'] [IDENTIFIED BY '密码'];
注意:MySQL的用户账号由两部分组成:用户名和主机名,即用户名@主机名,主机名可以是IP或机器名称,主机名为%
表示允许任何地址的主机远程登录MySQL数据库。
DROP USER '用户名' [@'主机名'];
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';
在MySQL数据库中,使用
grant
命令授权,revoke
命令撤销授权。
grant all privileges on databaseName.tableName to '用户名' [@'主机名'] ;
revoke all privileges on databaseName.tableName from '用户名' [@'主机名'] ;
FLUSH PRIVILEGES;
show grants for '用户名' [@'主机名'] ;
使用grant和revoke进行授权、撤销授权时,需要指定具体是哪些权限,这些权限大体可以分为3类,数据类、结构类和管理类。
在实际工作中,公司的DBA都会设置禁止root用户远程登录,请问这是为什么?
解决步骤
mysqld --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --console --skip-grant-tables --shared-memory
步骤二:修改root用户密码
MySQL关闭权限验证后,直接通过 mysql 命令即可连接到数据库,并可正常执行各类操作。
// 刷新权限
FLUSH PRIVILEGES;
//修改root用户的密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
在SQL中,使用select语句来查询数据。不同的关系数据库,select语法会有细微差别,在MySQL官网 https://dev.mysql.com/doc/refman/8.0/en/select.html 可以查到支持的select
语法。
格式:
select 列表名 from 数据表名;(* 表示全部列表名)
在SQL中,insert、update、delete和select
后面都能带where
子句,用于插入、修改、删除或查询指定条件的记录。
格式:
SELECT 列表名 from 数据表 where 列表名 运算符 value
在where子句中,使用and、or
可以把两个或多个过滤条件结合起来。
格式:
select 列表名 from 数据表名 where 条件1 AND 条件2 OR 条件3
运算符
IN
允许我们在WHERE
子句中过滤某个字段的多个值。
select column_name from table_name where column_name in(value1, value2, …)
在where子句中,有时候我们需要查询包含xxx 字符串的所有记录,这时就需要用到运算符
like
。
select 列表名 from 数据表名 where 列表名 like ‘%value%’
说明:
%
类似于正则表达式中的*
,匹配任意0个或多个字符_
匹配任意单个字符%
和_
,就相当于运算符=
的效果我们通常说的MySQL函数指的是MySQL数据库提供的内置函数,包括数学函数、字符串函数、日期和时间函数、聚合函数、条件判断函数等,这些内置函数可以帮助用户更方便地处理表中的数据,简化用户的操作。
函数now()用于返回当前的日期和时间。在实际应用中,大多数业务表都会带一个创建时间create_time
字段,用于记录每一条数据的产生时间。在向表中插入数据时,就可以在insert
语句中使用now()函数
。
insert into user(id, name, create_time) values(1, 'zhangsan', now());
函数date_format()
用于以指定的格式显示日期/时间。在实际应用中,一般会按照标准格式存储日期/时间,如 2019-12-13 14:15:16 。在查询使用数据时,往往又会有不同的格式要求,这时就需要使用date_format()函数进行格式 转换。
示例如下:
select name, date_format(birthday, '%Y/%m/%d') from user;
聚合函数是对一组值进行计算,并返回单个值。
MySQL常用的聚合函数有5个,分别是count、sum、avg、min和max
。
函数ifnull()用于处理NULL
值。
ifnull(v1,v2),如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。
case when是流程控制语句,可以在SQL语句中使用case when来获取更加准确和直接的结果。
SQL中的case when类似于编程语言中的if else或者switch。
按某数值排序,从高到低,从大到小等等
order by
对查询结果集进行排序,可以按照一列或多列进行排序。SELECT column_name1, column_name2 FROM table_name1, table_name2ORDER BY column_name, column_name [ASC|DESC]
说明:
ASC
表示按升序排列,DESC
表示按降序排列。第一页:获取20条数据
第二页:从20条数据开始获取20条
第三页:从第40条开始获取20条
SELECT
语句中使用LIMIT
子句来约束要返回的记录数,通常使用LIMIT
实现分页。SELECT column_name1, column_name2 FROM table_name1, table_name2 LIMIT [offset,] row_count
说明:
offset
指定要返回的第一行的偏移量。第一行的偏移量是0,而不是1。从字面上理解,
group by
表示根据某种规则对数据进行分组,它必须配合聚合函数进行使用,对数据进行分组后可以进行count、sum、avg、max和min等运算。
group by语法
SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name
说明:
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。HAVING 子句可以对分组后的各组数据进行筛选。
having语法
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator
value GROUP BY column_name HAVING aggregate_function(column_name) operator value
使用
group by
可以分组统计每个部门有多少员工。假如,除了统计每个部门的员工数量之外,还想知道具体是哪些员工(员工列表),又该如何实现呢?
group_concat
配合group by
一起使用,用于将某一列的值按指定的分隔符进行拼接,MySQL默认的分隔符为逗号。
group_concat语法
group_concat([distinct] column_name [order by column_name asc/desc ] [separator '分隔符'])
distinct用于在查询中返回列的唯一不同值(去重复),支持单列或多列。在实际的应用中,表中的某一列含有重复值是很常见的,如employ表的dept列。如果在查询数据时,希望得到某列的所有不同值,可以使用distinct。
distinct语法
select distinct 列表名1,列表请2 from 数据表名;
多张表,表连接
主要学习内连接和左连接
表连接(JOIN)是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获取数据。
SELECT table1.column, table2.column FROM table1,
table2 WHERE table1.column1 = table2.column2;
交叉连接(cross join):没有用where子句的交叉连接将产生笛卡尔积,第一个表的行数乘以第二个表的行数等于笛卡尔积和结果集的大小。
自连接是一种特殊的表连接,它是指相互连接的表在物理上同为一张表,但是逻辑上是多张表。自连接通常用于表中的数据有层次结构,如区域表、菜单表、商品分类表等。
自连接语法
SELECT A.column, B.column FROM table A, table B WHEREA.column = B.column;
如果运算符 in 后面的值是来源于某个查询结果,并非是指定的几个值,这时就需要用到子查询。子查询又称为内部查询或嵌套查询,即在 SQL 查询的 WHERE 子句中嵌入查询语句。
子查询in语法
SELECT column_name FROM table_name
WHERE column_name `IN`(
SELECT column_name FROM table_name [WHERE]
);
EXISTS是子查询中用于测试内部查询是否返回任何行的布尔运算符。将主查询的数据放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否保留。
where子句使用exists语法
SELECT column_name1 FROM table_name1
WHERE EXISTS (SELECT * FROM table_name2
WHERE condition);
本人博客:https://blog.csdn.net/weixin_46654114
本人b站求关注:https://space.bilibili.com/391105864
转载说明:跟我说明,务必注明来源,附带本人博客连接。
请给我点个赞鼓励我吧