MySql数据库系列阅读
- MySQL数据库
- MySQL数据库:SQL语句
- MySQL数据库:完整性约束
- MySQL数据库备份与还原
- MySQL数据库:编码
1. SQL概述
1.1 什么是SQL
SQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中,例如:MySQL、Oracle、SQL Server等。SQ标准(ANSI/ISO)有:
- SQL-92:1992年发布的SQL语言标准
- SQL:1999:1999年发布的SQL语言标签
- SQL:2003:2003年发布的SQL语言标签
这些标准就与JDK的版本一样,在新的版本中总要有一些语法的变化。不同时期的数据库对不同标准做了实现。
虽然SQL可以用在所有关系型数据库中,但很多数据库还都有标准之后的一些语法,我们可以称之为“方言”。例如MySQL中的LIMIT语句就是MySQL独有的方言,其它数据库都不支持!当然,Oracle或SQL Server都有自己的方言。
SQL的作用:客户端使用SQL来操作服务器
1.2 语法要求
SQL标准(例如SQL99,即1999年制定的标准):由国际标准化组织(ISO)制定的,对DBMS的统一操作方式(例如相同的语句可以操作:mysql、oracle等)。
SQL方言:某种DBMS不只会支持SQL标准,而且还会有一些自己独有的语法,这就称之为方言!例如limit语句只在MySQL中可以使用
SQL语法
- SQL语句可以单行或多行书写,以分号结尾
- 可以用空格和缩进来来增强语句的可读性
- 关键字不区别大小写,建议使用大写
2. 分类
- DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等
- DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)
- DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别
- DQL(Data Query Language):数据查询语言,用来查询记录(数据)
3. DDL:数据定义语言
3.1 基本操作
- 查看所有数据库名称:SHOW DATABASES;
- 切换数据库:USE mydb1,切换到mydb1数据库;
3.2 操作数据库
- 创建数据库:CREATE DATABASE [IF NOT EXISTS] mydb1;
例如:CREATE DATABASE mydb1,创建一个名为mydb1的数据库。如果这个数据已经存在,那么会报错。例如CREATE DATABASE IF NOT EXISTS mydb1,在名为mydb1的数据库不存在时创建该库,这样可以避免报错
- 删除数据库:DROP DATABASE [IF EXISTS] mydb1;
例如:DROP DATABASE mydb1,删除名为mydb1的数据库。如果这个数据库不存在,那么会报错。DROP DATABASE IF EXISTS mydb1,就算mydb1不存在,也不会的报错
- 修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET utf8;
修改数据库mydb1的编码为utf8。注意,在MySQL中所有的UTF-8编码都不能使用中间的“-”,即UTF-8要书写为UTF8
3.3 数据类型
MySQL与Java一样,也有数据类型。MySQL中数据类型主要应用在列上。常用类型如下:
类型 |
说明 |
int |
整型 |
double |
浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99 |
decimal |
浮点型,在表单钱方面使用该类型,因为不会出现精度缺失问题 |
char |
固定长度字符串类型 |
varchar |
可变长度字符串类型 |
text |
字符串类型 |
blob |
字节类型 |
date |
日期类型,格式为:yyyy-MM-dd |
time |
时间类型,格式为:hh:mm:ss |
timestamp |
时间戳类型 |
3.4 操作表
创建表:
CREATE TABLE 表名(
列名 列类型,
列名 列类型,
......
);
例如:
CREATE TABLE stu(
sid CHAR(6),
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
);
再例如:
CREATE TABLE emp(
eid CHAR(6),
ename VARCHAR(50),
age INT,
gender VARCHAR(6),
birthday DATE,
hiredate DATE,
salary DECIMAL(7,2),
resume VARCHAR(1000)
);
SHOW TABLES; /*查看当前数据库中所有表名称*/
SHOW CREATE TABLE emp;/*查看emp表的创建语句*/
DESC emp; /*查看emp表结构*/
DROP TABLE emp; /*删除emp表*/
修改表:add,modify,change,drop
/*修改之添加列:给stu表添加classname列*/
ALTER TABLE stu ADD (classname varchar(100));
/*修改之修改列类型:修改stu表的gender列类型为CHAR(2)*/
ALTER TABLE stu MODIFY gender CHAR(2);
/*修改之修改列名:修改stu表的gender列名为sex*/
ALTER TABLE stu change gender sex CHAR(2);
/*修改之删除列:删除stu表的classname列*/
ALTER TABLE stu DROP classname;
/*修改之修改表名称:修改stu表名称为student*/
ALTER TABLE stu RENAME TO student;
4. DML:数据操作语言
4.1 插入数据
语法:INSERT INTO 表名(列名1,列名2, …) VALUES(值1, 值2)
INSERT INTO stu(sid, sname,age,gender) VALUES('s_1001', 'zhangSan', 23, 'male');
INSERT INTO stu(sid, sname) VALUES('s_1001', 'zhangSan');
因为没有插入age和gender列的数据,所以该条记录的age和gender值上为NULL
语法:INSERT INTO 表名 VALUES(值1,值2,…)
因为没有指定要插入的列,表示按创建表时列的顺序插入所有列的值:
INSERT INTO stu VALUES('s_1002', 'liSi', 32, 'female');
注意:所有字符串数据必须使用单引用!
4.2 修改数据
语法:UPDATE 表名 SET 列名1=值1, … 列名n=值n [WHERE 条件]
UPDATE stu SET sname=’zhangSanSan’, age=’32’, gender=’female’ WHERE sid=’s_1001’;
UPDATE stu SET sname=’liSi’, age=’20’ WHERE age>50 AND gender=’male’;
UPDATE stu SET sname=’wangWu’, age=’30’ WHERE age>60 OR gender=’female’;
UPDATE stu SET gender=’female’ WHERE gender IS NULL
UPDATE stu SET age=age+1 WHERE sname=’zhaoLiu’;
4.3 删除数据
语法:DELETE FROM 表名 [WHERE 条件]
DELETE FROM stu WHERE sid=’s_1001’003B
DELETE FROM stu WHERE sname=’chenQi’ OR age > 30;
DELETE FROM stu;
语法:TRUNCATE TABLE 表名
TRUNCATE TABLE stu;
虽然TRUNCATE和DELETE都可以删除表的所有记录,但有原理不同。DELETE的效率没有TRUNCATE高!
TRUNCATE其实属性DDL语句,因为它是先DROP TABLE,再CREATE TABLE。而且TRUNCATE删除的记录是无法回滚的,但DELETE删除的记录是可以回滚的(回滚是事务的知识!)。
5. DCL:数据控制语言
5.1 创建用户
语法:CREATE USER 用户名@地址 IDENTIFIED BY ‘密码’;
CREATE USER user1@localhost IDENTIFIED BY ‘123’;
CREATE USER user2@’%’ IDENTIFIED BY ‘123’;
5.2 给用户授权
语法:GRANT 权限1, … , 权限n ON 数据库.* TO 用户名
GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
GRANT ALL ON mydb1.* TO user2@localhost;
5.3 撤销授权
语法:REVOKE权限1, … ,