SQL语言基础(一)DDL DML
SQL语言概述
SQL语言介绍
SQL(Structured Query Language) 是结构化查询语言的缩写,使用SQL和DBMS进行交互,操纵关系型数据库中的资源。
SQL是数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但为了加强SQL的语言能力,各个厂商都增加了特有内容。
SQL语言分类
数据定义语言(DDL):Data Definition Language,用来定义数据库的对象,如数据表、视图、索引等。
数据操纵语言(DML):Data Manipulation Language,用来在数据库表中更新,增加和删除记录。
事务控制语言(TCL):Transaction Control Language,用来做数据库中的事务管理。
数据查询语言(DQL):Data Query Language,用来查询数据库中的数据。
数据控制语言(DCL):Data Control Language,用来控制数据库的用户权限。
SQL语言特点
1、不区分大小写,关键字建议使用大写,而数据库名,数据表名,列名建议使用小写。
2、可以写成一行,也可以写成多行。
3、可使用空格和缩进来增强语句的可读。
4、3种注释:
单行注释:-- 注释内容 或 # 注释内容(MySQL特有)
多行注释:/* 注释内容 */
DDL数据定义语言
DDL(Data Definition Language):数据定义语言,用来定义数据库对象,库、表、列等;创建、删除、修改 库,表结构。主要分为操作数据库的DDL和操作表的DDL。
(一) 操作数据库的DDL
这里所提到的数据库不同于我们之前提到的MySQL数据库、Oracle数据库等。MySQL数据库中的”数据库”是指一个数据库管理系统(DBMS),而这里所提到的数据库是指用来组织和管理一些对象(表、视图等)的结构,简单可以理解问磁盘上的文件夹。
一个数据库服务器包含多个库。
一个数据库包含多张表。
一张表包含多条记录。
1. 创建数据库
(1)直接创建数据库
语法
CREATE DATABASE [IF NOT EXISTS] 数据库名
示例
CREATE DATABASE mydb1
或
CREATE DATABASE IF NOT EXISTS mydb2
(2)指定字符集方式创建数据库
语法
CREATE DATABASE [IF NOT EXISTS] 数据库名 CHARACTER SET 字符集
示例
CREATE DATABASE mydb3 CHARACTER SET UTF8
(3)指定字符集和排序规则方式创建数据库
语法
CREATE DATABASE[IF NOT EXISTS] 数据库名 CHARACTER SET 字符集 COLLATE 排序规则
示例
CREATE DATABASE mydb4 CHARACTER SET UTF8 COLLATE utf8_bin
排序规则说明
针对不同字符集,MySQL指定了不同的排序规则(可以参考MySQL的帮助文档)。
例如:utf8字符集中指定的 utf8_general_ci和 utf8_bin,对数据库中存储数据库的规则就有所不同。
utf8_general_ci:ci是 case insensitive, 即 "**大小写不敏感**", a 和 A 会在字符判断中会被当做一样的。
utf8_bin:将字符串每个字符串用二进制数据编译存储,**区分大小写**,而且可以存二进制的内容。
2. 查看数据库
(1)查看所有数据库
语法
SHOW databases
示例
SHOW databases
(2)查看指定数据库
语法
SHOW CREATE DATABASE 数据库名
示例
SHOW CREATE DATABASE db1
3. 修改数据库
只能修改数据库字符和排序规则,不能修改数据库名字。
语法
ALTER DATABASE 数据库名 CHARACTER SET 字符集 [COLLATE 排序规则]
修改mydb3的字符集为gbk 排序规则为 gbk_bin
alter database mydb3 character set gbk collate gbk_bin;
4. 删除数据库
语法
DROP DATABASE 数据库名
示例
#删除mydb3数据库
DROP DATABASE mydb3
5. 使用数据库
(1)查看正在使用的数据库
SELECT DATABASE()
(2)切换数据库
语法
USE 数据库名
示例
USE mydb1
(二) 操作表的DDL
表是一种数据库对象,表由若干个字段(列)组成。是我们在操作数据库时使用最为频繁的数据库对象。
1. 创建表
注意:在创建表之前,一定要先使用数据库(也就是说,表一定要创建在某个数据库中)
语法
CREATE TABLE 表名 (字段名1 数据类型,字段名2 数据类型,…,字段名n 数据类型)
建议写成如下格式:
CREATE TABLE 表名 (
字段名1 数据类型,
字段名2 数据类型,
...,
字段名n 数据类型
)
示例
#创建student表包含id,name,age,sex字段
CREATE TABLE student (
id INT,
name VARCHAR(20),
birthday date
)
2. 数据类型
(1)数值类型
整数类型
在建表时默认都是有符号的。
如要使用无符号的,在建表语句中指定。例如:id int unsigned
近似数类型
在MySQL中,可以通过浮点数和定点数来表示近似值。
浮点数
MySQL中的浮点数包括float和double两种,定义格式为float(M,D)、double(M,D)。
M-表示所存储的值共有M位(M的取值范围是0~255)
D-表示小数点后有D位(D的取值范围是0~30)
例如:float(7,4)存储的数据范围时-999.9999~999.9999。
定点数
decimal是MySQL的定点数。相较与浮点数定点数表示的近似值更加精确。定义格式为decimal(M,D)
M-表示所存储的值共有M位(M的默认取值是10,取值范围是1~65)
D-表示小数点后有D位(D的默认取值是0,取值范围是0~30)
(2)字符串类型
MySQL提供了多种针对字符串的存储类型。如下表所示
char和varchar
char和varchar两种类型相似,都是MySQL数据库中用来存储较短字符串格式的类型。但这两种类型的主要区别在于存储方式不同,char类型的长度是固定的,而varchar类型的长度是可变的。例如,存储字符串”abc”,char(5)表示存储的字符将占5个字节(包括2个空字符),而varchar(5)只占用3个字节的长度,5只是最大值,当存储的字符小于5个时,按实际长度存储。同时在检索时,char类型会删除尾部的空格,而varchar类型会保留尾部的空格。因为长度的问题,所以导致两种数据类型的数据寻址速度不同,如果字符在10个字节以内,推荐使用char。
(3)日期和时间类型
对于这些数据类型的选择,有如下使用准则:
1、如果要表示年月日,通常使用date。
2、如果要表示年月日时分秒,通常使用datetime。
3、如果要表示时分秒,通常使用time。
4、如果要表示年,通常使用year。
如果要表示当前系统的时间,通常使用timestamp。
timestamp和datetime
虽然timestamp类型和datetime类型一样可以表示日期时间,但两者存在差别。
1、timestamp类型存储的时间与MySQL数据库系统安装时所选的时区有关,在不同时区下查看的同一批数据将会得出不同的结果。
查看时区的SQL语句:
show variables like ‘time_zone’
默认与主机一致,显示结果为SYSTEM。
修改时区的SQL语句:
set time_zone=’+9:00’
#(设置为东9区)
2、两者的取值范围不同
datetime的取值范围是1000-01-01 00:00:00到9999-12-31 23:59:59
timestamp的取值范围是1970-01-01 00:00:01.000000到2038-01-19 03:14:07.999999’。
最常用类型总结:整数 int 、 浮点数 double 、字符串 varchar、日期 date。
3. 创建表示例
需求:创建employee表,包含字段,编号(id int)、姓名(emp_name varchar)、性别(gender enum(‘M’,’F’))、入职日期(hire_date date)、薪资(salary double)、简历(resume text)
create table employee(
id int,
emp_name varchar(100),
gender enum(‘M’,’F’),
hire_date date,
salary double,
resume text
)
4. 查看表
(1)查看所有表
show tables
(2)查看表结构
语法
DESC 表名
或
describe 表名
示例
DESC emp
(3)查看创建表的SQL语句
语法
SHOW CREATE TABLE 表名
示例
show create table emp
5. 复制表结构
语法
CREATE TABLE 新表名 LIKE 旧表名
示例
create table emp1 like emp
6. 修改表
(1)添加新列
语法
ALTER TABLE 表名 ADD 列名 类型
示例
alter table student add remark varchar(200)
(2)修改列的类型
语法
ALTER TABLE 表名 MODIFY 列名 新的类型
示例
alter table student modify remark varchar(100)
(3)修改列名
语法
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型
示例
alter table student change remark intor varchar(100)
(4)删除列
语法
ALTER TABLE 表名 DROP 列名
示例
ALTER TABLE student DROP intor
(5)修改表名
语法
RENAME TABLE 表名 TO 新表名
示例
rename table student to student1
(6)修改字符集
语法
ALTER TABLE 表名 character set 字符集
示例
alter table student1 character set utf8
7. 删除表
语法
DROP TABLE 表名
示例
drop table student1;
DML 数据操作语言
对表中的数据进行增、删、改操作。
(一)插入记录
1. 指定字段的插入
语法
INSERT INTO 表名 (字段名 1, 字段名2...,字段n) VALUES (值1, 值2...,值n)
示例
# 更换数据库,创建student表
create table student(
id int,
name varchar(20),
age int,
sex char(1),
address varchar(100)
);
# 向学生表中添加 id, name, age, sex数据
INSERT INTO student (id, name, age, sex) VALUES (1, '张三', 20, '男');
注意事项
值与字段必须对应,个数相同,类型相同
值的数据大小必须在字段的长度范围内 varchar()
除了数值类型外,其它的字段类型的值必须使用引号引起(建议单引号)
如果要插入空值,可以不写字段,或者插入null
2. 不指定字段的插入
所有字段全部需要维护。
语法
INSERT INTO 表名 VALUES (值1, 值2…)
示例
INSERT INTO student VALUES (3, '王五', 18, '男', '北京');
注意事项
不指定列时,相当于指定了所有列,顺序和建表时的顺序一致。
3. 蠕虫复制
在已有的数据基础之上,将原来的数据进行复制,插入到对应的表中。
语法
INSERT INTO 表名1 SELECT * FROM 表名2;
示例
# 创建student2表,student2结构和student表结构一样
CREATE TABLE student2 LIKE student;
# 将student表中的数据添加到student2表中
INSERT INTO student2 SELECT * FROM student
(二)更新表记录
1. 不带条件更新
语法
UPDATE 表名 SET 字段1=值1[,字段2=值2,,...,字段n=值n]
示例
UPDATE student1 set sex='男';
说明
表中所有行的sex都会被更新为男
2. 带条件的更新
语法
UPDATE 表名 SET 字段1=值1[,字段2=值2,,...,字段n=值n][where 条件]
示例
# 将id号为2的学生性别改成女
UPDATE student SET sex='女' WHERE id=2;
(三)删除记录
1. 带条件删除
语法
DELETE FROM 表名 WHERE 条件
示例
#带条件删除数据,删除id为3的记录
DELETE FROM student WHERE id=3
2. 不带条件删除
语法
DELETE FROM 表名
示例
DELETE FROM student;
说明
不带条件的删除,将删除表中的全部数据。