MYSQL语言 DDL DML DQL DCL

SQL结构化查询语言
DDL(数据定义语言):用于创建删除数据库对象等操作 create(创建) drop(删除) alter(修改)
DML(数据操作语言):用来操作数据库中所包含的数据 insert (插入) update (修改) delete (删除)
DQL(数据查询语言):用来对数据库中的数据进行查询 select(查询)
DCL(数据控制语言):用来控制数据库组件的存取许可,存取权限等。 grant(授权) commit(提交) rollback(回滚)

1 DDL语句

数据库操作

创建数据库
语法:CREATE DATABASE 数据库名; (分号为结束符,不可缺)

查看数据库列表
语法:SHOW databases;

选择数据库
语法:USE 数据库名;

使用数据前必须先选择该数据库!若数据库不存在,报错。

删除数据库
语法:DROP DATABASE 数据库名;

MySQL数据类型

数值类型
MYSQL语言 DDL DML DQL DCL_第1张图片
UNSIGNED属性———标识为无符号数
ZEROFILL属性———宽度(位数)不足以0填充
若某数值字段指定了ZEROFILL属性,将自动添加UNSIGNED属性
字符串类型
MYSQL语言 DDL DML DQL DCL_第2张图片
日期类型
MYSQL语言 DDL DML DQL DCL_第3张图片
若某日期字段默认值为当前日期,一般设置为TIMESTAMP类型

表格操作

创建表
语法:CREATE TABLE [IF NOT EXISTS] 表名 (
字段1 数据类型 [字段属性|约束][索引][注释],
……
字段n 数据类型 [字段属性|约束][索引][注释]
)[表类型][表字符集][注释];

#创建学生表
CREATE TABLE `student``studentNo` INT(4)  PRIMARY KEY,
     ` name` CHAR(10),
     ……);

多字段使用逗号分隔。
保留字用撇号括起来。

字段的约束及属性

MYSQL语言 DDL DML DQL DCL_第4张图片
查看表
查看表是否存在
语法:SHOW tables;

查看表定义
语法:DESCRIBE 表名;

语法:DESC 表名;

删除表
语法:DROP TABLE [IF EXISTS] 表名;
(在删除表之前,先使用IF EXISTS语句验证表是否存在)

修改表

修改表名
语法:ALTER TABLE 旧表名 RENAME [TO] 新表名;

添加字段
语法:ALTER TABLE 表名 ADD 字段名 数据类型 [属性];

修改字段
语法:ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型 [属性];

删除字段
语法:ALTER TABLE 表名 DROP 字段名;

DROP TABLE IF EXISTS `demo01`;
#创建表
CREATE TABLE  `demo01`(
   `id` INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
   `name` VARCHAR(8) NOT NULL
);
#修改表名
ALTER TABLE `demo01` RENAME `demo02`;
#添加字段
ALTER TABLE ` demo02 ` ADD `password` VARCHAR(32) NOT NULL;
#修改字段
ALTER TABLE ` demo02 ` CHANGE `name` `username`CHAR(10) NOT NULL;
#删除字段
ALTER TABLE ` demo02 ` DROP `password`;
修改表字段约束

添加外键
语法:
ALTER TABLE 表名 ADD CONSTRAINT 外键名
FOREIGN KEY(外键字段)
REFERENCES 关联表名(关联字段);
添加主键
语法:
ALTER TABLE 表名 ADD CONSTRAINT 主键名
PRIMARY KEY 表名(主键字段);
删除主键
ALTER TABLE 表名 DROP CONSTRAINT 主键名

2 DML语句

数据插入

插入单条数据记录
语法:INSERT INTO 表名 [(字段名列表)] VALUES (值列表);

注意:
- 字段名是可选的,如省略则依次插入所有字段
- 多个列表和多个值之间使用逗号分隔
- 值列表和字段名列表一一对应
- 如插入的是表中部分数据,字段名列表必填

插入多条数据记录
语法:
INSERT INTO 新表(字段名列表)
VALUES(值列表1),(值列表2),……,(值列表n);

INSERT INTO `subject`(`subjectName`,`classHour`,`gradeID`)
VALUES('Logic Java',220,1),('HTML',160,1),('Java OOP',230,2);

将查询结果插入新表
语法:CREATE TABLE 新表名 (SELECT 字段名,字段名,….. FROM 表名 );
如新表已存在,将会报错!

将查询结果插入已存在的表里
语法:
INSERT INTO 表名(存在的) (SELECT * FROM 表名(查询的));

数据更新

语法:
UPDATE 表名
set 字段1=值1,字段2=值2,……
WHERE 条件

UPDATE student SET sex = ‘女’;
UPDATE student SET address = ‘北京女子职业技术学校家政班’
WHERE address = ‘北京女子职业技术学校刺绣班’;

where若不写,则代表更新所有数据。

数据删除

语法:DELETE FROM 表名 [WHERE条件];
或者 语法:TRUNCATE TABLE 表名;

TRUNCATE语句删除后将重置自增列,表结构及其字段、约束、索引保持不变,执行速度比DELETE语句快

3 DQL 数据查询

语法:
SELECT <列名|表达式|函数|常量>
FROM <表名>
[WHERE <查询条件表达式>]
[group by 分组字段,sex ]
[ORDER BY <排序的列名>[ASC或DESC]]; 默认升序 加DESC改为降序

解释:
WHERE子句
用来筛选 FROM 子句中指定的操作所产生的行
GROUP BY子句
用来分组 WHERE 子句的输出
HAVING子句
用来从分组的结果中筛选行

SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate` 
FROM `student`
WHERE `gradeId` = 1
ORDER BY `studentNo`;

查询全部的行和列
SELECT * FROM 表名;

使用AS命名列

SELECT `studentNo`  AS 学生编号,`studentName` AS 学生姓名,
        `address `AS 学生地址  
FROM `student`
WHERE `address` <> '河南新乡‘;

查询学生表中地址不是河南新乡所有学生的姓名,编号,地址。

SELECT `firstName` + '.' + `lastName` AS 姓名 
FROM `employees`;

注意:
1. + 连接的数据类型必须兼容
2. 如果 + 连接字符型数据,结果为字符串数据的连接
3. 如果 + 连接数值型数据,结果为数值的和

数据查询-空行、常量列
查询空行
示列:

SELECT `studentName` FROM `student` WHERE `email` IS NULL;

使用常量列
示列:

SELECT `studentName` AS 姓名,`address` AS 地址,
’北京信息中心’ AS 学校名称
FROM `student`;
3.1 LIMIT子句

MySQL查询语句中使用LIMIT子句限制结果集
SELECT <字段名列表>
FROM <表名或视图>
[WHERE <查询条件>]
[GROUP BY <分组的字段名>]
[ORDER BY <排序的列名>[ASC 或 DESC]]
[LIMIT [位置偏移量,]行数];

使用LIMIT子句时,注意第1条记录的位置是0!

子查询
子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询
子查询在WHERE语句中的一般用法

语法:SELECT … FROM 表1 WHERE 字段1 比较运算符(子查询)

注意:
将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个

示列:

#编写SQL语句,查看年龄比“李斯文”小的学生,要求显示这些学生的信息 
#第一步:查询得到“李斯文”的出生日期
SELECT `bornDate` FROM `student` WHERE `studentName` = '李斯文';
#第二步:利用WHERE语句,筛选出生日期比“李斯文”大的学生
SELECT `studentNo`, `studentName`,`sex`,`bornDate`,`address` FROM `student` WHERE bornDate > '1993-07-23';

而用子查询

SELECT `studentNo`,`studentName`,`sex`,`bornDate`,`address`
 FROM `student` 
 WHERE `bornDate` > 
(SELECT `bornDate` FROM `student` WHERE `studentName`='李斯文');

IN/NOT IN 子查询
常用IN 替换(=)的子查询;IN后面的子查询可以返回多条记录
示列:
查询参加“Logic Java”课程最近一次考试的在读学生名单
分析:

# 1 获得 “Logic Java”课程的课程编号
SELECT `subjectNo` FROM `subject`
 WHERE `subjectName`='Logic Java';
# 2 根据课程编号查询得到“Logic Java”课程最近一次的考试日期
SELECT MAX(`examDate`) FROM `result` WHERE `subjectNo`= (
SELECT `subjectNo` FROM `subject` 
WHERE `subjectName`='Logic Java' );
# 根据课程编号和最近一次的考试日期查询出在读学生信息
SELECT `studentNo`, `studentName` FROM `student` 
WHERE `studentNo IN (
  SELECT `studentNo` FROM `result` 
  WHERE `subjectNo` IN (
      SELECT `subjectNo` FROM `subject` 
      WHERE `subjectName`=' Logic Java'
   ) AND `examDate` = (
        SELECT MAX(`examDate`) FROM `result` 
        WHERE `subjectNo` = ( 
             SELECT `subjectNo` FROM `subject` 
             WHERE `subjectName`='Logic Java '  
        ) 
   )
);

EXISTS子查询
子查询有返回结果: EXISTS子查询结果为TRUE
子查询无返回结果: EXISTS子查询结果为FALSE,
外层查询不执行
语法:

select ..... from 表名 where exists(子查询);

子查询注意事项:
1. 任何允许使用表达式的地方都可以使用子查询
2. 嵌套在父查询SELECT语句的子查询可包括
SELECT子句
FROM子句
WHERE子句
GROUP BY子句
HAVING子句
3. 只出现在子查询中而没有出现在父查询中的列不能包含在输出列中

4 DCL数据控制

DCL是root这个超级管理员所使用的操作,主要用啦对其他数据库的操作用户进行设置

1、创建用户

create user 用户名@IP地址 identified by 密码;

例:create user zhagsan@localhost identified by ‘1234’;

当想要使用这个账户登录系统的时候

mysql -uzhangsan -p1234

2、给用户授权

grant 权限1,权限2,权限3… on 数据库名称.* to 用户名@’IP地址’;

数据库名称.* :表示数据库的所有文件包括记录表、其他文件等等

权限:CREATE/ALTER/DROP/INSERT/UPDATE/DELETE/SELECT

3、撤销授权

revoke 权限1,权限2,权限3… on 数据库名称.* to 用户名@’IP地址’;

4、查看权限

show grants for 用户名@’IP地址’;

5、删除用户

drop user 用户名@’IP地址’;

你可能感兴趣的:(MYSQL语言 DDL DML DQL DCL)