美文网首页MySQL
[MySQL 之一] SQL 基础

[MySQL 之一] SQL 基础

作者: 小胡_鸭 | 来源:发表于2021-06-22 15:46 被阅读0次

(1)SQL 分类

主要分为三个类别:

  • DDL(Data Definition Language)语句:数据定义语言,定义了不同的数据段、数据库、表、列、索引等数据库对象,常用的语句关键字主要包括 create、drop、alter 等。
  • DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字包括 insert、delete、updateselect 等。
  • DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。常用的语句关键字主要包括 grant、revoke 等。

(2)DDL

  连接 MySQL 服务器

mysql -h 主机地址 -P 端口号 -u 用户名 -p 密码

  主机地址参数不指定时默认为 localhost,端口号默认为 3306

① 创建数据库

CREATE DATABASE dbname;

创建数据库

如果数据库已存在,重复创建会报错

通过以下命令查看系统中存在的所有数据库

show databases

可以看到前面创建的数据库 test1

有几个 mysql 系统数据库:

  • information_schema:主要存储系统中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息等。每个用户都可以查看这个数据库,但根据权限的不同看到的内容不同。
  • performance_schema:MySQL 5.5 引入的数据库,用于存储系统性能相关的动态参数表。
  • sys:MySQL 5.7 引入的系统库,本身不记录系统数据,基于 information_schema 和 performance_schema 之上,封装了一层更加易于调优和诊断的系统视图。
  • mysql:存储系统的用户权限信息。

选择要操作的数据库,使用以下命令:

use dbname

选择刚创建的数据库 test1

查看数据库中的数据表,使用以下命令:

show tables;

查看数据库 test1 中存在哪些数据表

查看系统数据库 mysql 中存在哪些数据表

② 删除数据库

通过以下命令删除数据库:

drop database dbname;

删除数据库 test1

PS. 删除数据库的操作会把库中所有的表和数据都删除,所以要谨慎操作,必要做好数据备份。

③ 创建表

创建一张数据表的语法如下:

CREATE TABLE tablename (
    column_name_1 column_type_1 constraints,
    column_name_2 column_type_2 constraints,
    ...
    column_name_n column_type_n constraints
)

column_name 是列的名字,column_type 是列的数据类型,constraints 是列的约束条件(包括是否允许为空、是否自增、默认值、断言检查等)。

【实践】

  创建一个雇员表 emp,表中包括 ename(姓名)、hiredate(雇佣日期)、sal(薪水)3个字段,字段类型分别为 varchar(10)、date、int(2)。

通过以下命令可以查看表的结构:

DESC tablename;

还可以通过以下命令查看更加全面的表定义信息:

show create table tablename \G;   
// \G 选项的含义是使得记录能够按照字段竖向排列,以便更好地显示内容较长的记录。

如图所示,输出的是可以直接执行的建表的SQL:

④ 删除表

通过以下命令删除表:

DROP TABLE tablename

删除数据表 emp

⑤ 修改表

a. 修改表字段类型

ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]

修改 emp 表的 ename 字段类型为 varchar(20)

b. 增加表字段

ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFRER col_name]

emp 表增加一个 age 字段,类型为 int(3)

c. 删除表字段

ALTER TABLE tablename drop [COLUMN] col_name

删除 emp 表的 age 字段

d. 字段改名

ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST | AFTER col_name]

修改 emp 表的 age 字段名为 age1,同时将字段类型改为 int(4)

PS. change 和 modify 都可以修改表的定义,不同的是 change 后面需要写两次列名,不方便。但是 change 的优点是可以修改列名称,modify 则不能。

e. 修改字段排列顺序

使用 first|after column_name 选项。

emp 表新增 birth date 字段并加在 ename 之后

f. 更改表名

ALTER TABLE tablename RENAME [TO] new_tablename

将表 emp 改名为 emp1

(3)DML

① 增

使用 insert 命令进行新增,语法如下:

INSERT INTO tablename (field1,field2,...,fieldn) values (value1,value2,...,valuen);

emp 表中插入一条记录(指定要插入的列和值)

如果不指定字段名,则默认按照表定义顺序来,值应该跟字段排列顺序保持一致,每个字段都必须有对应的值即使是 null。

显示指定字段时,含可空的字段、非空但是含有默认值的字段以及自增字段,可以不再 insert 后的字段列表里面出现,values 后面只写对应字段名称的值。

一次性插入多条数据,可以提高插入数据的性能,语法如下:

INSERT INTO tablename (field1, field2, ..., fieldn)
VALUES
(record1_value1, record1_value2, ..., record1_valuen),
(record2_value1, record2_value2, ..., record2_valuen),
...
(recordn_value1, recordn_value2, ..., recordn_valuen)
;

dept 表中插入两条记录

② 改

使用 update 命令进行更改,语法如下:

UPDATE tablename SET field1=value1,field2=value2,...,fieldn=valuen [WHERE CONDITION]

更新 emp 表中 ename 为 "james" 的薪水为 4000

update 命令可用于更新多个表中数据,语法如下:

UPDATE t1,t2,...,tn set t1.field1=expr1,tn.fieldn=exprn [WHERE CONDITION]

将计算机系的雇员的工资提高 10%(联表更新,利用一个表的字段来更新另一个表的字段)

③ 删

使用 delete 命令进行删除,语法如下:

DELETE FROM tablename [WHERE CONDITION]

删除 emp 表名字为 "tony" 的雇员

一次性删除多个表的数据,语法如下:

DELETE t1,t2,...,tn FROM t1,t2,...,tn [WHERE CONDITION]

删除没有所属部门的雇员

④ 查

使用 select 命令,语法如下:

SELECT * FROM tablename [WHERE CONDITION]
  • 简单查询

  • 条件查询:使用 where 关键字

  • 查询字段更名:使用 as 关键字,或者直接加别名即可

  • 去除重复的记录:使用 distinct 关键字

  • 排序:使用 order by 关键字,默认为升序,通过 desc/asc 显式指定升降序

  • 限制:使用 limit 关键字,可直接指定最多查询多少数据,或者某一页数据

  • 聚合查询

    • 指定分组:使用 group by 关键字
    • 对每个分组进行条件限定:使用 having 关键字
    • 分组聚合函数:avg()、sum()、min()、max()、count()
    • 分组统计:使用 with rollup 关键字
  • 多关系查询

    • 自然连接(内连接):使用 natural join 关键字
    • 连接(笛卡儿积):table1, table2,产生的结果集行数为两个表的数据行数的积
    • 外连接:使用 left join/right join 关键字,mysql 中不存在全外连接
  • 集合运算
    • 并:使用 union/union all 关键字
    • 交/差:无法像其他 DBMS 一样使用 intersect/except 来计算交集和差集,需要借助 in/not in 等方式来计算。

(4)DCL

① 授权

grant [insert,delete,select,update(col_name)] on dbname.[*|tablename] to user@host identified by password;

创建一个用户 z1,具有对 sakila 数据库中所有表的 SELECT/INSERT 权限:

grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';

② 回收权限

revoke [insert,delete,select,update(col_name)] on dbname.[*|tablename] from user@host;

回收用户 Amit 对学校数据库的 department 表的查询权限

revoke select on school.department from Amit@www.scau.edu.cn;

相关文章

网友评论

    本文标题:[MySQL 之一] SQL 基础

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