从系统架构来看,MySql数据库系统从大到小依次是数据库服务器
、数据库
、数据表
、数据表中行与列
增删改
创建数据库
数据库创建方式
#方式1:创建数据库
CREATE DATABASE 数据库名;
#方式2:创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
#方式3:判断数据库是否已经存在,不存在则创建数据库(推荐)
CREATE DATABASE IF NOT EXISTS 数据库名;
使用数据库
# 查看当前所有的数据库
SHOW DATABASES# 有一个s,代表多个数据库
# 查看当前正在使用的数据库
SELECT DATABASE()# 使用的MySql中一个的全局变量
# 查看指定库下所有的表
SHOW TABLES FROM 数据库名
# 查看数据库的创建信息
SHOW CREATE DATABASE 数据库名
SHOW CREATE DATABASE 数据库名\G
# 使用/切换数据库
USE 数据库名
修改数据库
# 更改数据库字符集
ALTER DATABASE 数据库名 CHARACTER SET 字符集
删除数据库
# 删除指定数据库
DROP DATABASE 数据库名
DROP DATABASE IF EXISTS 数据库名(推荐)
创建表
前提:
必须有CREATE TABLE权限
方式一 直接创建
CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
字段3, 数据类型 [约束条件] [默认值],
……
[表约束条件]
);
注意:
1.加上了IF NOT EXISTS,则表示:如果当前数据库中不存在该表则创建数据表,如果存在则不创建数据表
2.创建时,必须指明:表名、列名、数据类型、长度
方式二 根据现有的表创建
# 例:复制employees表,包括数据
CREATE TABLE employees_copy
AS
SELECT *
FROM employees;
修改表
在表中 增删改查
字段
ALTER TABLE myemp2
ADD salary DOUBLE(10,2);# 默认添加在末尾(小数点前8位,后2位)
DESC myemp2;
# 修改一个字段:数据类型、长度、默认值
ALTER TABLE myemp2
MODIFY last_name VARCHAR(25) DEFAULT 'Aa';# 更改字符串长度和默认值
# 重命名一个字段
ALTER TABLE myemp2
CHANGE salary monthly_salary DOUBLE(10,2);
ALTER TABLE myemp2
CHANGE email e_number VARCHAR(50);
# 删除一个字段
ALTER TABLE myemp2
DROP COLUMN e_number;
# 重命名表
RENAME TABLE myemp2
TO myemp3;
删除表
# 删除表
DROP TABLE IF EXISTS myemp2
# 清空表
TRUNCATE TABLE employees_copy;
TRUNCATE TABLE和DELETE FROM区别
相同点:
都可以实现对表中所有数据的删除,同时保留表结构。
不同点:
TRUNCATE TABLE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。
DELETE FROM:一旦执行此操作,表数据可以全部清除(不带WHERE)。同时,数据是可以实现回滚
查 SELECT
SELECT 字段1,字段2,... FROM 表名
- Windows系统中的SQL语句不区分大小写
- 字符串用单引号’
- 列的别名 AS
1.(alias 别名) 可以省略
2.列(字段)的别名可以使用""引起来
SELECT employee_id ID,last_name AS 姓,salary "工资"
FROM employees;
- 去除重复行 DISTINCT
SELECT DISTINCT department_id
FROM employees;
- 空值参与运算
所有运算符或列值遇到null值,运算的结果都为null
SELECT employee_id,salary 月工资,salary * (1 + commission_pct) * 12 "年工资",commission_pct
FROM employees;
解决方案 IFNULL
SELECT employee_id,salary 月工资,salary * (1 + IFNULL(commission_pct,0)) * 12 "年工资",commission_pct
FROM employees;
注意
1.MySQL中,null不等于空字符串。一个空字符串的长度是0,而一个空值的长度是空
2.MySQL中,空值是占用空间的
- 着重号 ``
出现名字和sql语言中的关键字重名的现象,用``处理
SELECT * FROM ORDER;# 这里order表名和ORDER关键字冲突
SELECT * FROM `order`;#正确
- 查询常数
在 SELECT 查询结果中增加一列固定的常数列,该常数列的取值可以指定。
SELECT '西电',employee_id,last_name
FROM employees;
- 显示表中字段详细信息 DESCRIBE / DESC
DESCRIBE employees;
DESC departments;
- 过滤数据 WHERE
SELECT *
FROM employees
WHERE department_id = 90;#过滤条件
排序和分页
ORDER BY
关键字 ORDER BY 默认升序
升序:ASC
降序:DESC
# 将员工信息先按照部门号一级排序,再根据工资二级排序
SELECT employee_id,department_id,salary
FROM employees
ORDER BY department_id DESC,salary ASC;
LIMIT
如果查询结果返回的记录太多,采用分页的方式,每次只返回特定页数的数据。
关键字 LIMIT
格式:LIMIT 位置偏移量, 条目数
注意:
1.位置偏移量 -1 表示真实位置
2.LIMIT子句必须放在SELECT语句的最后
# 取工资大于6000的员工按工资升序排列,数据为第三页
SELECT employee_id, last_name, salary
FROM employees
WHERE salary>6000
ORDER BY salary ASC
LIMIT 20,10;
另外*:关键字OFFSET
LIMIT 3 OFFSET 4
表示获得从第五条记录开始的后面三条记录
运算符
除法 /或DIV
取余 %或MOD
1.在SQL中,字符串存在隐式转换(字符串尝试转化为数字),如果转换不成功,则为0。如0 = 'a'
2.运算中存在null时,大多数情况下结果为null(除了安全等于)
# 在SQL中,+表示加法,不区分数据类型,会将字符串转化为数值(隐式转换)
SELECT 100 + '1' # 101 Java中结果为1001,相当于字符串的连接
FROM DUAL;
比较运算符
特殊:
1.安全等于 <=> 可以判断null
2.不等于 != 或 <>
在SQL中,+表示加法,不区分数据类型,会将字符串转化为数值(隐式转换)
SELECT 100 + '1' # 101 Java中结果为1001,相当于字符串的连接
FROM DUAL;
非符号运算符
-
IS NULL\ IS NOT NULL\ ISNULL 判断空值
-
LEAST \ GREATEST 最小值\最大值
-
BETWEEN A AND B
-
IN \ NOT IN 判断离散值
-
LIKE 模糊查询(筛选)
另外:
% 代表不确定个数的字符
_ 代表一个不确定的字符
\ 转义字符
查询第四个字符是_且第五个字符是o的员工
SELECT last_name
FROM employees
WHERE last_name LIKE '___\_o%';
逻辑运算符
运算符 | 作用 |
---|---|
NOT 或 ! | 非 |
AND 或 && | 与 |
OR 或 || | 或 |
XOR | 异或 |