MySQL学习记录

什么是数据库?

数据库Database是按照数据结构来组织、存储和管理数据的仓库。常见的数据库有OracleDB2SQL ServerMySQL等...php

MySQL是一个关系型数据库管理系统,开源免费,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。mysql

相关术语
DB(Database):数据库是存储数据的集合。
DBS(Database System):数据库系统,由数据库和数据库管理软件组成。
DBMS(Database Management System):数据库管理系统,是操做和管理数据库的一个系统。
SQL(Structured Query Language):结构化查询语言,是数据库的程序设计语言sql

MySQL相关命令行操做数据库

配置文件:my.cnf
登陆信息中须要注意的:
---命令行须要以';'或者是'\g'结尾,否则没法结束;
---能够经过'help'或者'\h'或者'?'加上相关关键字来查看手册;
---'\c'能够取消当前命令的执行;

mysql -uroot -p[密码]            #登陆MySQL
mysql -uroot -p -D db_name      #登陆MySQL的同时打开数据库
exit;                        #退出MySQL
quit;                        #退出MySQL
\q;                            #退出MySQL
ctrl+c                        #退出MySQL

#获取当前MySQL的版本号
mysql -V;
mysql --version;

SQL语句语法规范数组

  • 经常使用MySQL的关键字须要大写,库名、表名、字段名称等使用小写;
  • SQL语句支持折行操做,拆分的时候不能把完整单词拆开;
  • 数据库名称、表名称、字段名称不能使用MySQL的保留字,若是必需要使用,须要用反引号;

经常使用SQL语句
SELECT USER(); #获得登陆的用户
SELECT VERSION(); #获得MySQL的版本信息
SELECT NOW(); #获得当前的日期时间
SELECT DATABASE(); #获得当前打开的数据库缓存

SQL的注释数据结构

#注释内容
--注释内容

数据库SQL操做并发

#建立数据库
CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name;
CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name DEFAULT CHARACTER SET [=] 'charset'; #指定编码格式
--注意:数据库名称最好有意义,名称不要包含特殊字符或者是MySQL关键字。

#修改数据库的编码方式
ALTER DATABASE db_name DEFAULT CHARACTER SET [=] 'charset';

#删除数据库
DROP DATABASE [IF EXISTS] db_name;

#打开指定数据库
USE db_name;    #在操做数据库里面的表以前须要先打开数据库

#SHOW方法
SHOW DATABASES|SCHEMAS;                            #查看所有的数据库
SHOW CREATE DATABASE db_name;                 #查看数据库的详细信息(编码格式)
SHOW WARNINGS;                                   #查看上一步操做产生的警告信息


#MySQL注释
'#'注释内容
'--'注释内容

数据表SQL操做
数据库表是一系列二维数组的集合,用来表明和存储数据对象之间的关系,是数据库最重要的组成部分之一。
数据保存在表中,表名要求惟一,不要包含特殊字符,最好含义明确函数

  • 主键:指的是一个列或多列的组合,其值能惟一地标识表中的每一行,一个表中只能有一个主键。主键主要是用于其余表的外键关联,以及本记录的修改与删除。
  • 外键:若是公共字段在一个表中是主键,那么这个字段被称为另外一个表的外键,一个表中能够有多个外键。外键保持数据一致性和完整性,主要目的是控制存储在外键表中数据,使两张表造成关联,外键只能引用外表中的列的值或者使用空值。
  • 索引:对表中一列或者多列的值进行排序的一种结构,使用索引可快速访问表中的特定信息,一个表中能够有多个索引。索引的主要目的是加快检索表中数据的方法。

表结构相关操做:工具

#建立表
CREATE TABLE[IF NOT EXISTS] table_name( 
   字段名称1 字段类型[完整性约束条件],
   字段名称2 字段类型[完整性约束条件],
   ...
)ENGINE=存储引擎 CHARSET=编码方式;
    
#删除表
DROP TABLE [IF EXISTS] table_name;
    
#查看表的建立信息
SHOW CREATE TABLE table_name;
    
#查看当前数据库下全部的表
SHOW [FULL] TABLES [{FROM|IN} db_name];
    
#查看表结构
DESC table_name;                      
DESCRIBE table_name;
SHOW COLUMNS FROM table_name;
    
#添加字段
ALTER TABLE table_name ADD 字段名称 字段属性[完整性约束条件] [FIRST|AFTER 字段名称]; 
    
#删除字段
ALTER TABLE table_name DROP 字段名称;
    
#添加默认值
ALTER TABLE table_name ALTER 字段名称 SET DEFAULT 默认值;
    
#删除默认值
ALTER TABLE table_name ALTER 字段名称 DROP DEFAULT;
    
#修改字段类型、字段属性
ALTER TABLE table_name MODIFY 字段名称 字段类型[字段属性] [FIRST|AFTER 字段名称]
    
#修改字段名称、字段类型、字段属性
ALTER TABLE table_name CHANGE 原字段名称 新字段名称 字段属性 [FIRST|AFTER 字段名称]
    
#添加主键
ALTER TABLE table_name ADD PRIMARY KEY(字段名称)
    
#删除主键
ALTER TABLE table_name DROP PRIMARY KEY;
    
#添加惟一
ALTER TABLE table_name ADD UNIQUE KEY|INDEX [index_name](字段名称)  --若是不添加index_name,则索引名称默认为字段名称
    
#删除惟一
ALTER TABLE table_name DROP INDEX index_name;
    
#修改数据表名称
ALTER TABLE table_name RENAME [TO|AS] new_table_name;
RENAME TABLE table_name TO new_table_name;

关键字含义
UNSIGNED:无符号,没有负数,从0开始
ZEROFILL:零填充,当数据显示长度不够的时候可使用前补0的效果填充至指定长度
NOT NULL:非空约束,也就是插入值的时候这个字段必需要给值
DEFAULT:默认值,若是插入记录的时候没有给字段赋值,则会使用默认值
PRIAMARY KEY:主键,标识记录的惟一性,值不能重复,一个表只能有一个主键
UNIQUE KEY:惟一性索引,一个表中能够有多个字段是惟一索引,一样的值不能重复,可是NULL除外
AUTO_INCREASE:自动增加,只能用于数值列,并且配合索引或主键使用
FOREIGN KEY:外键约束
COMMENT:添加注释

#设置主键的两种方式
CREATE TABLE test_primarykey(id INT UNSIGNED PRIMARY KEY, username VARCHAR(20));        #直接在字段后面设置属性
CREATE TABLE test_primarykey1(id INT UNSIGNED, username VARCHAR(20), PRIMARY KEY(id));     #利用函数设置字段

MySQL数据类型

  • 数值型

    • 整数型TINYINT SMALLINT MEDIUMINT INT BIGINT BOOL/BOOLEAN
    • 浮点数FLOAT DOUBLE DECIMAL
    • 定点数
  • 字符串类型CHAR(M) VARCHAR(M) TINYTEXT TEXT MEDIUMTEXT LONGTEXT ENUM('', ''...) SET('', ''...)
  • 日期时间类型

CHARVARCHAR的比较:
CHAR是定长,VARCHAR变长;
CHAR效率高于VARCHARCHAR至关于拿空间换时间,VARCHAR拿时间换空间;
CHAR默认存储数据的时候,后面会用空格填充到指定长度,而在检索的时候会去掉后面空格,VARCHAR不会进行填充,检索的时候尾部的空格会留下。
注意:TEXT类型的字段不能有默认值,检索的时候不存在大小写转换。

MySQL中经常使用函数
COUNT()语法:
COUNT(column_name):返回指定列的值的数目
COUNT(*):返回表中的记录数目
COUNT(DISTINCT column_name):返回指定列的不一样值的数目

CONCAT()语法:
CONCAT():用于将多个字符串链接成一个字符串。
用法:CONCAT(str1, str2, …),返回结果为链接参数产生的字符串,若是任何一个参数为NULL,则返回为NULL
CONCAT_WS():用一个分隔符将多个字符串链接成一个字符串
用法:CONCAT_WS(separator, str1, str2, …),若是分隔符为NULL,则返回为NULL

MySQL存储引擎
MyISAM存储引擎

  • 默认MyISAM的表会在磁盘中产生三个文件:.frm .MYD .MYI
  • 能够在建立表的时候指定数据文件和索引文件存储位置
  • MyISAM单表最大支持的数据量2的64次方条记录
  • 每一个表最多能够创建64个索引
  • 若是是复合索引,每一个复合索引最多包涵16个列,索引值最大长度是1000B
  • MyISAM引擎的存储格式:定长FIXED、动态DYNAMIC、压缩COMPRESSED

InnoDB存储引擎

  • 设计遵循ACID模型Atomicity原子性、Consistency一致性、Isolation隔离性、Durability持久性,支持事务,具备从服务崩溃中恢复的能力,可以最大限度保护用户的数据
  • 支持行级锁,能够提高多用户并发时的读写性能
  • 支持外键,保证数据的一致性和完整性
  • InnoDB拥有本身独立的缓冲池,经常使用的数据和索引都在缓存中

记录SQL操做

添加记录

#一条记录用VALUE,多条记录用VALUES
INSERT [INTO] table_name[(col_name1, col_name2...)] VALUE|VALUES(value1, value2...);

#不列出字段名称[须要按照建表时的字段顺序给每个字段赋值]
INSERT [INTO] table_name VALUE(value1, value2...);

#一次添加多条记录
INSERT [INTO] table_name[(col_name1, col_name2...)] VALUES(value1, value2...), (value1, value2...),...;

#INSERT...SET语句
INSERT [INTO] table_name SET 字段名称=值,...;

#INSERT...SELECT语句
INSERT [INTO] table_name SELECT 字段名称,... FROM table_name [WHERE条件语句];

修改记录

UPDATE table_name SET 字段名称1=值1, 字段名称2=值2,... [WHERE条件语句];

删除记录

DELETE FROM table_name [WHERE条件语句];

查询记录

# DESC:指定列按降序排列  ASC:指定列按升序排列
# GROUP BY:分组,把值相同放到一个组里,最终查询出的结果只会显示组中一条记录,分组配合GROUP_CONCAT()查看组中某个字段的详细信息
# ORDER BY:设置记录按照某字段的值进行排序,默认ASC升序
# LIMIT:限制结果集的显示条数,能够用来实现分页
        LIMIT 数字:显示结果集的前几条记录
        LIMIT offset, row_count:从offset开始[offset从0开始],显示几条记录
SELECT 字段1, 字段2,... FROM table_name [WHERE条件语句] [GROUP BY(col_name) Having 二次筛选] [ORDER BY(col_name) DESC|ASC] [LIMIT 限制结果集的显示条数];

#查询全部记录的全部字段
SELECT * FROM table_name;

#查询指定字段的信息
SELECT 字段名称1, 字段名称2,... FROM table_name [WHERE条件语句];

#查询某数据库下某表的记录[这样能够不用打开该数据库就能操做该表]
SELECT 字段名称1, 字段名称2,... FROM db_name.table_name [WHERE条件语句];

#给字段取别名[别名名称可使用中文]
SELECT 字段名称 [AS] 别名名称,... FROM table_name [WHERE条件语句];

#给表取别名[单张表没有太大做用,多张表才体现]
SELECT 字段名称1, 字段名称2,... FROM table_name [AS] 别名 [WHERE条件语句];

#表名.字段名称[单张表没有太大做用,多张表才体现]
SELECT table_name.字段名称,... FROM table_name [WHERE条件语句]

#WHERE条件[筛选符合条件的记录]
比较运算符:> < >= <= != <> <=>
逻辑运算符:AND(逻辑与) OR(逻辑或)
IS [NOT] NULL:检测值是否为NULL或者NOT NULL
指定范围:[NOT] BETWEEN...AND
指定集合:[NOT] IN(值1, 值2,..)
匹配字符:[NOT] LIKE
        %:任意长度的字符串
        _:任意一个字符
        
#模糊查询
在执行数据库查询时,分为完整查询和模糊查询。
格式:SELECT 字段1, 字段2,.. FROM table_name WHERE 某字段 LIKE 条件;

模糊查询包涵两种通配符:
%:表示0个或多个字符,能够匹配任意类型或任意长度的字符。
LIKE '%王':匹配的是字段结尾为'王'的全部记录;
LIKE '王%':匹配的是字段开头为'王'的全部记录;
LIKE '%王%':匹配的是字段包含'王'的全部记录;

_:表示任何单个字符,匹配单个任意字符,它经常使用来限制表达式的字符长度。
LIKE '_王':匹配的是字段长度为2,而且结尾为'王'的全部记录;
LIKE '王_':匹配的是字段长度为2,而且开头为'王'的全部记录;
LIKE '_王_':匹配的是字段长度为3,而且中间为'王'的全部记录;

#经常使用聚合函数
COUNT():统计记录总数
SUM():求和
MAX():求最大值
MIN():求最小值
AVG():求平均值

#产生随机数
SELECT RAND();

#实现随机记录[出现的记录排序是随机的]
SELECT * FROM table_name ORDER BY RAND();


#测试完整SELECT语句的形式
MariaDB [test004]> SELECT GROUP_CONCAT(name) AS '姓名', COUNT(*) AS '人数', SUM(age) AS '总和', MAX(age) AS '最大', MIN(age) AS '最小', AVG(age) AS '平均' FROM user WHERE id >=1 GROUP BY address ORDER BY '总和';

多表查询

1. 笛卡尔积形式
笛卡尔积是多表链接组成一个新表的状况,全部的链接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合,新表的记录数为多张表的记录条数的乘积,实际应用中通常不知足需求,只有在两个表链接时加上限制条件,才有实际的意义。

test1                   test2
+------+--------+        +------+--------+
| id   | name   |        | id   | name   |
+------+--------+        +------+--------+
|    1 | 小红   |           |    1 | 张三   |
|    2 | 小明   |           |    2 | 李四   |
+------+--------+        +------+--------+

MariaDB [test005]> select a.*, b.* from test1 a, test2 b;
+------+--------+------+--------+
| id   | name   | id   | name   |
+------+--------+------+--------+
|    1 | 张三   |    1 | 小红   |
|    2 | 李四   |    1 | 小红   |
|    1 | 张三   |    2 | 小明   |
|    2 | 李四   |    2 | 小明   |
+------+--------+------+--------+


2. 内链接形式(经常使用)
利用内链接可获取两表的公共部分的记录
SELECT 字段名称,... FROM  table_name1 INNER JOIN table_name2 ON 链接条件

3. 外链接形式
左外链接:以左表为主,先显示左表中的所有记录,再去右表中查询知足复合条件的记录,不符合的以NULL代替
SELECT 字段名称,... FROM table_name1 LEFT [OUTER] JOIN table_name2 ON 链接条件

右外链接:以右表为主,先显示右表中的所有记录,再去左表中查询知足复合条件的记录,不符合的以NULL代替
SELECT 字段名称,... FROM table_name1 RIGHT [OUTER] JOIN table_name2 ON 链接条件

图形化工具管理数据库

B/S结构
phpMyAdmin

C/S结构
Sequel Pro
Navicat for MySQL
MySQL workbench
相关文章
相关标签/搜索