MySQL数据库学习笔记--基础知识
数据库概述
数据库就是用来存储和管理数据的仓库。
数据库优势
- 可存储大量数据
- 方便检索
- 保持数据一致性、完整性
- 安全、可共享
- 通过组合分析,可产生新数据
常见数据库
- Oracle:甲骨文
- DB2:IBM
- SQL Server:微软
- Sybase:赛尔斯
- MySQL:甲骨文
MySQL数据库结构
- RDBMS(关系型数据库管理系统=数据库服务器)= 管理员 + 仓库
- databse(数据仓库)= N个table
- table(数据表)
- 表结构:定义了表的列名和列类型
- 表记录:数据内容
SQL语言概述
SQL是结构化查询语言(Structured Query Language),客户端使用SQL来操作服务器。
SQL语法
- SQL语句可以在旦行或者多行书写,一条SQL语句以分号结尾
- 可使用空格和缩进来增强语句的可读性
- MySQL不区分大小写,建议使用大写
SQL语句分类
- DDL(Data Definition Language):数据定义语言,用来定义数据对象:库、表、列等
- DML(Data Manipulation Language):数据操作语言,用来定义数据库记录,对标记录进行更新(增/删/改)
- DCL(Data Control Language):数据库控制语言,用来定义访问权限和安全级别(对用户创建及授权)
- DQL(Data Query Language):数据查询语言,用来查询记录
数据类型
- int:整型
- double:浮点型,double(10,6)表示最多10位,其中小数位6位,最大值为:9999.999999
- decimal:浮点型,在表单关于钱使用该类型,因为该类型不会出现精度缺失问题
- char:固定长度字符串类型,char(20)数据长度不足指定长度时,自动补足长度;(最大值255)
- varchar:可变长度字符串类型,varchar(10000)长度不会自动补足(最大值65535)
- text(clob):字符串类型(标准里面是clob,MySQL是text)
- tinytext:2^8-1B(很小,255B)
- text:2^16-1B(小,64K)
- mediumtext:2^24-1B(中,16M)
- longtext:2^32-1B(大,4G)
- blob:字节类型(二进制)
- tinyblob:2^8-1B(很小,255B)
- blob:2^16-1B(小,64K)
- mediumblob:2^24-1B(中,16M)
- longblob:2^32-1B(大,4G)
- date:日期类型,格式为:yyyy-MM-dd
- time:事件类型,格式为:hh:mm:ss
- timestamp:时间戳类型
DDL(数据定义语言)
DDL - 操作数据库
- 查看所有数据库,关键字:SHOW DATABASES
SHOW DATABASES;
- 切换(选择要操作的)数据库,关键字:USE
// USE 数据库名; USE my_db;
- 创建数据库,关键字:CREATE DATABASE IF NOT EXISTS
CREATE DATABASE [IF NOT EXISTS] my_db [CHARSET=utf8];
- 删除数据库,关键字:DROP DATABASE
DROP DATABASE [IF EXISTS] my_db;
- 修改数据库编码,关键字:ALTER DATABASE
ALTER DATABASE my_db CHARACTER SET utf8;
DDL - 操作表
- 创建表,关键字:CREATE TABLE
CREATE TABLE [IF NOT EXISTS] 表名( 列名 列类型, 列名 列类型, ...... 列名 列类型 ); CREATE TABLE IF NOT EXISTS student( number CHAR(10), name VARCHAR(50), age INT, gender VARCHAR(10) );
- 查看当前数据库中所有表名称,关键字:SHOW TABLES
SHOW TABLES;
- 查看指定表的创建语句,关键字:SHOW CREATE TABLE
// SHOW CREATE TABLE 表名; SHOW CREATE TABLE student;
- 查看表结构,关键字:DESC
// DESC 表名; DESC student;
- 删除表,关键字:DROP TABLE
// DROP TABLE 表名; DROP TABLE student;
- 修改表,关键字:ALTER TABLE
- 添加列,关键字:ADD
ALTER TABLE 表名 ADD( 列名 列类型, 列名 列类型, ...... 列名 列类型 ); ALTER TABLE student ADD( sid INT, height INT );
- 修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响已存在的数据),关键字: MODIFY
// ALTER TABLE 表名 MODIFY 列名 列类型; ALTER TABLE student MODIFY sid CHAR(20);
- 修改列名称,关键字: CHANGE
// ALTER TABLE 表名 CHANGE 原列名 新列名 列类型; ALTER TABLE student CHANGE sid stu_id CHAR(20);
- 删除列,关键字: DROP
// ALTER TABLE 表名 DROP 列名; ALTER TABLE student DROP sid;
- 修改表名称,关键字: RENAME
// ALTER TABLE 原表名 RENAME TO 新表名; ALTER TABLE student RENAME tb_stu;
- 添加列,关键字:ADD
DML(数据操作语言)
DML - 插入记录,关键字:INSERT INTO VALUES
所有字符串类型必须使用单引号,不能使用双引号!
日期类型也要使用单引号
- INSERT INTO 表名(列名1,列名2,…) VALUES(列值1,列值2,…);
在表名后给出要插入的列名,其他没有指定的列插入NULL值。
在VALUES后给出要插入的列值,顺序和个数必须与前面给出的列名对应INSERT INTO student(number, name, age) VALUES('stu_01', 'ZhangSan', 10);
- INSERT INTO 表名 VALUES(列值1,列值2,…);
没有给出要出入的列,表示插入所有列
值的个数必须是该表的列数
值的顺序必须与创建表是给出的列的顺序一致INSERT INTO student VALUES('stu_01', 'ZhangSan', 10, 'female');
DML - 修改记录,关键字:UPDATE xx SET
UPDATE 表名 SET 列名1=列值1, 列名2=列值2, … [WHERE 条件]
- 条件(条件可选)
- 条件必须是一个boolean类型的值或者表达式
- 运算符:=, !=, <>, >, <, >=, <=, BETWEEN … AND, IN (…), IS NULL, NOT, OR, AND
INSERT INTO student VALUES('stu_01', 'ZhangSan', 10, 'female'); UPDATE student SET age=100 WHERE name='ZhangSan';
DML - 删除记录,关键字:DELETE FROM TRUNCATE TABLE
- DELETE FROM 表名 [WHERE 条件];
INSERT INTO student VALUES('stu_01', 'ZhangSan', 10, 'female'); DELETE FROM student WHERE name='ZhangSan';
- TRUNCATE TABLE 表名;
TRUNCATE是DDL语句,它是先删除(DROP)该表,再创建(CREATE)该表,数据无法回滚!INSERT INTO student VALUES('stu_01', 'ZhangSan', 10, 'female'); TRUNCATE TABLE student;
DCL(数据控制语言)
一个项目创建一个用户,一个项目对应一个数据库。
这个用户只对这个数据库有权限,其他数据库无法操作。
- 创建用户,关键字:CREATE USER IDENTIFIED BY
// CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';用户只能在指定的IP地址登录 CREATE USER test@localhost IDENTIFIED BY ’1234‘; // CREATE USER 用户名@’%‘ IDENTIFIED BY '密码';用户可以在任意IP地址登录 CREATE USER test@’%‘ IDENTIFIED BY ’1234‘;
- 用户授权,关键字:GRANT xx ON xx TO GRANT ALL ON xx TO
// GRANT 权限1, ... , 权限n ON 数据库.* TO 用户名@IP地址;给用户分配制度数据库上的指定权限 GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT ON mydb.* TO test@localhost; // GRANT ALL ON 数据库.* TO 用户名@IP地址;给用户分配指定数据库上的所有权限 GRANT ALL ON mydb.* TO test@localhost;
- 撤销授权,关键字:REVOKE xx ON xx FROM
// REVOKE 权限1, ... , 权限n, ON 数据库.* FROM 用户名@IP地址;撤销指定用户在指定数据库的指定权限 REVOKE CREATE, ALTER, DROP, INSERT ON mydb.* FROM test@localhost;
- 权限查看,关键字:SHOW GRANTS FOR
// SHOW GRANTS FOR 用户名@IP地址;查看指定用户的权限 SHOW GRANTS FOR test@localhost;
- 删除用户,关键字:DROP USER
// DROP USER 用户名@IP地址; DROP USER test@localhost;
DQL(数据库查询语言)
DQL - 基础查询–列操作
- 查询所有列,关键字:SELECT FROM
// SELECT * FROM 表名;*表示查询所有列 SELECT * FROM student;
- 查询指定列
// SELECT 列名1[, 列名2, ... , 列名n] FROM 表名; SELECT name, age FROM student;
- 去除完全相同的重复行,关键字:DISTINCT
// SELECT DISTINCT * FROM 表名; // SELECT DISTINCT 列名1[, 列名2, ... , 列名n] FROM 表名; SELECT DISTINCT age FROM student;
- 列运算
- 数量类型的列可做加、减、乘、除运算
SELECT name, age+10 FROM student; SELECT name, age*10 FROM student; SELECT name, age+height FROM student; // 非数值类型会当成0处理 SELECT name+10, age FROM student;
- 字符串类型的列可做连续运算,关键字:CONCAT
// 连接字符串 SELECT CONCAT(name, number) FROM student; SELECT CONCAT(‘我叫’, name, ',我的学号是', number) FROM student;
- 转换NULL值,关键字:IFNULL
// IFNULL可以处理NULL值 SELECT name, age+IFNULL(height,0) FROM student;
- 给列起别名
SELECT CONCAT(‘我叫’, name, ',我的学号是', number) as 信息 FROM student; // as可以省略 SELECT CONCAT(‘我叫’, name, ',我的学号是', number) 信息 FROM student;
- 数量类型的列可做加、减、乘、除运算
DQL - 条件查询,关键字:WHERE
// 查询age大于10的学生
SELECT * FROM student WHERE age>10;
// 查询name等于ZhangSan的学生
SELECT * FROM student WHERE name='ZhangeSan';
// 查询age在10到20之间的学生
SELECT * FROM student WHERE age BETWEEN 10 AND 20;
// 查询name是ZhangSan或者LiSi的学生
SELECT * FROM student WHERE name IN ('ZhangeSan', 'LiSi');
DQL - 模糊查询,关键字:LIKE
模糊查询需要用到通配符。_ 匹配单个字符,% 匹配多个字符(包括0个字符)。
// 查询name为张x的学生
SELECT * FROM student WHERE name LIKE '张_';
// 查询name为张xx的学生
SELECT * FROM student WHERE name LIKE '张__';
// 查询name为张开头的学生
SELECT * FROM student WHERE name LIKE '张%';
// 查询name中有小字的学生
SELECT * FROM student WHERE name LIKE '%小%';
// 查询name为张结尾的学生
SELECT * FROM student WHERE name LIKE '%张';
DQL - 排序,关键字:ORDER BY
升序关键字(默认为升序,可省略):ASC。
降序关键字:DESC
// 查询所有学生,按age升序排列
SELECT * FROM student ORDER BY age;
// 查询所有学生,按age升序排列
SELECT * FROM student ORDER BY age ASC;
// 查询所有学生,按age降序排列
SELECT * FROM student ORDER BY age DESC;
// 查询所有学生,按age升序排列,age相同时按height降序排列
SELECT * FROM student ORDER BY age ASC, height DESC;
// 查询所有学生,按age升序排列,age相同时按height降序排列,age与height都相同则按id升序排列
SELECT * FROM student ORDER BY age ASC, height DESC, id ASC;
DQL - 聚合函数
- 统计个数:COUNT,统计结果集不为NULL的列的个数
// 查询学生个数 SELECT COUNT(*) FROM student; // 查询学生个数,以name查询 SELECT COUNT(name) FROM student; // 查询学生个数,以第3列查询 SELECT COUNT(3) FROM student; // 查询学生个数,以第300列查询 SELECT COUNT(300) FROM student;
- 最大值:MAX
// 查询学生中最大的年龄 SELECT MAX(age) FROM student;
- 最小值:MIN
// 查询学生中最小的年龄 SELECT MIN(age) FROM student;
- 求和:SUM
// 查询学生age的和 SELECT SUM(age) FROM student;
- 平均值:AVG
// 查询学生age的平均值 SELECT AVG(age) FROM student;
- 总结
// 查询学生人数+age总和+age最大值+age最小值+age平均值 SELECT COUNT(*) 人数, SUM(age) 总和, MAX(age) 最大, MIN(age) 最小, AVG(age) 平均 FROM student;
DQL - 分组查询,关键字:GROUP BY
可以查询的内容:当前分组列与聚合函数
SELECT FROM WHERE GROUP BY HAVING
// 查询所有学生按gender的分组,并统计各组人数
SELECT gender, COUNT(*) 人数 FROM student GROUP BY gender;
// 查询所有学生按gender的分组,并统计当前组最大的age
SELECT gender, MAX(age) 最大 FROM student GROUP BY gender;
// 查询age大于10的学生按gender的分组,并统计各组人数
SELECT gender, COUNT(*) 人数 FROM student WHERE age > 10 GROUP BY gender;
// 查询age大于10的学生按gender的分组且分组人数大于5的组,并统计各组人数
SELECT gender, COUNT(*) 人数 FROM student WHERE age > 10 GROUP BY gender HAVING COUNT(*) > 5;
DQL - 分页查询,关键字:LIMIT
LIMIT用来限定查询结果的起始行,以及总行数。
// 查询的起始行为第20行,一共查询10条记录,19表示从第20行开始,10表示一共10行。
SELECT * FROM student LIMIT 19, 10;
关键字
CREATE DATABASE IF NOT EXISTS
SHOW DATABASES USE
DROP DATABASE
ALTER DATABASE
CREATE TABLE
SHOW TABLES SHOW CREATE TABLE DESC
DROP TABLE
ALTER TABLE ADD MODIFY CHANGE DROP RENAME
INSERT INTO VALUES
UPDATE xx SET
DELETE FROM TRUNCATE TABLE
CREATE USER IDENTIFIED BY
GRANT xx ON xx TO GRANT ALL ON xx TO
REVOKE xx ON xx FROM
SHOW GRANTS FOR
DROP USER
SELECT FROM
DISTINCT
CONCAT IFNULL
WHERE LIKE _ %
ORDER BY ASC DESC HAVING
COUNT MAX MIN SUM AVG
GROUP BY HAVING
LIMIT