描述:mysql 是开源的关系型数据库,学习它之前可以先在本地安装一个典型的mysql 数据库,并将mysql 安装目录下的bin 目录配置到系统环境变量的PATH中,这样就可以在任意路径下登录mysql客户端,可以百度获取配置方式。
mysql的默认端口是3306,mysql的超级用户是root, mysql创建输入库是CREATE DATABASE, 修改数据库是ALTER DATABASE,删除数据库 DROP DATABASE。
从mysql 的bin 目录下进入mysql的客户端,输入:mysql -hlocalhost -uroot -p 回车,再输入密码 回车,就可以登录mysql 客户端,可以对mysql 数据库实行命令操作,输入exit, quit, q 三个中的任意一个命令,对mysql 客户端退出操作。
mysql 语句规范:
1:关键字和函数名都要大写;
2:数据库名,表名,字段名要小写;
3:每条sql语句都要以分号结尾;
注意: 及时关键字和函数名写成小写,系统也是确认的,一般用来区别关键字,函数,数据库名,表名,字段名,书写的时候要严格遵守。
一些常用的命令:
SHOW DATABASES; //查看数据库列表
USE databaseName ; //使用databaseName 数据库
SHOW TABLES; // 查看databaseName 数据库中的表
CREATE DATABASE IF NOT EXISTS databaseName; //创建databaseName数据库
ALTER DATABASE databaseName CHARACTER SET utf8; //修改数据库databaseName的字符编码格式为utf8
DROP DATABASE IF EXISTS databaseName; //删除数据库databaseName
注意:数据库的创建做if not exists, 删除做if exists, 修改则没有这个判断存在的关键字。
数据类型
存储数字:
存放整数的类型有整型:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT。
存放小数的类型有浮点型:FLOAT, DOUBLE。
存储日期时间:YEAR, TIME, DATE, DATETIME, TIMESTAMP。
存储字符型:CHAR, VARCHAR, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, ENUM, SET。
注意:存储范围越大,占用的空间就越大,使用过程中,根据使用场景,选择最合理最合适的数据类型,而不是存储范围最大的数据类型。
数据表的操作
USE DATABASEName; //使用DATABASEName 数据库
SELECT DATABASE(); //查看当前使用的数据库名称
创建数据库语法:
CREATE TABLE [IF NOT EXISTS] TABLENAME (
column_name data_type,
……
);
SHOW TABLES; // 查看当前数据库中是否有刚刚新建的表
SHOW TABLES FROM otherDatabaseName; // 查看其他数据库中的表 后面还可以带 LIKE, WHERE 模糊查询或查询条件 的通配符。
SHOW COLUMNS FROM tableName; // 查看表中的列
记录操作
INSERT
INSERT INTO tb1 [column_name, ……] VALUES(val, ……); // 如何前面的列名省略,则所有字段全部赋值,如果只给部分字段赋值,则必须制定列名
SELECT
SELECT expr, … FROM tableName; //查询表中的记录,证明记录是否存在
NULL, NOT NULL
允许为空或非空约束,指定字段在数据录入的时候是否为空,二者只能选其一作用一个字段。不为空的字段在录入数据的时候必须为其赋值。
AUTO_INCREMENT
保证记录的唯一性,字段值不会重复,自动编号,且必须与主键组合使用,默认情况下起始值为1, 每次的增量为1。可以是整数,或者浮点数,浮点数的小数位数必须是0,比如float(7, 0), double(7, 0)。
PRIMARY_KEY
主键约束,每张表只能存在一个主键,主键保证记录的唯一性,主键自动为NOT NULL 。
注意:auto_increment 必须与主键 primary_key 一起使用,但主键 primary_key 不一定要与iauto_increment 一起使用。
UNIQUE_KEY
唯一约束,可以保证记录的唯一性,唯一约束的字段可以为空值(NULL),每一张数据表可以存放多个唯一约束。
DEFAULT
默认约束,当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。
FOREIGN_KEY
外键约束保持数据的一致性与完整性,实现一对一或一对多的关系。
要求: 1,父表和子表必须使用相同的存储引擎,而且禁止使用临时表。
2, 数据表的存储引擎只能是InnoDB。
3,外键列和参照列必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同,而字符的长度则可以不同。
4,外键列和参照列必须创建索引,如果参照列不存在索引的话,Mysql 将自动创建索引。
约束: 1,约束保证数据的完整性和一致性。
2,约束分为表级约束和列级约束(约束如何是针对一个字段就是列级,如果是针对两个及以上的则为表级约束)。
3,约束类型包括: NOT NULL(非空约束), PRIMARY KEY(主键约束), UNIQUE KEY(唯一约束), DEFAULT(默认约束), FOREIGN KEY(外键约束)
外键约束的参照操作:
1,CASSADE:从父表删除或更新且自动删除或更新子表中匹配的行。
2,SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL.如果使用该选项,必须保证子表列没有指定NOT NULL。
3,RESTRICT:拒绝对父表的删除或更新操作。
4,NO ACTION:标准SQL的关键字,在mysql中与RESTRICT相同。
修改数据表
ALTER TABLE tableName ADD [COLUMN] column_name column_definition [FIRST|AFTER col_name]; // 修改数据表,新增字段,可以一次加一列,也可以加多列,加多列不可以指定位置关系,只能在原来数据表的下方。
ALTER TABLE tableName DROP column_name;// 删除数据表中的字段
修改列定义
ALTER TABLE tableName MODIFY [COLUMN] column_name column_definition [FIRST|AFTER col_name];
修改列名称
ALTER TABLE tableName CHANGE [COLUMN] column_name column_definition [FIRST|AFTER col_name];
修改数据表名
ALTER TABLE tbl_name TO new_tb1_name; // 会对表的视图或存储过程有影响。
UPDATE
UPDATE tableName set col_name = value, … WHERE expr…;
UPDATE table_references SET col_names = {expre1|DEFAULT} ... [WHERE(where_condition)]; //多表更新
DELETE
DELETE FROM tableName WHERE expr...;
SELECT
select 子查询,是指出现在其他sql 语句内的select子句;使用比较运算符的子查询,=, >, <, >=, <=, <>, !=, <=>, 另外使用ANY, SOME, ALL 关键字修饰的比较运算符,使用 [NOT] IN 的子查询,使用 [NOT] EXISTS 的子查询;
INSERT [INTO] tableName [(col_name, ...)] SELECT ... 将查询结果写入到数据表
CREATE ... SELECT...; //创建数据表的同事将查询结果写入到数据表 CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition, ...)] select_statement
WHERE, LIKE, GROUP BY, HAVING, ORDER BY[]
表的连接诶类型
INNER JOIN, LEFT JOIN, RIGHT JOIN, 使用ON关键字来设定连接条件,也可以使用WHERE 来代替,通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果集记录的过滤。
内连接,显示左表及右表符合链接条件的记录,取交集。
左连接,显示左表的全部记录及右表符合连接条件的记录。
右连接,显示右表中的全部记录及左表符合连接条件的记录。
mysql数据库函数分类
1,字符函数
CONCAT() //字符连接
CONCAT_WS() //使用指定的分隔符进行字符连接
FORMAT() //数字格式化
LOWER() //转换成小写字母
UPPER() //转换成大写字母
LEFT() //获取左侧字符
RIGHT() //获取右侧字符
LENGTH() //获取字符串长度
LTRIM() //删除前导空格
RTRIM() //删除后续空格
TRIM() //删除前导和后续空格
SUBSTRING() //字符串截取
[NOT] LIKE //模式匹配
REPLACE() //字符串替换
2,数值运算符与函数
CEIL() //进一取整
DIV() //整数除法
FLOOR() //舍一取整
MOD() //取余数(取模)
POWER() //幂运算
ROUND() //四舍五入
TRUNCATE() //数字截取
3,比较运算符与函数
[NOT] BETWEN ... AND ... //[不]在范围之内
[NOT] IN() //[不]在列出值范围内
IS [NOT] NULL //[不]为空
4,日期时间函数
NOW() //当前日期和时间
CURDATE() //当前日期
CURTIME() //当前时间
DATE_ADD() //日期变化
DATEDIFF() //日期差值
DATE_FORMAT() //日期格式化
5,信息函数
CONNECTION_ID() //连接ID
DATABASE() //当前数据库
LAST_INSERT_ID() //最后插入记录的ID号
USER() //当前用户
VERSION() //版本信息
6,聚合函数
AVG() //平均值
COUNT() //计数
MAX() //最大值
MIN() //最小值
SUM() //求和
7,加密函数
MD5() //信息摘要算法 web页面应用
PASSWORD() //密码算法 mysql 用户密码修改
自定义函数
CREATE FUNCTION function_name([params params_type, ...]) RETURNS {STRING|INTEGER|REAL|DECIMAL} RETURN routine_body
如:创建一个日期格式化的函数
create function f1() returns varchar(30)
return date_format(now(), '%Y年%m月%d日 %H点:%i分:%s秒');
调用函数:select f1();
如:创建一个求两个参数平均值的函数
create function f2(num1 smallint unsigned, num2 smallint unsigned)
returns float(10, 2)
return (num1+num2)/2;
调用函数:select f2(7, 8);
注意:参数和返回值。
关于函数体:
1,函数体由合法的SQL语句构成
2,函数体可以是简单的SELECT或INSERT语句
3,函数体如果为复合结构则使用BEGIN...END语句
4,复合机构可以包含声明,循环,控制结构;
存储过程
存储过程是SQL语句和控制语句的预编译集合,以一个名词存储并作为一个单元处理。
优点:1,增强SQL语句的功能和灵活性;2,实现较快的执行速度;3,减少了网络流量;
CREATE [definer = {user|CURRENT_USER}]
PROCEDURE proc_name ([proc_parameter [, ...]])
[characteristic ...] routine_body
proc_parameter: [ IN | OUT | INOUT ] param_name type 注意:IN ,表示该参数的值必须在调用存储过程时指定; OUT,表示该参数的值可以被存储过程改变,并且可以返回;INOUT,表示该参数的调用时指定,并且可以被改变和返回.
MySQL存储引擎
MySQL可以将。数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎。每一种存储引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛且不同的功能。
并发控制:
- 当多个连接对记录进行修改时保证数据的一致性和完整性。
锁:
-共享锁(读锁):在同一时间段内,多个用户可以读取同一个资源,读取过程中数据不会发生任何变化。
-排他锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或者写锁操作。
锁颗粒:
-表锁:是一种开销最小的锁策略。对一张表进行加锁处理。
-行锁:是一种开销最大的锁策略。可能对表中的每一行记录进行加锁处理。
事务处理:
-事务用语保证数据库的完整性;
特性:原子性,一致性,隔离性,持久性。
外键:
-是保证数据一致性的策略。
索引:
-是对数据表中的一列或多谢的值进行排序的一种结构。
kMySQL的存储引擎种类:
-MyISAM:
-InnoDB
-Memory
-CSV
-Archive
注意:不同的存储引擎,对事务的支持,锁的策略,外键,数据压缩,存储内存是不一样的。
注意:mysql的使用过程中,需要多实践,针对不同的聚合函数,数据函数,关键字等的组合使用,非常有意思,需要深入学习。