Hello everybody~ 好久不见
小红
我们今天要学MySQL了?
对啊,我现在把一些基础笔记发给你。注意收藏哦~
小明
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
刘小牛
可是数据库的具体好处有是什么呢,我还想知道它其中的常见概念以及它存储数据的特点,而且还想知道常见的数据库管理系统又是什么呢~~~
一、数据库的好处
1、可以持久化数据到本地
2、结构化查询
二、数据库的常见概念
1、DB:数据库,存储数据的容器
2、DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
3、SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言
三、数据库存储数据的特点
1、数据存放到表中,然后表再放到库中
2、一个库中可以有多张表,每张表具有唯一的表名用来标识自己
3、表中有一个或多个列,列又称为“字段”,相当于Java中“属性”
4、表中的每一行数据,相当于Java中“对象”
四、常见的数据库管理系统
mysql、oracle、db2、sqlserver
王小兔
那它其中最常用的基础语言又有哪几类呢,简要具体又是什么呢?
RDBMS 术语
在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:
数据库: 数据库是一些关联表的集合。
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
MYSQL基础常见常用语句
一、MySQL服务器的启动和停止
net start 服务名(启动服务)net stop 服务名(停止服务)
二、MySQL服务的登录和退出(exit)
mysql[-h 主机名/localhost -P 端口号/3306]-u用户名 -p密码
三、MySQL的常见命令
数据库(数据库是一些关联表的集合。)
# 查看所有的数据库SHOW DATABASES ;# 创建一个数据库CREATE DATABASE k;# 删除一个数据库DROP DATABASE k;# 使用这个数据库USE k;
表(表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。)
# 查看所有的表SHOW TABLES ;# 创建一个表CREATE TABLE n(id INT, name VARCHAR(10));CREATE TABLE m(id INT, name VARCHAR(10), PRIMARY KEY (id), FOREIGN KEY (id) REFERENCES n(id), UNIQUE (name));CREATE TABLE m(id INT, name VARCHAR(10));# 直接将查询结果导入或复制到新创建的表CREATE TABLE n SELECT * FROM m;# 新创建的表与一个存在的表的数据结构类似CREATE TABLE m LIKE n;# 创建一个临时表# 临时表将在你连接MySQL期间存在。当断开连接时,MySQL将自动删除表并释放所用的空间。也可手动删除。CREATE TEMPORARY TABLE l(id INT, name VARCHAR(10));# 直接将查询结果导入或复制到新创建的临时表CREATE TEMPORARY TABLE tt SELECT * FROM n;# 删除一个存在表DROP TABLE IF EXISTS m;# 更改存在表的名称ALTER TABLE n RENAME m;RENAME TABLE n TO m;# 查看表的结构(以下五条语句效果相同)DESC n; # 因为简单,所以建议使用DESCRIBE n;SHOW COLUMNS IN n;SHOW COLUMNS FROM n;EXPLAIN n;# 查看表的创建语句SHOW CREATE TABLE n;
表的结构(表结构就是定义一个表的字段、类型、主键、外键、索引,这些基本的属性组成了数据库的表结构)
# 添加字段ALTER TABLE n ADD age VARCHAR(2) ;# 删除字段ALTER TABLE n DROP age;# 更改字段属性和属性ALTER TABLE n CHANGE age a INT;# 只更改字段属性ALTER TABLE n MODIFY age VARCHAR(7) ;# 增加数据INSERT INTO n VALUES (1, 'tom', '23'), (2, 'john', '22');INSERT INTO n SELECT * FROM n; # 把数据复制一遍重新插入# 删除数据DELETE FROM n WHERE id = 2;# 更改数据UPDATE n SET name = 'tom' WHERE id = 2;# 数据查找SELECT * FROM n WHERE name LIKE '%h%';# 数据排序(反序)SELECT * FROM n ORDER BY name, id DESC ;
键(为了区分数据,类似人的身份证号,为数据定义一个键,跟身份证号一样,这个键作用多多:比如可以确定这个数据跟其他数据是不一样的,另外通过键可以跟其他类型数据关联起来,用于其他复杂用途比如复杂查询等)
# 添加主键ALTER TABLE n ADD PRIMARY KEY (id);ALTER TABLE n ADD CONSTRAINT pk_n PRIMARY KEY (id); # 主键只有一个,所以定义键名似乎也没有什么用# 删除主键ALTER TABLE n DROP PRIMARY KEY ;# 添加外键ALTER TABLE m ADD FOREIGN KEY (id) REFERENCES n(id); # 自动生成键名m_ibfk_1ALTER TABLE m ADD CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES n(id); # 使用定义的键名fk_id# 删除外键ALTER TABLE m DROP FOREIGN KEY `fk_id`;# 修改外键ALTER TABLE m DROP FOREIGN KEY `fk_id`, ADD CONSTRAINT fk_id2 FOREIGN KEY (id) REFERENCES n(id); # 删除之后从新建# 添加唯一键ALTER TABLE n ADD UNIQUE (name);ALTER TABLE n ADD UNIQUE u_name (name);ALTER TABLE n ADD UNIQUE INDEX u_name (name);ALTER TABLE n ADD CONSTRAINT u_name UNIQUE (name);CREATE UNIQUE INDEX u_name ON n(name);# 添加索引ALTER TABLE n ADD INDEX (age);ALTER TABLE n ADD INDEX i_age (age);CREATE INDEX i_age ON n(age);# 删除索引或唯一键DROP INDEX u_name ON n;DROP INDEX i_age ON n;
视图(MySQL 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。)
# 创建视图CREATE VIEW v AS SELECT id, name FROM n;CREATE VIEW v(id, name) AS SELECT id, name FROM n;# 查看视图(与表操作类似)SELECT * FROM v;DESC v;# 查看创建视图语句SHOW CREATE VIEW v;# 更改视图CREATE OR REPLACE VIEW v AS SELECT name, age FROM n;ALTER VIEW v AS SELECT name FROM n ;# 删除视图DROP VIEW IF EXISTS v;
链接(SQL查询数据的时候,经常需要通过Join连接,把几个表的数据组合在一起查询)
# 内链接 也称为等值连接,返回两张表都满足条件的部分# inner join 就等于 join SELECT * FROM m INNER JOIN n ON m.id = n.id;# 左外链接 取左边的表的全部,右边的表按条件,符合的显示,不符合则显示null# left outer join 与 left join 等价,一般写成left join SELECT * FROM m LEFT JOIN n ON m.id = n.id;# 右外链接 取右边的表的全部,左边的表按条件,符合的显示,不符合则显示null# right outer join 与 right join等价,一般写成right joinSELECT * FROM m RIGHT JOIN n ON m.id = n.id;# 交叉链接 返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积# 首先,先简单解释一下笛卡尔积:笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,# 第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员SELECT * FROM m CROSS JOIN n; # 标准写法 显式的交叉连接,使用CROSS JOIN。SELECT * FROM m, n;# 隐式的交叉连接,没有CROSS JOIN。# 类似全连接full join的链接用法# 全外连接是在结果中除了显示满足连接的条件的行外,还显示了join两侧表中所有满足检索条件的行SELECT id,name FROM mUNIONSELECT id,name FROM n;
函数
# 聚合函数SELECT count(id) AS total FROM n; # 总数SELECT sum(age) AS all_age FROM n; # 总和SELECT avg(age) AS all_age FROM n; # 平均值SELECT max(age) AS all_age FROM n; # 最大值SELECT min(age) AS all_age FROM n; # 最小值# 数学函数SELECT abs(-5); # 绝对值SELECT bin(15), oct(15), hex(15); # 二进制,八进制,十六进制SELECT pi(); # 圆周率3.141593SELECT ceil(5.5); # 大于x的最小整数值6SELECT floor(5.5); # 小于x的最大整数值5SELECT greatest(3,1,4,1,5,9,2,6); # 返回集合中最大的值9SELECT least(3,1,4,1,5,9,2,6); # 返回集合中最小的值1SELECT mod(5,3); # 余数2SELECT rand(); # 返回0到1内的随机值,每次不一样SELECT rand(5); # 提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。SELECT round(1415.1415); # 四舍五入1415SELECT round(1415.1415, 3); # 四舍五入三位数1415.142SELECT round(1415.1415, -1); # 四舍五入整数位数1420SELECT truncate(1415.1415, 3); # 截短为3位小数1415.141SELECT truncate(1415.1415, -1); # 截短为-1位小数1410SELECT sign(-5); # 符号的值负数-1SELECT sign(5); # 符号的值正数1SELECT sqrt(9); # 平方根3SELECT sqrt(9); # 平方根3# 字符串函数SELECT concat('a', 'p', 'p', 'le'); # 连接字符串-appleSELECT concat_ws(',', 'a', 'p', 'p', 'le'); # 连接用','分割字符串-a,p,p,leSELECT insert('chinese', 3, 2, 'IN'); # 将字符串'chinese'从3位置开始的2个字符替换为'IN'-chINeseSELECT left('chinese', 4); # 返回字符串'chinese'左边的4个字符-chinSELECT right('chinese', 3); # 返回字符串'chinese'右边的3个字符-eseSELECT substring('chinese', 3); # 返回字符串'chinese'第三个字符之后的子字符串-ineseSELECT substring('chinese', -3); # 返回字符串'chinese'倒数第三个字符之后的子字符串-eseSELECT substring('chinese', 3, 2); # 返回字符串'chinese'第三个字符之后的两个字符-inSELECT trim(' chinese '); # 切割字符串' chinese '两边的空字符-'chinese'SELECT ltrim(' chinese '); # 切割字符串' chinese '两边的空字符-'chinese 'SELECT rtrim(' chinese '); # 切割字符串' chinese '两边的空字符-' chinese'SELECT repeat('boy', 3); # 重复字符'boy'三次-'boyboyboy'SELECT reverse('chinese'); # 反向排序-'esenihc'SELECT length('chinese'); # 返回字符串的长度-7SELECT upper('chINese'), lower('chINese'); # 大写小写 CHINESE chineseSELECT ucase('chINese'), lcase('chINese'); # 大写小写 CHINESE chineseSELECT position('i' IN 'chinese'); # 返回'i'在'chinese'的第一个位置-3SELECT position('e' IN 'chinese'); # 返回'i'在'chinese'的第一个位置-5SELECT strcmp('abc', 'abd'); # 比较字符串,第一个参数小于第二个返回负数- -1SELECT strcmp('abc', 'abb'); # 比较字符串,第一个参数大于第二个返回正数- 1# 时间函数SELECT current_date, current_time, now(); # 2018-01-13 12:33:43 2018-01-13 12:33:43SELECT hour(current_time), minute(current_time), second(current_time); # 12 31 34SELECT year(current_date), month(current_date), week(current_date); # 2018 1 1SELECT quarter(current_date); # 1SELECT monthname(current_date), dayname(current_date); # January SaturdaySELECT dayofweek(current_date), dayofmonth(current_date), dayofyear(current_date); # 7 13 13# 控制流函数SELECT if(3>2, 't', 'f'), if(3<2, 't', 'f'); # t fSELECT ifnull(NULL, 't'), ifnull(2, 't'); # t 2SELECT isnull(1), isnull(1/0); # 0 1 是null返回1,不是null返回0SELECT nullif('a', 'a'), nullif('a', 'b'); # null a 参数相同或成立返回null,不同或不成立则返回第一个参数SELECT CASE 2 WHEN 1 THEN 'first' WHEN 2 THEN 'second' WHEN 3 THEN 'third' ELSE 'other' END ; # second# 系统信息函数SELECT database(); # 当前数据库名-testSELECT connection_id(); # 当前用户id-306SELECT user(); # 当前用户-root@localhostSELECT version(); # 当前mysql版本SELECT found_rows(); # 返回上次查询的检索行数
用户
# 增加用户CREATE USER 'test'@'localhost' IDENTIFIED BY 'test';INSERT INTO mysql.user(Host, User, Password) VALUES ('localhost', 'test', Password('test')); # 在用户表中插入用户信息,直接操作User表不推荐# 删除用户DROP USER 'test'@'localhost';DELETE FROM mysql.user WHERE User='test' AND Host='localhost';FLUSH PRIVILEGES ;# 更改用户密码SET PASSWORD FOR 'test'@'localhost' = PASSWORD('test');UPDATE mysql.user SET Password=Password('t') WHERE User='test' AND Host='localhost';FLUSH PRIVILEGES ;# 用户授权GRANT ALL PRIVILEGES ON *.* TO test@localhost IDENTIFIED BY 'test';# 授予用'test'密码登陆成功的test@localhost用户操作所有数据库的所有表的所有的权限FLUSH PRIVILEGES ; # 刷新系统权限表,使授予权限生效# 撤销用户授权REVOKE DELETE ON *.* FROM 'test'@'localhost'; # 取消该用户的删除权限
存储过程(存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
)
# 创建存储过程DELIMITER // # 无参数CREATE PROCEDURE getDates() BEGIN SELECT * FROM test ; END //CREATE PROCEDURE getDates_2(IN id INT) # in参数 BEGIN SELECT * FROM test WHERE a = id; END //CREATE PROCEDURE getDates_3(OUT sum INT) # out参数 BEGIN SET sum = (SELECT count(*) FROM test); END //CREATE PROCEDURE getDates_4(INOUT i INT) # inout参数 BEGIN SET i = i + 1; END //DELIMITER ;# 删除存储过程DROP PROCEDURE IF EXISTS getDates;# 修改存储过程的特性ALTER PROCEDURE getDates MODIFIES SQL DATA ;# 修改存储过程语句(删除再重建)略# 查看存储过程SHOW PROCEDURE STATUS LIKE 'getDates'; # 状态SHOW CREATE PROCEDURE getDates_3; # 语句# 调用存储过程CALL getDates();CALL getDates_2(1);CALL getDates_3(@s);SELECT @s;SET @i = 1;CALL getDates_4(@i);SELECT @i; # @i = 2
其他语句
# 查看所有的表信息(包括视图)SHOW TABLE STATUS;# 数据库备份mysqldump -u root -p db_name > file.sqlmysqldump -u root -p db_name table_name > file.sql# 数据库还原mysql -u root -p < C:\file.sql
如果你能耐心看完相信你会有所收获,对于本次的学习倒是需要有些小基础,不过很希望这次的笔记可以帮助到你们~