zoukankan      html  css  js  c++  java
  • MySql学习笔记

    1、登录到MySQL
    当 MySQL 服务已经运行时, 我们可以通过MySQL自带的客户端工具登录到MySQL数据库中, 首先打开命令提示符, 输入以下格式的命名:
    mysql -h 主机名 -u 用户名 -p
    -h : 该命令用于指定客户端所要登录的MySQL主机名, 登录当前机器该参数可以省略;
    -u : 所要登录的用户名;
    -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。

    2、创建一个数据库:
    使用 create database 语句可完成对数据库的创建, 创建命令的格式如下:
    create database 数据库名 [其他选项];
    例如我们需要创建一个名为 samp_db 的数据库, 在命令行下执行以下命令:
    create database samp_db character set gbk;
    注意: MySQL语句以分号(;)作为语句的结束, 若在语句结尾不添加分号时, 命令提示符会以 -> 提示你继续输入(有个别特例, 但加分号是一定不会错的);
    提示: 可以使用 show databases; 命令查看已经创建了哪些数据库。

    3、选择要使用的数据库:
    要对一个数据库进行操作, 必须先选择该数据库, 否则会提示错误:
    ERROR 1046(3D000): No database selected
    两种方式对数据库进行使用的选择:
    1): 在登录数据库时指定, 命令: mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p
    例如登录时选择刚刚创建的数据库: mysql -D samp_db -u root -p
    2): 在登录后使用 use 语句指定, 命令: use 数据库名;
    use 语句可以不加分号, 执行 use samp_db 来选择刚刚创建的数据库, 选择成功后会提示: Database changed

    4、创建数据库表:
    使用 create table 语句可完成对表的创建, create table 的常见形式:
    create table 表名称(列声明);
    以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel) 这些内容:
    create table students

    id int unsigned not null auto_increment primary key,
    name char(8) not null,
    sex char(4) not null,
    age tinyint unsigned not null,
    tel char(13) null default "-"
    );
    对于一些较长的语句在命令提示符下可能容易输错, 因此我们可以通过任何文本编辑器将语句输入好后保存为 createtable.sql 的文件中, 通过命令提示符下的文件重定向执行执行该脚本。
    打开命令提示符, 输入: mysql -D samp_db -u root -p < createtable.sql
    使用 show tables; 命令可查看已创建了表的名称; 2. 使用 describe 表名; 命令可查看已创建的表的详细信息。

    5、操作数据库之查询操作:
    select 语句常用来根据一定的查询规则到数据库中获取数据, 其基本的用法为:
    select 列名称 from 表名称 [查询条件];
    例如要查询 students 表中所有学生的名字和年龄, 输入语句 select name, age from students; 执行结果如下:
    mysql> select name, age from students;
    也可以使用通配符 * 查询表中所有的内容, 语句: select * from students;
    按条件查询:
    where 关键词用于指定查询条件, 用法形式为: select 列名称 from 表名称 where 条件;
    以查询所有性别为女的信息为例, 输入查询语句: select * from students where sex="女";
    where 子句不仅仅支持 "where 列名 = 值" 这种名等于值的查询形式, 对一般的比较运算的运算符都是支持的, 例如 =、>、<、>=、<、!= 以及一些扩展运算符 is [not] null、in、like 等等。 还可以对查询条件使用 or 和 and 进行组合查询, 以后还会学到更加高级的条件查询方式, 这里不再多做介绍。
    示例:
    查询年龄在21岁以上的所有人信息: select * from students where age > 21;
    查询名字中带有 "王" 字的所有人信息: select * from students where name like "%王%";
    查询id小于5且年龄大于20的所有人信息: select * from students where id<5 and age>20;

    6、操作数据库之插入操作:
    insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下:
    insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);
    其中 [] 内的内容是可选的, 例如, 要给 samp_db 数据库中的 students 表插入一条记录, 执行语句:
    insert into students values(NULL, "王刚", "男", 20, "13811371377");

    7、删除表中的数据:
    delete 语句用于删除表中的数据, 基本用法为:
    delete from 表名称 where 删除条件;
    使用示例:
    删除id为2的行: delete from students where id=2;
    删除所有年龄小于21岁的数据: delete from students where age<20;
    删除表中的所有数据: delete from students;

    8、更新表中的数据:
    update 语句可用来修改表中的数据, 基本的使用形式为:
    update 表名称 set 列名称=新值 where 更新条件;
    使用示例:
    将id为5的手机号改为默认的"-": update students set tel=default where id=5;
    将所有人的年龄增加1: update students set age=age+1;
    将手机号为 13288097888 的姓名改为 "张伟鹏", 年龄改为 19: update students set name="张伟鹏", age=19 where tel="13288097888";

    9、创建后表的修改:
    alter table 语句用于创建后对表的修改, 基础用法如下:
    添加列
    基本形式: alter table 表名 add 列名 列数据类型 [after 插入位置];
    示例:
    在表的最后追加列 address: alter table students add address char(60);
    在名为 age 的列后插入列 birthday: alter table students add birthday date after age;
    修改列
    基本形式: alter table 表名 change 列名称 列新名称 新数据类型;
    示例:
    将表 tel 列改名为 telphone: alter table students change tel telphone char(13) default "-";
    将 name 列的数据类型改为 char(16): alter table students change name name char(16) not null;
    删除列
    基本形式: alter table 表名 drop 列名称;
    示例:
    删除 birthday 列: alter table students drop birthday;
    重命名表
    基本形式: alter table 表名 rename 新表名;
    示例:
    重命名 students 表为 workmates: alter table students rename workmates;
    删除整张表
    基本形式: drop table 表名;
    示例: 删除 workmates 表: drop table workmates;
    删除整个数据库
    基本形式: drop database 数据库名;
    示例: 删除 samp_db 数据库: drop database samp_db;

    10、mysql事务:
    MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
    在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
    事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
    事务用来管理insert,update,delete语句
    一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)
    原子性: 确保了工作单位中的所有操作都成功完成; 否则,事务被中止,在失败时会被回滚到事务操作以前的状态。
    一致性:可确保数据库在正确的更改状态在一个成功提交事务。
    隔离性: 使事务相互独立地操作。
    持久性: 确保了提交事务的结果或系统故障情况下仍然存在作用。
    在Mysql控制台使用事务来操作
    1)开始一个事务
    start transaction
    2) 做保存点
    savepoint 保存点名称
    3)操作
    4)可以回滚,可以提交,没有问题,就提交,有问题就回滚。


    11、mysql中的LIKE子句:
    我们知道在MySQL中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。
    WHERE 子句中可以使用等号 (=) 来设定获取数据的条件,如 "runoob_author = 'Sanjay'"。
    但是有时候我们需要获取 runoob_author 字段含有 "jay" 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
    SQL LIKE 子句中使用百分号(%)字符来表示任意字符,类似于UNIX或正则表达式中的星号 (*)。
    如果没有使用百分号(%), LIKE 子句与等号(=)的效果是一样的。
    语法
    以下是SQL SELECT 语句使用 LIKE 子句从数据表中读取数据的通用语法:
    SELECT field1, field2,...fieldN table_name1, table_name2...
    WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
    你可以在WHERE子句中指定任何条件。
    你可以在WHERE子句中使用LIKE子句。
    你可以使用LIKE子句代替等号(=)。
    LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
    你可以使用AND或者OR指定一个或多个条件。
    你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。

    12、mysql排序:
    我们可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪中方式来进行排序,再返回搜索结果。
    以下是 SQL SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据:
    SELECT field1, field2,...fieldN table_name1, table_name2...
    ORDER BY field1, [field2...] [ASC [DESC]]
    你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
    你可以设定多个字段来排序。
    你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
    你可以添加 WHERE...LIKE 子句来设置条件。
    SELECT * from runoob_tbl ORDER BY runoob_author ASC;
    从runoob_tbl表中查询所有数据,其中runoob_author按升序排序。
    ASC:升序排序;
    DESC:倒序排序。

    13、mysql索引:
    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
    索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
    创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
    实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
    建立索引的缺点:
    虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
    建立索引会占用磁盘空间的索引文件。
    1)普通索引:INDEX
    创建索引:
    这是最基本的索引,它没有任何限制。它有以下几种创建方式:
    CREATE INDEX indexName ON mytable(username(length));
    如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
    修改表结构
    ALTER mytable ADD INDEX [indexName] ON (username(length))
    创建表的时候直接指定
    CREATE TABLE mytable(
    ID INT NOT NULL,
    username VARCHAR(16) NOT NULL,
    INDEX [indexName] (username(length))
    );
    删除索引的语法
    DROP INDEX [indexName] ON mytable;
    2)唯一索引:UNIQUE INDEX
    它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
    创建索引
    CREATE UNIQUE INDEX indexName ON mytable(username(length))
    修改表结构
    ALTER table mytable ADD UNIQUE [indexName] (username(length))
    创建表的时候直接指定
    CREATE TABLE mytable(
    ID INT NOT NULL,
    username VARCHAR(16) NOT NULL,
    UNIQUE [indexName] (username(length))
    );
    显示索引信息
    使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 G 来格式化输出信息。
    尝试以下实例:
    mysql> SHOW INDEX FROM table_nameG

    14、mysql中的两种重要的锁机制:
    1)表锁 (Table Lock):锁定整张表。一个用户在对表进行写操作(插入、删除、更新等)前,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。只有没有写锁时,其他读取的用户才能获得读锁,读锁之间是不相互阻塞的。
    2)行级锁(Row Lock):行级锁只在存储引擎层实现,而mysql服务器层没有实现。

    15、mysql的隔离级别:
    在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务见是可见的,哪些是不可见的。较低级别的隔离可以执行更高的并发,系统的开销也更低。
    1)未提交读(READ UNCOMMITTED):在事务中的修改,即使没有提交,对其他事务也都是可见的。
    2)提交读(READ COMMITTED):提交读满足隔离性的简单定义,即一个事务开始时,只能“看见”已经提交的事务所做的修改。换句话说就是一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。在各个级别也叫做不可重复读,
    3)可重复读(REPEATABLE READ):解决了脏读的问题,该级别保证了在同一个事务中多次读取同样记录的结果是一致的。但是理论上,可重复读隔离级别还是无法解决另一个幻读的问题,所谓幻读就是当某个事务在读取某个范围内的记录时候,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻读。InnoDB存储引擎通过多版本并发控制解决了幻读的问题。
    4)可串行化(SERIALIZABLE):最高的隔离级别,通常强制事务串行执行,简单的说,就是在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题,实际应用中很少会使用到这个隔离级别。

  • 相关阅读:
    VS code 快捷键注释不能用[!----]解决办法
    vue 文件导出demo
    vue中后台返回的是数字,前端利用字典将其转换为相对应的中文
    java.lang.UnsupportedOperationException解决方法【转】
    Java List的remove()方法陷阱
    密码至少包含数字、大小写字母、特殊字符两种以上,长度不小于8位
    获取规格内数字
    获取时间段数据
    Echarts GL初次体验
    bootstrap-datetimepicker 如何获取值(日期)
  • 原文地址:https://www.cnblogs.com/wrong5566/p/6531843.html
Copyright © 2011-2022 走看看