本图根据深入浅出mysql 整理

2.sql 基础

2.1 SQL 简介

2.2.1 SQL 分类

DDL(Data Definition Languages)语句:
数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter等

DML(Data Manipulation Language)语句 :
数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括insert、delete、udpate 和select 等。

DCL(Data Control Language)语句:
数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke 等。

2.2.2 DDL 语句

是什么

DDL 是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建、删除、修改的操作语言。

1.创建数据库

语法

CREATE DATABASE dbname

例子

例如,创建数据库 test1,命令执行如下:
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)

查看数据库

语法

show databases;

范例

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cluster |
| mysql |
| test |
| test1 |
+--------------------+
5 rows in set (0.00 sec)

2 删除数据库

语法

drop database dbname;

范例

例如,要删除 test1 数据库可以使用以下语句:
mysql> drop database test1;
Query OK, 0 rows affected (0.00 sec)

3 创建表

语法

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

因为 MySQL 的表名是以目录的形式存在于磁盘上,所以表名的字符可以用任何目录名允许的字符。column_name 是列的名字,column_type 是列的数据类型,contraints 是这个列的约束条件,在后面的章节中会详细介绍。

范例

例如,创建一个名称为 emp 的表。表中包括 3 个字段,ename(姓名),hiredate(雇用日期)、sal(薪水),字段类型分别为varchar(10)、date、int(2)(关于字段类型将会在下一章中介绍):
mysql> create table emp(ename varchar(10),
hiredate date,
sal decimal(10,2),
deptno int(2));
Query OK, 0 rows affected (0.02 sec)

表创建完毕后,如果需要查看一下表的定义,可以使用如下命令:
DESC tablename
例如,查看 emp 表,将输出以下信息:
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(10) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

虽然 desc 命令可以查看表定义,但是其输出的信息还是不够全面,为了查看更全面的表定义信息,有时就需要通过查看创建表的 SQL 语句来得到,可以使用如下命令实现:
mysql> show create table emp \G;
*************************** 1. row ***************************
Table: emp
Create Table: CREATE TABLE `emp` (
`ename` varchar(20) DEFAULT NULL,
`hiredate` date DEFAULT NULL,
`sal` decimal(10,2) DEFAULT NULL,
`deptno` int(2) DEFAULT NULL,
KEY `idx_emp_ename` (`ename`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.02 sec)
ERROR:
No query specified

4 删除表

语法

DROP TABLE tablename

范例

例如,要删除数据库 emp 可以使用以下命令:
mysql> drop table emp;
Query OK, 0 rows affected (0.00 sec)

5.修改表

(1) 修改表类型

语法

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

范例

例如,修改表 emp 的 ename 字段定义,将 varchar(10)改为 varchar(20):
mysql> alter table emp modify ename varchar(20);
Query OK, 0 rows affected (0.03 sec)

2) 增加表字段

语法

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

范例

mysql> alter table emp add column age int(3);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

(3)删除表字段

语法

ALTER TABLE tablename DROP [COLUMN] col_name

范例

例如,将字段 age 删除掉:
mysql> alter table emp drop column age;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0

(4)字段改名

语法

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

范例

例如,将 age 改名为 age1,同时修改字段类型为 int(4):
mysql> alter table emp change age age1 int(4) ;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

(5)修改字段排列顺序。

语法

前面介绍的的字段增加和修改语法(ADD/CNAHGE/MODIFY)中,都有一个可选项 first|after column_name,这个选项可以用来修改字段在表中的位置

范例

修改字段 age,将它放在最前面:
mysql> alter table emp modify age int(3) first;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings:

(6)表改名

语法

ALTER TABLE tablename RENAME [TO] new_tablename

范例

例如,将表 emp 改名为 emp1,命令如下:
mysql> alter table emp rename emp1;
Query OK, 0 rows affected (0.00 sec)

2.2.3 DML 语句

1 .插入记录

语法

INSERT INTO tablename (field1,field2,……fieldn) VALUES(value1,value2,……valuesn);
可以一次性插入多条记录:
INSERT INTO tablename (field1, field2,……fieldn)
VALUES
(record1_value1, record1_value2,……record1_valuesn),
(record2_value1, record2_value2,……record2_valuesn),
……
(recordn_value1, recordn_value2,……recordn_valuesn)
;

范例

例如,向表 emp 中插入以下记录:ename 为 zzx1,hiredate 为 2000-01-01,sal 为 2000,deptno为 1,命令执行如下:
mysql> insert into emp (ename,hiredate,sal,deptno) values('zzx1','2000-01-01','2000',1);
Query OK, 1 row affected (0.00 sec)

一次性插入多条记录,对表 dept 一次插入两条记录:
mysql> insert into dept values(5,'dept5'),(6,'dept6');
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0

2 .更新记录

语法

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

更新多个表中数据:UPDATE t1,t2…tn set t1.field1=expr1,tn.fieldn=exprn [WHERE CONDITION]

范例

例如,将表 emp 中 ename 为“lisa”的薪水(sal)从 3000 更改为 4000:
mysql> update emp set sal=4000 where ename='lisa';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

同时更新表 emp 中的字段 sal 和表 dept 中的字段 deptname:
mysql>  update  emp  a,dept b  set  a.sal=a.sal*b.deptno,b.deptname=a.ename  where
a.deptno=b.deptno;
Query OK, 3 rows affected (0.04 sec)
Rows matched: 5 Changed: 3 Warnings: 0

3 .删除记录

语法

DELETE FROM tablename [WHERE CONDITION]

一次删除多个表的数据
DELETE t1,t2…tn FROM t1,t2…tn [WHERE CONDITION]

范例

例如,在 emp 中将 ename 为‘dony’的记录全部删除,命令如下:
mysql> delete from emp where ename='dony';
Query OK, 1 row affected (0.00 sec)

将表 emp 和 dept 中 deptno 为 3 的记录同时都删除:
mysql> delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;
Query OK, 2 rows affected (0.04 sec)

4 .查询记录

基本语法

SELECT * FROM tablename [WHERE CONDITION]

(1)查询不重复的记录。

语法

可以用 distinct 关键字来实现

范例

mysql> select ename,hiredate,sal,deptno from emp;
+--------+------------+---------+--------+
| ename | hiredate | sal | deptno |
+--------+------------+---------+--------+
| zzx | 2000-01-01 | 2000.00 | 1 |
| lisa | 2003-02-01 | 4000.00 | 2 |
| bjguan | 2004-04-02 | 5000.00 | 1 |
+--------+------------+---------+--------+
3 rows in set (0.00 sec)
mysql> select distinct deptno from emp;
+--------+
| deptno |
+--------+
| 1 |
| 2 |
+--------+
2 rows in set (0.00 sec)

(2)条件查询。

(3)排序和限制。

语法

SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC],field2 [DESC|ASC],……fieldn [DESC|ASC]]
其中,DESC 和 ASC 是排序顺序关键字,DESC 表示按照字段进行降序排列,ASC 则表示升序排列,如果不写此关键字默认是升序排列

SELECT ……[LIMIT offset_start,row_count]
其中 offset_start 表示记录的起始偏移量,row_count 表示显示的行数。

(4)聚合。

语法

SELECT [field1,field2,……fieldn] fun_name
FROM tablename
[WHERE where_contition]
[GROUP BY field1,field2,……fieldn
[WITH ROLLUP]]
[HAVING where_contition]

 fun_name 表示要做的聚合操作,也就是聚合函数,常用的有 sum(求和)、count(*)(记
录数)、max(最大值)、min(最小值)。
 GROUP BY 关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门
就应该写在 group by 后面。
 WITH ROLLUP 是可选语法,表明是否对分类聚合后的结果进行再汇总。
 HAVING 关键字表示对分类后的结果再进行条件的过滤。

范例

要 emp 表中统计公司的总人数:
mysql> select count(1) from emp;
+----------+
| count(1) |
+----------+
| 4 |
+----------+
1 row in set (0.00 sec)

要统计各个部门的人数:
mysql> select deptno,count(1) from emp group by deptno;
+--------+----------+
| deptno | count(1) |
+--------+----------+
| 1 | 2 |
| 2 | 1 |
| 4 | 1 |
+--------+----------+
3 rows in set (0.00 sec)

更细一些,既要统计各部门人数,又要统计总人数:
mysql> select deptno,count(1) from emp group by deptno with rollup;
+--------+----------+
| deptno | count(1) |
+--------+----------+
| 1 | 2 |
| 2 | 1 |
| 4 | 1 |
| NULL | 4 |
+--------+----------+
4 rows in set (0.00 sec)

(5)表连接。

内连接

范例

例如,查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表 emp 和dept 中,因此,需要使用表连接来进行查询:
mysql> select ename,deptname from emp,dept where emp.deptno=dept.deptno;
+--------+----------+
| ename | deptname |
+--------+----------+
| zzx | tech |
| lisa | sale |
| bjguan | tech |
| bzshen | hr |
+--------+----------+
4 rows in set (0.00 sec)

外连接

左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录

范例

查询 emp 中所有用户名和所在部门名称:
mysql> select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
+--------+----------+
| ename | deptname |
+--------+----------+
| zzx | tech |
| lisa | sale |
| bjguan | tech |
| bzshen | hr |
| dony | |
+--------+----------+
5 rows in set (0.00 sec)
比较这个查询和上例中的查询,都是查询用户名和部门名,两者的区别在于本例中列出了所有的用户名,即使有的用户名(dony)并不存在合法的部门名称(部门号为 4,在 dept 中没有这个部门);而上例中仅仅列出了存在合法部门的用户名和部门名称。

右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录

(6)子查询。

语法

某些情况下,当我们查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就要用到子查询。用于子查询的关键字主要包括 in、not in、=、!=、exists、not exists 等

范例

mysql> select * from emp where deptno = (select deptno from dept);
mysql> select * from emp where deptno in(select deptno from dept);

(7)记录联合。

语法

SELECT * FROM t1
UNION|UNION ALL
SELECT * FROM t2
……
UNION|UNION ALL
SELECT * FROM tn;

范例

mysql> select deptno from emp
-> union all
-> select deptno from dept;
+--------+
| deptno |
+--------+
| 1 |
| 2 |
| 1 |
| 4 |
| 1 |
| 2 |
| 5 |
+--------+

如果希望将结果去掉重复记录后显示:
mysql> select deptno from emp
-> union
-> select deptno from dept;
+--------+
| deptno |
+--------+
| 1 |
| 2 |
| 4 |
| 5 |
+--------+
4 rows in set (0.00 sec)

2.2.4 DCL 语句

是什么

DCL 语句主要是 DBA 用来管理系统中的对象权限时所使用,一般的开发人员很少使用

范例

创建一个数据库用户 z1,具有对 sakila 数据库中所有表的 SELECT/INSERT 权限:
mysql> grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)

由于权限变更,需要将 z1 的权限变更,收回 INSERT,只能对数据进行 SELECT 操作:
[mysql@db3 ~]$ mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 21757 to server version: 5.1.9-beta-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> revoke insert on sakila.* from 'z1'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye

2.3 帮助的使用

2.3.1 按照层次看帮助

按照层次看帮助
“? contents” 命令 用来显示所有可供查询的分类,对于列出的分类 ,可以 使用 “? 类别名称”进一步查看帮助。

2.3.2 快速查阅帮助

可以使用关键字进行快速查询

例如,想知道 show 命令都能看些什么东西,可以用如下命令:
mysql> ? show
Name: 'SHOW'
Description:
SHOW has many forms that provide information about databases, tables,
columns, or status information about the server. This section describes
those following:
SHOW AUTHORS
SHOW CHARACTER SET [LIKE 'pattern']
SHOW COLLATION [LIKE 'pattern']
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern']
SHOW CONTRIBUTORS
SHOW CREATE DATABASE db_name
SHOW CREATE EVENT event_name
SHOW CREATE FUNCTION funcname

深入浅出mysql-sql基础相关推荐

  1. MySQL SQL基础DML

     我们先附上表创建的代码 -- 查询数据 -------------------------- -- 数据准备 create table user(id int comment '编号',workno ...

  2. mysql指令按顺序排列_《深入浅出MySQL》读书笔记(一)sql基础,常用的操作语句。...

    之前对于数据库一直都是用过的程序,没有系统学过,在面试时吃过不少亏,说不出个所以然,我还是好好康康比较靠谱,秋招都快过了,我好慌啊淦. 第一章.MySQL的安装与配置. 启动服务:打开到mysql对应 ...

  3. 深入浅出Mysql - 基础篇(列类型/运算符/函数)

    深入浅出Mysql - 基础篇(列类型/运算符/函数) 每一个常量.变量和参数都有数据类型,它用来指定一定的存储格式.约束和有效范围.MySQL提供了多种数据类型,主要包括数值型.字符串类型.日期和时 ...

  4. sql基础教程和mysql基础教程_书评「SQL基础教程(第2版)」| 你应该知道的基础知识点梳理·上...

    写在前面关于这本书:SQL的基础教程,可以使你在SQL的学习中轻松实现从0到1的过程,循序渐进地掌握SQL的基础知识和技巧.对于零基础来说非常友好,看完能够迅速上手SQL. 关于本文:一篇对这本书的知 ...

  5. concat mysql sql注入_sql注入-mysql注入基础及常用注入语句

    最近在教学中,关于SQL注入,总发现学生理解起来有些难度,其实主要的原因是对各类数据库以及SQL语句不熟悉,今天先介绍mysql注入需要掌握的基础, Mysql内置information_schema ...

  6. (2.13)Mysql之SQL基础——触发器

    (2.13)Mysql之SQL基础--触发器 关键词:Mysql触发器 二.触发器 MySQL语句在需要时被执行,存储过程也是如此,如果希望某条语句(或某些语句)在事件发生时自动执行,这就需要用到触发 ...

  7. SQL基础操作_3_数据字典(涵盖SQL Server、Oracle、Mysql常见系统数据字典)

    目录 数据库元数据查询 7.5.1 列出模式中所有的表 7.5.2 列出所有的数据库 7.5.3 列出给定表的基本信息 7.5.4 列出给定表的索引信息 7.5.5 列出给定表的主键.外键约束 7.5 ...

  8. SQL 100+个最佳入门案例实践(覆盖Oralce、SQL Server、Mysql)之基础操作_1_检索数据

    SQL基础操作_1_检索数据 目录 7.1.1 数据集 7.1.2 学生选课关系表 7.1.3 供应商关系表 7.2.1 从表中查询所有行和列 7.2.2 从表中查询部分行 7.2.3 查询满足某个条 ...

  9. mysql 算子 谓词_[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式

    SQL 基础知识梳理(六)-  函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为"参数",输出值称 ...

  10. MySQL数据库基础(五)——SQL查询

    MySQL数据库基础(五)--SQL查询 一.单表查询 1.查询所有字段 在SELECT语句中使用星号""通配符查询所有字段 在SELECT语句中指定所有字段 select fro ...

最新文章

  1. 实战并发编程 - 08基于Guarded Suspension模式优化轮询while(true)
  2. poj 1966(顶点连通度)
  3. 计算机编程工程师理论知识,结构工程师基础知识点:程序设计语言
  4. tensorflow 笔记 16:tf.pad
  5. JSP的改动需要重启应用服务器才能生效?
  6. 转:聊聊开发中幂等性问题(*)
  7. VM安装失败 Failed to create the requested registry key Key:installer Error:1021
  8. linux精灵进程之crond
  9. Java编程中“为了性能”尽量要做的26点
  10. 根据select的选项不同跳转到不同的页面
  11. 201671010139 徐楠 关于学习继承
  12. Unicode与UTF8:字符集与字符编码的关系
  13. 网站采集工具免费采集发布网站后台
  14. 【转】人脸识别:AI产品经理需要了解的CV通识
  15. 关于linux fc多路径巡检
  16. NYOJ 237 NYOJ 239 二分图 最大匹配模板题 游戏高手的烦恼 月老的难题 两个题一样
  17. GeoGebra 实例 时钟
  18. 计算机病毒主动传播途径,蠕虫病毒的传播方式是什么
  19. react-emotion_如何使用Web Speech API和Node.js构建语音转Emotion Converter
  20. Swan Song 第七周Scrum Meeting

热门文章

  1. 【转】GIS:为什么我和别的软件不一样
  2. 小程序ColorUI使用简易教程
  3. K3wise数据字典及常用表及视图
  4. android 手机无线投屏,安卓手机无线投屏问与答
  5. 2020计算机保研系列「最终篇」 —— 我所参加过的高校考核(北大信工/清华Open Fiesta/清华-伯克利/港中文深圳/浙大人工智能/浙大软件/上交软件/中科大先研院/复旦计算机)
  6. linux如何添加虚拟打印机,Linux下虚拟打印机CUPS-PDF教程
  7. 如何用思维导图快速理解PMBOK-PMP第六版教材
  8. QT TCP网络编程
  9. 冒泡排序(Bubble Sort)详解与代码
  10. H264视频编码原理