SQL语言介绍
SQL是数据库标准化语言,所有关系型数据库都适用
DQL 数据查询语言
用以从表中获得数据,确定数据怎样在应用程序给出。
关键字:SELECT、FROM、WHERE、ORDER BY、HAVING
DML 数据操作语言(针对表中的数据)
INSERT:添加数据
UPDATE:更新数据
DELETE:删除数据
DDL 数据定义语言(针对数据库对象,比如数据库)
CREATE:创建数据库对象
ALTER:修改数据库对象
DROP:删除数据库对象
DCL 数据控制语言
GRANT:授予用户某种权限
REVOKE:回收授予的某种权限
TCL 事务控制语言
COMMIT:提交事务
ROLLBACK:回滚事务
SAVEPOINT:设置回滚点
SQL语句不区分大小写,关键字建议大写
SQL可以单行或多行书写,以分号结尾
创建与删除数据库
创建数据库:
sql
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符编码;
查看数据库编码:
sql
show databases
查看数据库编码(假设数据库名为test):
sql
select schema_name,default_character_set_name from information_schema.schemata
where schema_name = 'test';
删除数据库:
使用DDL语言删除数据库:
sql
DROP DATABASE 数据库名称
示例:
sql
drop database test
选择数据库
在创建表时,需要先选择数据库
sql
USE 数据库名;
MySQL中的数据类型
整数类型
|--------------|----------------------------------|
| MySQL数据类型 | 含义(有符号) |
| tinyint(m) | 1个字节 范围(-128~127) |
| smallint(m) | 2个字节 范围(-32768~32767) |
| mediumint(m) | 3个字节 范围(-8388608~8388607) |
| int(m) | 4个字节 范围(-2147483648~2147483647) |
| bigint(m) | 8个字节 范围(+-9.22*10的18次方) |
数值类型中的长度m是指显示长度,并不表示存储长度,只有字段指定zerofill时有用。
浮点类型
|-------------|---------------------------|
| MySQL数据类型 | 含义 |
| float(m,d) | 单精度浮点型8位精度(4字节)m总个数,d小数位 |
| double(m,d) | 双精度浮点型16位精度(8字节)m总个数,d小数位 |
字符类型
|------------|--------------------|
| MySQL数据类型 | 含义 |
| char(n) | 固定长度,最多255个字符 |
| tinytext | 可变长度,最多255个字符 |
| varchar(n) | 可变长度,最多65535个字符 |
| text | 可变长度,最多65535个字符 |
| mediumtext | 可变长度,最多2的24次方-1个字符 |
| longtext | 可变长度,最多2的32次方-1个字符 |
char和varchar:
char长度固定,即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定长。
varchar可变长度,可以设置最大长度;适合用在长度可变的属性。
text不设置长度,当不知道属性的最大长度时,适合用text。
按照查询速度:char最快,varchar次之,text最慢
字符串型使用建议:
经常变化的字段用varchar
知道固定长度的用char
尽量用varchar
超过255字符的只能用varchar或者text
能用varchar的地方不用text
日期类型
|-----------|--------------------------|
| MySQL数据类型 | 含义 |
| date | 日期 YYYY-MM-DD |
| time | 时间 HH:MM:SS |
| datetime | 日期时间 YYYY-MM-DD HH:MM:SS |
| timestamp | 时间戳 YYYYMMDD HHMMSS |
二进制数据(BLOB)
BLOB和TEXT存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以
二进制方式存储,不分大小写。
BLOB存储的数据只能整体读出。
TEXT可以指定字符集,BLOB不用指定字符集。
创建表与删除表
使用DDL语句创建表
sql
CREATE TABLE 表名(列名 类型,列名 类型......);
使用DDL语句删除表
sql
DROP TABLE 表名;
修改表
修改表名:
使用DDL语句修改表
sql
ALTER TABLE 旧表名 RENAME 新表名;
修改列名
sql
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 类型;
修改列类型
sql
ALTER TABLE 表名 MODIFY 列名 新类型;
添加新列
sql
ALTER TABLE 表名 ADD COLUMN 新列名 类型;
删除指定列
sql
ALTER TABLE 表名 DROP COLUMN 列名;
MySQL中的约束
约束:数据库提供的一种数据校验方式。
数据库约束是对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。
主键约束(Primary Key)PK
- 不允许为空
- 不允许有重复值出现
- 保证数据的唯一性
添加主键约束
单一主键:使用一个列作为主键列,当该列的值有重复时,则违反唯一约束
联合主键:使用多个列作为主键列,当多个列的值都相同时,则违反唯一约束
修改表添加主键约束:
sql
ALTER TABLE 表名 ADD PRIMARY KEY(列名)
主键自增长
MySQL中的自动增长类型要求:
- 一个表中只能有一个列为自动增长。
- 自动增长的列的类型必须是整数类型。
- 自动增长只能添加到具备主键约束与唯一性约束的列上。
- 删除主键约束或唯一性约束,如果该列拥有自动增长能力,则需要先去掉自动增长然后再删除约束。
sql
alter table 表名 modify 主键 类型 auto_increment;
删除主键约束
sql
ALTER TABLE 表名 DROP PRIMARY KEY;
删除主键时,如果主键列具备自动增长能力,需要先去掉自动增长,然后再删除主键
去掉自动增长:
sql
alter table 表名 modify 列名 类型;
外键约束(Foreign Key)
- 允许有空值
- 允许有重复
- 值必须是参照表的参照列中所包含的值
- 保证数据的参照完整性
添加外键约束
sql
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY(列名) REFERENCES 参照的表名(参照的列名);
删除外键约束
sql
ALTER TABLE 表名 DROP FOREIGN KEY 约束名;
唯一性约束(Unique)
- 相同值只能出现一次
- 允许为多个列添加唯一性约束
- 保证数据的唯一性
添加唯一性约束
sql
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列名);
删除唯一性约束
sql
ALTER TABLE 表名 DROP KEY 约束名
非空约束(Not Null)
- 列中不能有空值
- 允许重复值
- 允许为多个列添加非空约束
- 保证数据没有空值
添加非空约束
sql
ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL;
删除非空约束
sql
ALTER TABLE 表名 MODIFY 列名 类型 NULL;
检查约束(Check)
- 用户自己定义约束条件
- 保证数据满足自定义的条件约束
- MySQL目前不支持检查约束
创建表时添加约束
查询表中的约束信息:
sql
SHOW KEYS FROM 表名;
示例:
创建depts表包含department_id该列为主键且自动增长,department_name列不允许重复,location_id列不允许含有空值。
sql
create table depts(department_id int primary key
auto_increment, department_name varchar(30) unique,leocation_id
int not null);
MySQL中DML操作
insert 添加数据
update 更新数据
delete 删除数据
添加数据
选择插入:
sql
INSERT INTO 表名(列名1,列名2,列名3......)VALUES(值1,值2,值3......)
完全插入:
sql
INSERT INTO 表名 VALUES(值1,值2,值3......);
如果主键是自动增长,需要使用default或者null或者0占位。
默认值处理
在MySQL中可以使用DEFAULT为列设定一个默认值。如果在插入数时并未指定该列的
值,那么MySQL会将默认值添加到该列中。
创建表时指定列的默认值:
sql
CREATE TABLE 表名(列名 类型 default 默认值,...... );
修改表添加新列并指定默认值:
sql
ALTER TABLE 表名 ADD COLUMN 列名 类型 DEFAULT 默认值;
插入数据时的默认值处理:
如果在插入数据时并未指定该列的值,那么MySQL会将默认值添加到该列中。如果是完全
项插入需要使用default来占位。
更新数据(UPDATE)
sql
UPDATE 表名 SET 列名=值,列名=值 WHERE 条件;
注意:更新语句中一定要给定更新条件,否则表中的所有数据都会被更新。
示例:
更新emp3表中的id为1的数据,添加address为Beijing。
sql
update emp3 set address = "BeiJing" where emp_id = 1;
删除数据(DELETE)
DELETE删除数据
sql
DELETE FROM 表名 WHERE条件;
注意:在DELETE语句中,如果没有给定删除条件则会删除表中的所有数据。
示例:
删除emp3表中emp_id为1的雇员信息。
sql
delete from emp3 where emp_id = 1;
TRUNCATE清空表
sql
TRUNCATE TABLE 表名;
清空表时DELETE与TRUNCATE区别:
- truncate是整体删除(速度较快),delete是逐条删除(速度较慢);
- truncate不写服务器log,delete写服务器log,这也是truncate效率比delete高的原因;
- truncate是会重置自增值,相当于自增列会被置为初始值,又重新从1开始记录,而不是接着原来的值。而delete删除以后,自增值仍然会继续累加。
MySQL的DQL 查询数据
在 MySQL 中,SELECT 是 DQL 查询的核心语句,作用是从数据表中查询并返回需要的数据:
- 选取字段(列筛选) 按需指定数据表中的字段,查询后只展示选中字段的数据,不需要的字段可以直接忽略。
- 筛选数据行(行过滤) 通过设置筛选条件,只查询满足条件的数据行,避免查询整张表全部数据。
- 多表连接查询 当业务数据分散在多张不同数据表时,依靠关联条件把多张表的数据拼接整合,一次性查询所需的关联数据。
SELECT基本语法:
sql
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table;
- SELECT 指定列
- FROM 指定表
|----------------------|-------------|
| 语句 | 含义 |
| SELECT | 是一个或多个字段的列表 |
| * | 选择所有的列 |
| DISTINCT | 禁止重复 |
| column | expression | 选择指定的字段或表达式 |
| alias | 给所选择的列不同的标题 |
| FROM table | 指定包含列的表 |
查询中的列选择
选择所有列:
sql
SELECT *
FROM 表名;
选择指定列:
sql
SELECT 列名,列名
FROM 表名;
查询中的算术表达式
用算术运算符创建数字和日期数据的表达式
|----|----|
| 操作 | 说明 |
| + | 加 |
| - | 减 |
| * | 乘 |
| / | 除 |
需要修改数据显示方式时,可以用到算术表达式。
使用算术表达式(示例):
sql
SELECT last_name,salary,salary + 300
FROM employees;
MySQL中定义空值 Null:
包含空值的算术表达式计算结果为空
MySQL中的别名
列别名:
sql
SELECT 列名 AS 列别名 FROM 表名 WHERE 条件;
示例:
sql
SELECT last_name AS name,commission_pot comm
FROM employees;
表别名:
sql
SELECT 表别名.列名 FROM 表名 as 表别名 WHERE 条件;
MySQL中去除重复
SELECT默认显示所有的行,包括相同的行
在SELECT 子句中用DISTINCT关键字除去相同的行
sql
SELECT DISTINCT 列名
FROM 表名;
查询中的行选择
用WHERE子句限制从查询返回的行。一个WHERE子句包含一个必须满足的条件,WHERE子句紧跟着FROM子句。如果条件是true,返回满足条件的行。
sql
SELECT * | 投影列 FROM 表名 WHERE 选择条件;
MySQL中的比较条件:
|---------|------|
| 运算 | 含义 |
| = | 等于 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| <> != | 不等于 |
其他比较条件:
|-------------------|------------------|
| 操作 | 含义 |
| BETWEEN ...AND... | 在两个值之间(包含) |
| IN(set) | 匹配一个任意值列表 |
| LIKE | 匹配一个字符模块 |
| IS NULL | 检查某个字段是否为 NULL |
| IS NOT NULL | 检查字段是否包含非 NULL 值 |
使用BETWEEN条件
显示上下限之间的行
sql
SELECT 列名,列名
FROM 表名
WHERE 列名 BETWEEN 下限 AND 上限;
用BETWEEN范围条件显示基于一个值范围的行,范围包括下限和上限(闭区间)
使用IN条件
sql
SELECT 列名,列名,列名,列名
FROM 表名
WHERE 列名 IN (值,值,值);
使用LIKE条件
使用LIKE条件执行有效搜索串值的通配符搜索
搜索条件既可以包含文字也可以包含数字:
%表示零个或多个字符(占位)
_表示一个字符(占位)
sql
SELECT 列名
FROM 表名
WHERE 列名 LIKE '_字符%';
使用NULL条件
在数据库中,NULL 表示缺失、未知或不适用的值。它不同于空字符串或零,需要特殊处理。
IS NULL 用于检查某个字段是否为 NULL。
sql
SELECT 列名,列名
FROM 表名
WHERE 列名 IS NULL;
IS NOT NULL 用于检查字段是否包含非 NULL 值。
sql
SELECT column_name
FROM table_name
WHERE column_name IS NOT NULL;
NULL 表示数据缺失或未知,无法用常规的比较运算符(如 = 或 <>)判断。
逻辑条件
|-----|-------------------------|
| 运算 | 含义 |
| AND | 如果两个组成部分的条件都为真,返回TRUE |
| OR | 如果两个组成部分中的任一条件为真,返回TRUE |
| NOT | 如果跟随的条件为假,返回TRUE |
逻辑条件通过组合或反转比较条件生成最终结果,仅当所有条件为真时返回行。
示例:
sql
SELECT * FROM table
WHERE condition1 AND condition2; -- 仅当 condition1 和 condition2 均为真时返回行
优先规则
|------|-------------------------------------|
| 求值顺序 | |
| 1 | 算术运算 |
| 2 | 连字操作 |
| 3 | 比较操作 |
| 4 | IS NOT NULL , LIKE , NOT IN |
| 5 | NOT BETWEEN |
| 6 | NOT 逻辑条件 |
| 7 | AND 逻辑条件 |
| 8 | OR 逻辑条件 |
可以使用()改变优先规则
使用 ORDER BY排序
用ORDER BY字句排序行
- ASC:升序排序,默认
- DESC:降序排序
ORDER BY子句在SELECT 语句的最后
sql
SELECT 列名
FROM 表名
ORDER BY 列名 ASC|DESC,列名 ASC|DESC;