SQL结构化查询语言:
DDL(数据定义语言):用于创建删除数据库对象等操作 create(创建) drop(删除) alter(修改)
DML(数据操作语言):用来操作数据库中所包含的数据 insert (插入) update (修改) delete (删除)
DQL(数据查询语言):用来对数据库中的数据进行查询 select(查询)
DCL(数据控制语言):用来控制数据库组件的存取许可,存取权限等。 grant(授权) commit(提交) rollback(回滚)
创建数据库
语法:CREATE DATABASE 数据库名; (分号为结束符,不可缺)
查看数据库列表
语法:SHOW databases;
选择数据库
语法:USE 数据库名;
使用数据前必须先选择该数据库!若数据库不存在,报错。
删除数据库
语法:DROP DATABASE 数据库名;
数值类型
UNSIGNED属性———标识为无符号数
ZEROFILL属性———宽度(位数)不足以0填充
若某数值字段指定了ZEROFILL属性,将自动添加UNSIGNED属性
字符串类型
日期类型
若某日期字段默认值为当前日期,一般设置为TIMESTAMP类型
创建表
语法:CREATE TABLE [IF NOT EXISTS] 表名 (
字段1 数据类型 [字段属性|约束][索引][注释],
……
字段n 数据类型 [字段属性|约束][索引][注释]
)[表类型][表字符集][注释];
#创建学生表
CREATE TABLE `student`(
`studentNo` INT(4) PRIMARY KEY,
` name` CHAR(10),
……);
多字段使用逗号分隔。
保留字用撇号括起来。
查看表定义
语法: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 主键名
插入单条数据记录
语法: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语句快
语法:
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`;
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. 只出现在子查询中而没有出现在父查询中的列不能包含在输出列中
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地址’;