MySQL视频笔记

已经发布博客

慕课网的免费课程

综合评分:9.7

非常高,听后效果也是很好,没有废话,都是干货,总共8.5小时,让你对MySQL有个初步了解。

https://www.imooc.com/learn/122

'''

 

#2018-06-19 484508 June Tuesday the 25 week, the 170 day SZ

 

C:\Users\z003tesj>mysql -uroot -p044500 -P3306 -h127.0.0.1

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 40

Server version: 5.5.59 MySQL Community Server (GPL)

 

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

'''

与MySQL的零距离接触

左下角开始输入cmd,回车,

打开mysql:

net start mysql

登陆MySQL客户端:

mysql -uroot -p044500 -P3306 -h127.0.0.1

或者:

mysql -uroot -p044500

出现mysql>说明成功登陆了,

然后就进入系统,展示所有的数据库:

mysql> SHOW DATABASES; 

选择一个数据库,要不然会报错:ERROR 1046(3D000): No Database Selected

接着使用数据库:

mysql> USE test 

显示所有的列表:

SHOW TABLES;

显示列表中某个内容:

SHOW COLUMNS FROM users;

显示users的具体内容:

SELECT * FROM users;

##############################################

SHOW DATABASE;

mysql> SHOW DATABASES;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| t2                 |

| test               |

+--------------------+

5 rows in set (0.01 sec)

 

 

SHOW TABLES;

+----------------+

| Tables_in_test |

+----------------+

| provinces      |

| tb1            |

| tb2            |

| tb3            |

| tb4            |

| tb5            |

| tb6            |

| users1         |

| users3         |

+----------------+

SHOW TABLES FROM mysql;

SHOW COLUMNS FROM tb3;

SHOW TABLES;

SHOW COLUMNS;

SHOW CREATE TABLE provinces;

SHOW INDEXES FROM provinces;

 

SHOW COLUMNS FROM user;

SHOW CREATE TABLE users1;

 

mysql> CREATE TABLE users(

    ->

    -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT

    -> username VARCHAR(20) NOT NULL,

    -> password VARCHAR(20) NOT NULL,

    -> age TINYINT UNSIGNED NOT NULL DEFAULT 10,

    -> sex BOOLEAN

    -> );

 

mysql> SHOW COLUMNS FROM users;

+----------+----------------------+------+-----+---------+----------------+

| Field    | Type                 | Null | Key | Default | Extra          |

+----------+----------------------+------+-----+---------+----------------+

| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| username | varchar(20)          | NO   |     | NULL    |                |

| password | varchar(20)          | NO   |     | NULL    |                |

| age      | tinyint(3) unsigned  | NO   |     | 10      |                |

| sex      | tinyint(1)           | YES  |     | NULL    |                |

+----------+----------------------+------+-----+---------+----------------+

 

 

mysql> SELECT * FROM users;

+----+----------+----------+-----+------+

| id | username | password | age | sex  |

+----+----------+----------+-----+------+

|  1 | Tom      | 123      |  25 |    1 |

+----+----------+----------+-----+------+

1 row in set (0.00 sec)

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

 

登陆MySQL客户端:

mysql -uroot -p044500

 

出现mysql>说明成功登陆了

接着使用数据库

代码:

USE test;

接着创建数据表:

代码:

CREATE TABLE provinces(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(20) NOT NULL);

 

 

 

 

 

MySQL基础

1.1

瑞典 MySQL AB公司开发,目前属于Oracle公司,开源关系型数据库

社区版和企业版

Server version: 5.5.59 MySQL Community Server (GPL)

1.2 、安装

MSI安装方式

MySQL Server 5.5 安装

下载地址

https://dev.mysql.com/downloads/mysql/

 

C:\Program Files\MySQL\MySQL Server 5.5\bin\

MySQLInstanceConfig.exe

该文件进行配置

detailed Configuration不用,因为麻烦

我们选择standard configuration 

下一步选择install as windows service

launch the mysql server 

include bin directory in windows path添加到Windows路径

 

下一步:modify security settings

password 044500

root是超级用户

 

bin存储可执行文件

data存储数据文件

docs,文档目录

include包含的头文件

lib库文件

share错误信息和字符集文件

 

修改编码方式:

C:\Program Files\MySQL\MySQL Server 5.5\my.ini

 

双击my.ini

port端口号 3306

在port=3306后面修改编码格式为utf8

搜索“default-character-set”将其改为utf8,

搜索“character-set-server=utf8”将其改为utf8

 

按照老师要求,修改完后,发现无法保存。

解决办法:修改后另存为桌面,然后把桌面修改好的my.ini复制到路径替换以前的my.ini

 

 

 

1.3

启动mysql

控制栏输入

C:\Users\z003tesj>net start mysql

 

停止服务:net stop mysql

但是会报错:System error 5 has occurred. Access is denied." 

解决方案,

先关闭mysql,

在开始的附件里找到 command prompt右击,用管理员模式打开就解决了。

 

说明系统正确配置和启动了

 

1.4

mysql登陆和退出

cls清屏

查看版本

C:\Windows\system32>mysql -V

mysql  Ver 14.14 Distrib 5.5.59, for Win64 (AMD64)

 

-u用户名

-P端口号

-p密码

--prompt=name设置用户名

-h服务器名称

-D打开指定数据库

--delimiter=name指定分隔符

管理员权限用户名

mysql -uroot -p

 

C:\Windows\system32>mysql -uroot -p

Enter password: ******

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.5.59 MySQL Community Server (GPL)

 

本地回环 地址-h127.0.0.1

 

mysql> mysql -uroot -p -P3306 -h127.0.0.1

默认0006端口和本地服务器

所以-P3306 和h 也可以不写

 

退出:exit or quit or \q

 

mysql> mysql -uroot -p -P3306 -h127.0.0.1

    -> \q

Bye

按下键盘的上下箭头,让命令重新出现,选择自己需要的命令就行

 

1.5

 

修改MySQL提示符

1》连接客户端时候通过参数指定:shell>mysql -uroot -proot --prompt 提示符

 

连接上客户端后,通过prompt命令修改

mysql>prompt提示符

 

C:\Windows\system32>mysql -uroot -p044500 --prompt \h

 

 

提示符:

\D 完整日期

\d 当前数据库

\h 服务器名称

\u 当前用户

 

root用户名

localhost服务器名称

(none)当前数据库

 

以下是命令行的内容

localhost

localhostprompt mysql

PROMPT set to 'mysql'

mysqlPROMPT \u@\h \d

PROMPT set to '\u@\h \d'

root@localhost (none)USE test

Database changed

root@localhost test

 

 

USE test是还没有学过的命令

 

1.6

 

MySQL常用命令以及语法规范

 

SELECT VERSION();

显示当前服务器版本号

SELECT NOW();

显示当前时间

SELECT USER();

显示当前用户

 

MySQL语句的规范

关键字和函数名称全部大写

2数据库名称,表名称,字段名称全部小写

3SQL语句必须用分好结尾

 

1.7 操作数据库

 

系统自带四个数据库

创建数据库:

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name

 

 

大括号是必选项,中括号是可选项,|是从中做个选择,取出一个就行

 

localhost testSHOW DATABASE;

localhost testSHOW DATABASES;

查看当前服务器下的数据库列表

SHOW {DATABASES | SCHEMAS}

[LIKE 'pattern' | WHERE expr] 

创建数据库 

root@localhost testCREATE DATABASE IF NOT EXISTS t1;

Query OK, 1 row affected, 1 warning (0.00 sec)

 

root@localhost testSHOW WARNINGS;

 

 

root@localhost testSHOW CREATE DATABASE t1;

 

root@localhost testCREATE DATABASE IF NOT EXISTS t2;

这样t2就被创建了

 

修改数据库

ALTER {DATABASE | SCHEMA} [db_name]

[DEFAULT] CHARACTER SET [=] charset_name

 

控制栏:

root@localhost testALTER DATABASE t2 CHARACTER SET = gbk;

 

删除数据库

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

删除时候一定要保存数据库的存在。

 

控制栏:

root@localhost testDROP DATABASE t2

    -> ;

Query OK, 0 rows affected (0.01 sec)

如果忘记写分号,可以在下一行继续补上分号就行。

 

root@localhost testSHOW DATABASES;

显示目前的数据库列表

 

2-1

内容回顾:

MySQL基础

安装MySQL

配置MySQL

使用MySQL

 

默认端口号:3306

超级用户名:root

创建数据库:CREATE DATABASE

修改数据库:ALTER DATABASE

删除数据库:DROP DATABASE

 

2-2 MySQL数据类型之整型

TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, 

 

2-3 数据类型之浮点型

单精度浮点

FLOAT[(M,D)]

双精度DOUBLE[(M,D)]

M是数字总位数,D是小数点后面的位数,

 

2-4 数据类型之日期,时间

 

YEAR, TIME, DATE, DATETIME, TIMESTAMP,

 

2-5MySQL数据类型之字符型

 

CHAR(M), VARCHAR(M), TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, ENUM('value', 'value2',....)

SET('value1', 'value2',...)

 

2-6 

MySQL创建数据表 

 

数据表是其他对象的基础,二维表格,行,列

行:记录,

列:字段

 

USE打开某个数据库

USE 数据库名称;

 

控制栏登陆数据库代码:

#ntsqk -yriit -p044500 -P3306 -h127.0.0.1

mysql -uroot -p004500 -P3306 -h127.0.0.1

 

USE test;

SELECT DATABASE();

 

 

创建数据表

CREATE TABLE [IF NOT EXISTS] table_name(column_name data_type, ...)

 

控制栏代码:

root@localhost testCREATE TABLE tb1(

    -> username VARCHAR(20),

    -> age TINYINT UNSIGNED,

    -> salary FLOAT(8,2) UNSIGNED

    -> );

Query OK, 0 rows affected (0.03 sec)

 

 

2-7 MySQL查看数据表

 

SHOW TABLES[FROM db_name] [LIKE 'pattern' | WHERE expr]

 

控制栏代码:

 

root@localhost testSHOW TABLES;

显示test用户里面的tables

 

root@localhost testSHOW TABLES FROM mysql;

显示mysql里面所有的数据表

root@localhost testSELECT DATABASE();

 

2-8 

查看数据表结构

SHOW COLUMNS FROM tbl_name

控制栏内容:

 

2-9 MySQL记录的插入与查找

 

插入记录:

INSERT [INTO] tbl_name[ (col_name,...)] VALUESE(val,...)

列名字可以省略,但是要给所有列都赋值

 

代码:

root@localhost testINSERT tb1 VALUES('Tom', 25);

 

给某部分赋值

代码:

INSERT tb1(username,salary) VALUES('JOHN', 9666.68);

 

 

记录查找

SELECT expr,... FROM tbl_name

 

代码:

SELECT * FROM tb1;

 

 

2-10 MySQL空值与非空 

添加相应属性

NULL, 字段值可以为空

NOT NULL, 字段值禁止为空

 

代码:

CREATE TABLE tb2(

username VARCHAR(20) NOT NULL,

age TINYINT UNSIGNED NULL);

 

INSERT tb2 VALUES('tom',NULL);

 

SELECT * FROM tb2;

 

INSERT tb2 VALUES(NULL, 26);

 

2-11 MySQL自动编号

AUTO_INCREMENT

自动编号,必须和主键组合使用

默认情况,起始值是1,增量是1,增量为整数,如果是为浮点数,小数位数为零,

 

代码:

CREATE TABLE tb3(id SMALLINT UNSIGNED AUTO_INCREMENT, username VARCHAR(30) NOT NULL);

报错:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto colum

n and it must be defined as a key

必须定义一个主键为自动列

 

2-12 MySQL初涉主键约束 

主键约束

每张数据表只能存在一个主键

主键保证记录的唯一性

主键自动为NOT NULL

 

代码:

CREATE TABLE tb3(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL);

 

 

root@localhost testSHOW COLUMNS FROM tb3;

 

INSERT tb3(username) VALUES('TOM');

INSERT tb3(username) VALUES('JOHN');

INSERT tb3(username) VALUES('JOHN');

INSERT tb3(username) VALUES('ROSE');

INSERT tb3(username) VALUES('DIMITAR');

 

SELECT * FROM tb3;

 

代码:

CREATE TABLE tb4(id SMALLINT UNSIGNED PRIMARY KEY, username VARCHAR(20) NOT NULL);

 

SHOW COLUMNS FROM tb4;

 

INSERT tb4 VALUES(4,'TOM');

 

INSERT tb4 VALUES(22,'JOHN');

 

SELECT*FROM tb4;

 

2-13 MySQL初涉唯一约束

UNIQUE KEY

唯一约束

保证记录的唯一性

唯一约束的字段可以为空值NULL

每张数据表可以存在多个唯一约束

 

代码:

CREATE TABLE tb5(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20) NOT NULL UNIQUE KEY, age tinyint UNSIGNED);

 

root@localhost testSHOW COLUMNS FROM tb5;

 

INSERT tb5(username, age) VALUES('Tom',22);

 

2-14

MySQL初涉默认约束

DEFAULT

默认值

当插入记录时候,如果没有明确为字段赋值,则自动赋予默认值

代码:

CREATE TABLE tb6(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20) NOT NULL UNIQUE KEY, sex ENUM('1','2','3') DEFAULT '3');

 

操作系统

 

 

代码:

SHOW COLUMNS FROM tb6;

 

INSERT tb6(username) VALUES('Tom');

 

SELECT * FROM tb6;

没有赋值时候,系统默认赋值3

 

2-15 总结

数据类型:字符型,整型,浮点型,日期时间型

SHOW TABLES;

SHOW COLUMNS;

查看数据表真实结构

 

数据表操作:INSERT插入记录,SELECT查找记录

 

记录操作:创建数据表,约束的使用

 

3-1 回顾和概述

 

数据表操作:创建,PRIMARY KEY(主键约束),UNIQUE KEY(唯一约束),DEFAULT(默认约束),NOT NULL(非空约束)

记录插入,查找

 

3-2 MySQL 外键约束的要求解析

约束:

保证数据的一致性和完整性

约束分为表级约束和列级约束

约束类型包括:

非空约束,主键约束,唯一约束,默认约束,外键约束FOREIGN KEY

 

外键约束:保证数据一致性,完整性,实现一对一或者一对多关系

 

外键约束的要求:

父表和子表必须使用相同的存储引擎,而且禁止使用临时表。

2 数据表的存储引擎只能为InnoDB

3外键列和参照列必须具有相似的数据类型。数字的长度及是否有符号位必须相同;而字符长度可以不同。

4外键列和参照列必须创建索引。如果外键列不存在索引的话,MySQL将会自动创建索引。

 

具有外键列的表为子表,子表所参照的表为父表

 

外键列:forray参照的列

 

编辑数据表的默认存储引擎

配置文件my.ini修改为:default-storage-engine =INNODB

 

 

登陆MySQL客户端:

mysql -uroot -p044500

 

出现mysql>说明成功登陆了

接着使用数据库

代码:

USE test;

接着创建数据表:

代码:

CREATE TABLE provinces(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(20) NOT NULL);

 

查看默认存储引擎:

代码:

SHOW CREATE TABLE provinces;

 

检查:外键列和参照列必须具有相似的数据类型。

代码:

CREATE TABLE users(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid BIGINT, FOREIGN KEY (pid) REFERENCES provinces (id) );

CREATE TABLE users1(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces (id) ON DELETE CASCADE);

以上是错误代码,因为数据类型长度和符号都不同。

修改为:

CREATE TABLE users(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username, VARCHAR(20) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces (id) );

pid是省份编号,pname是省份名字

 

判断是否创建索引:

SHOW INDEXES FROM provinces;

 

SHOW COLUMNS FROM user;

 

3-3 

外键约束的参照操作

3-3

代码:

CREATE TABLE users1(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces (id) ON DELETE CASCADE);

mysql> SHOW CREATE TABLE users1;

CASCADE: 从父表删除或者更新且自动删除或者更新子表中匹配的行。

SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL

RESTRICT:拒绝对父表的删除或者更新操作

NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同。

 

 

代码:

INSERT provinces(pname) VALUES('A');

 

INSERT provinces(pname) VALUES('B');

 

INSERT provinces(pname) VALUES('C');

 

SELECT * FROM provinces;

 

INSERT users1(username,pid) VALUES('Tom', 3);

 

INSERT users1(username,pid) VALUES('Tom',6);

 

INSERT users1(username,pid) VALUES('John',1);

 

INSERT users1(username,pid) VALUES('Rose',3);

 

SELECT * FROM users1;

 

DELETE FROM provinces WHERE id = 3;

 

 

 

3.3结束。

 

3-4 表级约束和列级约束

对一个数据列建立的约束称为列级约束,

对多个数据列建立的约束称为表级约束。

列级约束可以在列定义前后生命,表级约束只能在列定义后声明。

 

3-5

 MySQL 修改数据表-添加/删除列

添加单列:

ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name]

FIRST表示添加的列在最前面 

AFTER col_name 表示添加的列在col_name后面

没有FIRST 或者AFTER 添加的列位于所有列的最下面

看一下users1数据表的结构 

代码:

mysql> SHOW COLUMNS FROM users1;

 

+----------+----------------------+------+-----+---------+----------------+

| Field    | Type                 | Null | Key | Default | Extra          |

+----------+----------------------+------+-----+---------+----------------+

| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| username | varchar(10)          | NO   |     | NULL    |                |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |                |

+----------+----------------------+------+-----+---------+----------------+

3 rows in set (0.01 sec)

添加一列

代码:

mysql> ALTER TABLE users1 ADD age TINYINT UNSIGNED NOT NULL DEFAULT 10;

Query OK, 1 row affected (0.05 sec)

Records: 1  Duplicates: 0  Warnings: 0

代码:

mysql> SHOW COLUMNS FROM users1;

mysql> SHOW COLUMNS FROM users1;

+----------+----------------------+------+-----+---------+----------------+

| Field    | Type                 | Null | Key | Default | Extra          |

+----------+----------------------+------+-----+---------+----------------+

| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| username | varchar(10)          | NO   |     | NULL    |                |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |                |

| age      | tinyint(3) unsigned  | NO   |     | 10      |                |

+----------+----------------------+------+-----+---------+----------------+

4 rows in set (0.02 sec)

看来age确实被添加到了末尾,first可以添加到开头,after 可以指定添加到某行后面。

 

在username后面添加password:

mysql> ALTER TABLE users1 ADD password VARCHAR(32) NOT NULL AFTER username;

Query OK, 1 row affected (0.06 sec)

Records: 1  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users1;

+----------+----------------------+------+-----+---------+----------------+

| Field    | Type                 | Null | Key | Default | Extra          |

+----------+----------------------+------+-----+---------+----------------+

| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| username | varchar(10)          | NO   |     | NULL    |                |

| password | varchar(32)          | NO   |     | NULL    |                |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |                |

| age      | tinyint(3) unsigned  | NO   |     | 10      |                |

+----------+----------------------+------+-----+---------+----------------+

5 rows in set (0.04 sec)

 

在头部添加truename。用first 

mysql> ALTER TABLE users1 ADD truename VARCHAR(20) NOT NULL FIRST;

Query OK, 1 row affected (0.07 sec)

Records: 1  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users1;

+----------+----------------------+------+-----+---------+----------------+

| Field    | Type                 | Null | Key | Default | Extra          |

+----------+----------------------+------+-----+---------+----------------+

| truename | varchar(20)          | NO   |     | NULL    |                |

| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| username | varchar(10)          | NO   |     | NULL    |                |

| password | varchar(32)          | NO   |     | NULL    |                |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |                |

| age      | tinyint(3) unsigned  | NO   |     | 10      |                |

+----------+----------------------+------+-----+---------+----------------+

6 rows in set (0.04 sec)

 

添加多列只可以在列的最后依次添加,不可以随机添加。

 

删除列:

ALTER TABLE tbl_name DROP [COLUMN] col_name 

删除一个

mysql> ALTER TABLE users1 DROP truename;

Query OK, 1 row affected (0.04 sec)

Records: 1  Duplicates: 0  Warnings: 0

一次删除两个列。

mysql> ALTER TABLE users1 DROP password, DROP age;

Query OK, 1 row affected (0.05 sec)

Records: 1  Duplicates: 0  Warnings: 0

 

3.5结束

3-6  MySQL 修改数据表--添加约束

 

添加主键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)

创建一张废表users2

 

mysql> CREATE TABLE users2(

    -> username VARCHAR(10) NOT NULL,

    -> pid SMALLINT UNSIGNED);

Query OK, 0 rows affected (0.02 sec)

 

mysql> SHOW CREATE TABLE users2;

+--------+----------------------------------------------------------------------

---------------------------------------------------------------------+

| Table  | Create Table

                                                                     |

+--------+----------------------------------------------------------------------

---------------------------------------------------------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+----------------------------------------------------------------------

---------------------------------------------------------------------+

1 row in set (0.00 sec)

 

这个表目前没有主键,下面添加主键。

mysql> ALTER TABLE users2 ADD id smallint unsigned;

Query OK, 0 rows affected (0.15 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   |     | NULL    |       |

| pid      | smallint(5) unsigned | YES  |     | NULL    |       |

| id       | smallint(5) unsigned | YES  |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

3 rows in set (0.01 sec)

 

把id设置成主键: PK是主键primary key的意思

mysql> ALTER TABLE users2 ADD CONSTRAINT PK_user2_id PRIMARY KEY(id);

Query OK, 0 rows affected (0.04 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   |     | NULL    |       |

| pid      | smallint(5) unsigned | YES  |     | NULL    |       |

| id       | smallint(5) unsigned | NO   | PRI | 0       |       |

+----------+----------------------+------+-----+---------+-------+

3 rows in set (0.02 sec)

 

添加唯一约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name, ...)

假设为username添加唯一约束

代码:

mysql> ALTER TABLE users2 ADD UNIQUE (username);

Query OK, 0 rows affected (0.06 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW CREATE TABLE users2;

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------+

| Table  | Create Table

 

 

                   |

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL,

  `id` smallint(5) unsigned NOT NULL DEFAULT '0',

  PRIMARY KEY (`id`),

  UNIQUE KEY `username` (`username`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------+

1 row in set (0.00 sec)

 

添加外键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition

 

 

mysql> SHOW COLUMNS FROM provinces;

+-------+----------------------+------+-----+---------+----------------+

| Field | Type                 | Null | Key | Default | Extra          |

+-------+----------------------+------+-----+---------+----------------+

| id    | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| pname | varchar(20)          | NO   |     | NULL    |                |

+-------+----------------------+------+-----+---------+----------------+

2 rows in set (0.01 sec)

 

mysql> ALTER TABLE users2 ADD FOREIGN KEY (pid) REFERENCES provinces (id)

Query OK, 0 rows affected (0.03 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW CREATE TABLE users2;

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

----------------------------------------+

| Table  | Create Table

 

 

 

                                        |

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

----------------------------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL,

  `id` smallint(5) unsigned NOT NULL DEFAULT '0',

  PRIMARY KEY (`id`),

  UNIQUE KEY `username` (`username`),

  KEY `pid` (`pid`),

  CONSTRAINT `users2_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

----------------------------------------+

1 row in set (0.00 sec)

 

 

添加/删除 默认约束 

ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

给users2添加表age,

mysql> ALTER TABLE users2 ADD age TINYINT UNSIGNED NOT NULL;

Query OK, 0 rows affected (0.07 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

显示所有的 列 

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   | UNI | NULL    |       |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |       |

| id       | smallint(5) unsigned | NO   | PRI | 0       |       |

| age      | tinyint(3) unsigned  | NO   |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.05 sec)

改变users2表里面的age列为默认15,

mysql> ALTER TABLE users2 ALTER age SET DEFAULT 15;

Query OK, 0 rows affected (0.03 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

显示表users2里面的列

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   | UNI | NULL    |       |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |       |

| id       | smallint(5) unsigned | NO   | PRI | 0       |       |

| age      | tinyint(3) unsigned  | NO   |     | 15      |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.02 sec)

删除表users2里面的age

mysql> ALTER TABLE users2 ALTER age DROP DEFAULT;

Query OK, 0 rows affected (0.04 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   | UNI | NULL    |       |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |       |

| id       | smallint(5) unsigned | NO   | PRI | 0       |       |

| age      | tinyint(3) unsigned  | NO   |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.03 sec)

 

3.6结束

3-7 MySQL 修改数据表--删除约束

 

删除主键约束 

ALTER TABLE tbl_name DROP PRIMARY KEY

主键后面没有加名称,因为任何数据表有且仅有一个主键

mysql> ALTER TABLE users2 DROP PRIMARY KEY;

Query OK, 0 rows affected (0.04 sec)

Records: 0  Duplicates: 0  Warnings: 0

查看数据表的结构:

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   | PRI | NULL    |       |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |       |

| id       | smallint(5) unsigned | NO   |     | 0       |       |

| age      | tinyint(3) unsigned  | NO   |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.01 sec)

确实没有了主键id

 

 

删除唯一约束:

ALTER TABLE tbl_name DROP {INDEX|KEY} index_name

 

 

mysql> SHOW INDEXES FROM users2;

+--------+------------+----------+--------------+-------------+-----------+-----

--------+----------+--------+------+------------+---------+---------------+

| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Card

inality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |

+--------+------------+----------+--------------+-------------+-----------+-----

--------+----------+--------+------+------------+---------+---------------+

| users2 |          0 | username |            1 | username    | A         |

      0 |     NULL | NULL   |      | BTREE      |         |               |

| users2 |          1 | pid      |            1 | pid         | A         |

      0 |     NULL | NULL   | YES  | BTREE      |         |               |

+--------+------------+----------+--------------+-------------+-----------+-----

--------+----------+--------+------+------------+---------+---------------+

2 rows in set (0.00 sec)

 

 

用网格的形式表现

mysql> SHOW INDEXES FROM users2\G;

*************************** 1. row ***************************

        Table: users2

   Non_unique: 0

     Key_name: username

 Seq_in_index: 1

  Column_name: username

    Collation: A

  Cardinality: 0

     Sub_part: NULL

       Packed: NULL

         Null:

   Index_type: BTREE

      Comment:

Index_comment:

*************************** 2. row ***************************

        Table: users2

   Non_unique: 1

     Key_name: pid

 Seq_in_index: 1

  Column_name: pid

    Collation: A

  Cardinality: 0

     Sub_part: NULL

       Packed: NULL

         Null: YES

   Index_type: BTREE

      Comment:

Index_comment:

2 rows in set (0.00 sec)

 

ERROR:

No query specified

 

删除 username 

mysql> ALTER TABLE users2 DROP INDEX username;

Query OK, 0 rows affected (0.06 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   |     | NULL    |       |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |       |

| id       | smallint(5) unsigned | NO   |     | 0       |       |

| age      | tinyint(3) unsigned  | NO   |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.02 sec)

显示 索引,发现username确实不见了。 

mysql> SHOW INDEXES FROM users2\G;

*************************** 1. row ***************************

        Table: users2

   Non_unique: 1

     Key_name: pid

 Seq_in_index: 1

  Column_name: pid

    Collation: A

  Cardinality: 0

     Sub_part: NULL

       Packed: NULL

         Null: YES

   Index_type: BTREE

      Comment:

Index_comment:

1 row in set (0.00 sec)

 

ERROR:

No query specified

 

 

删除外键约束 

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol

 

mysql> SHOW CREATE TABLE users2;

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

| Table  | Create Table

 

 

 

                  |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL,

  `id` smallint(5) unsigned NOT NULL DEFAULT '0',

  `age` tinyint(3) unsigned NOT NULL,

  KEY `pid` (`pid`),

  CONSTRAINT `users2_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

1 row in set (0.00 sec)

 

 

users2_ibfk_1是上表已经告诉我们的内容,直接拿来用就行

 

删除外键约束:

mysql> ALTER TABLE users2 DROP FOREIGN KEY users2_ibfk_1;

Query OK, 0 rows affected (0.06 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

 

mysql> SHOW CREATE TABLE users2;

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

| Table  | Create Table

 

 

                  |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL,

  `id` smallint(5) unsigned NOT NULL DEFAULT '0',

  `age` tinyint(3) unsigned NOT NULL,

  KEY `pid` (`pid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

1 row in set (0.00 sec)

 

mysql> ALTER TABLE users2 DROP INDEX pid;

Query OK, 0 rows affected (0.05 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW CREATE TABLE users2;

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

-----------------------------------------------------------------------------+

| Table  | Create Table

 

                                                                             |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

-----------------------------------------------------------------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL,

  `id` smallint(5) unsigned NOT NULL DEFAULT '0',

  `age` tinyint(3) unsigned NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

-----------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

 

3.7 结束

3-8 MySQL 修改数据表--修改列定义和更名数据表

修改列定义:

ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]

 

移动id到第一行:

mysql> ALTER TABLE users2 MODIFY id SMALLINT UNSIGNED NOT NULL FIRST;

Query OK, 0 rows affected (0.03 sec)

Records: 0  Duplicates: 0  Warnings: 0

显示移动的效果:

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| id       | smallint(5) unsigned | NO   |     | NULL    |       |

| username | varchar(10)          | NO   |     | NULL    |       |

| pid      | smallint(5) unsigned | YES  |     | NULL    |       |

| age      | tinyint(3) unsigned  | NO   |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.03 sec)

 

修改id的类型为TINYINT代码:

mysql> ALTER TABLE users2 MODIFY id TINYINT UNSIGNED NOT NULL;

 

由大类型转为小类型,可能造成数据丢失,因为存储范围会缩小。

 

修改列名称:

ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new _col_name column_definition [FIRST | AFTER col_name]

 

pid名字改为p_id

mysql> ALTER TABLE users2 CHANGE pid p_id TINYINT UNSIGNED NOT NULL;

 

数据表更名:

方法1:

ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name

 

方法2:

RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2]...

 

修改users2名字为users3代码:

mysql> ALTER TABLE users2 RENAME users3;

Query OK, 0 rows affected (0.03 sec)

查看数据库test里面所有的table,发现users2确实不见了。

mysql> SHOW TABLES;

+----------------+

| Tables_in_test |

+----------------+

| provinces      |

| tb1            |

| tb2            |

| tb3            |

| tb4            |

| tb5            |

| tb6            |

| users1         |

| users3         |

+----------------+

9 rows in set (0.00 sec)

 

 

把users3又更名回来users2代码:

mysql> RENAME TABLE users3 TO users2;

 

 

注意:尽可能少使用数据列和数据表的更名。

3.8总结

约束:

按照功能划分为:

NOT NULL, PRIMARY KEY, UNIQUE KEY, DEFAULT, FOREIGN KEY

按照数据列的数目化为:

表级约束和列级约束

 

修改数据表:

针对字段的操作:添加,删除字段,修改列定义,修改列名称等。

针对约束的操作:添加删除各种约束

针对数据表的操作:数据表更名的两种方式

 

 

3-9 小结

 

4-1 回顾和概述

 

4-2 MySQL 插入记录INSERT

插入记录

INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr|DEFAULT},...),(...),...

 

创建一个表users代码:

mysql> CREATE TABLE users(

    ->

    -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

    -> username VARCHAR(20) NOT NULL,

    -> password VARCHAR(20) NOT NULL,

    -> age TINYINT UNSIGNED NOT NULL DEFAULT 10,

    -> sex BOOLEAN

    -> );

Query OK, 0 rows affected (0.03 sec)

 

插入一个值代码:

mysql> INSERT users VALUES(NULL, 'Tom', '123', 25, 1);

显示刚才输入的内容,代码:

mysql> SELECT * FROM users;

+----+----------+----------+-----+------+

| id | username | password | age | sex  |

+----+----------+----------+-----+------+

|  1 | Tom      | 123      |  25 |    1 |

+----+----------+----------+-----+------+

1 row in set (0.00 sec)

 

mysql> INSERT users VALUES(NULL, 'John', '456', 25, 1);

Query OK, 1 row affected (0.01 sec)

 

mysql> INSERT users VALUES(DEFAULT, 'John', '456', 25, 1);

Query OK, 1 row affected (0.01 sec)

可以用表达式:3*7+4

mysql> INSERT users VALUES(DEFAULT, 'John', '456', 3*7+4, 1);

Query OK, 1 row affected (0.01 sec)

默认值:

mysql> INSERT users VALUES(DEFAULT, 'John', '456', DEFAULT, 1);

 

该方法还可以一次性插入多条记录:

mysql> INSERT users VALUES(DEFAULT, 'John', '456', DEFAULT, 1),(NULL, 'John', '456', 25, 1);

 

 

4-3 MySQL 插入记录INSERT SET-SELECT

 

插入记录

INSERT [INTO] tbl_name SET col_name = {expr | DEFAULT}, ...

这种方法可以使用子查询(subquery)

由比较运算符引发的子查询。

这种方法一次只能插入一条记录,

 

 

mysql> INSERT users SET username = 'Ben', password = '456';

 

插入记录

INSERT [INTO] tbl_name [(col_name,...)] SELECT...

这种方法可以把查询结果插入到指定数据表中

 

4-4  MySQL 单表更新记录UPDATE

 

更新记录(单表更新)

UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}]...[where where_condition]

 

让表中所有年龄都加上5岁,代码:

mysql> UPDATE users set age = age + 5;

Query OK, 6 rows affected (0.01 sec)

Rows matched: 6  Changed: 6  Warnings: 0

 

更改所有年龄减去前面的序号,更改性别为1,代码:

mysql> UPDATE users SET age = age - id, sex = 0;

 

更新年龄加上10岁,当取余数为0才执行的代码:

mysql> UPDATE users SET age = age + 10 WHERE id % 2 =0;

 

4-5 MySQL 单表删除记录DELETE

删除记录:(单标删除)

DELETE FROM tbl_name [WHERE where_condition]

 

删除第六条记录代码:

mysql> DELETE FROM users WHERE id = 6;

 

插入一条记录,id号码到底为什么?代码:

mysql> INSERT users VALUES(null, '111','222',33,NULL);

Query OK, 1 row affected (0.01 sec)

发现代码号在原来的基础上加1了,和删除的号码没有啥关系了。

mysql> SELECT * FROM users;

+----+----------+----------+-----+------+

| id | username | password | age | sex  |

+----+----------+----------+-----+------+

|  1 | Tom      | 123      |  29 |    0 |

|  2 | John     | 456      |  38 |    0 |

|  3 | John     | 456      |  27 |    0 |

|  4 | John     | 456      |  36 |    0 |

|  5 | John     | 456      |  10 |    0 |

|  7 | 111      | 222      |  33 | NULL |

+----+----------+----------+-----+------+

6 rows in set (0.00 sec)

 

 

4-6 MySQL 查询表达式解析 

SELECT语句占据了8成以上的使用率

查找记录:

SELECT select_expr [, select_expr ...]

[

FROM table_references

[WHERE where_condition]

[GROUP BY {col_name|position} [ASC|DESC],...]

[HAVING where_condition]

[ORDER BY {col_name|expr|position} [ASC|DESC],...]

[LIMIT {[offset,] row_count | row_count OFFSET offset}]

]

 

mysql> SELECT VERSION();

+-----------+

| VERSION() |

+-----------+

| 5.5.59    |

+-----------+

1 row in set (0.00 sec)

 

mysql> SELECT NOW();

+---------------------+

| NOW()               |

+---------------------+

| 2018-03-09 17:31:27 |

+---------------------+

1 row in set (0.00 sec)

 

mysql> SELECT 3+ 6;

+------+

| 3+ 6 |

+------+

|    9 |

+------+

1 row in set (0.00 sec)

显示users的所有列:

mysql> SHOW COLUMNS FROM users;

显示users里面的id和username两个内容代码:

mysql> SELECT id, username FROM users;

 

变化顺序代码:

mysql> SELECT username, id FROM users;

 

查询表达式:

每一个表达式表示想要的一列,必须有至少一个。

多个列之间用逗号分隔。

星号表示所有列

查询表达式可以使用[AS]  alias_name为其赋予别名。

别名可以用于GROUP BY, ORDER BY 或HAVING子句

 

修改名称代码:

mysql> SELECT id AS userId, username AS uname FROM users;

 

4-7 MySQL where语句进行条件查询

条件表达式

对记录进行过滤,如果没有指定WHERE子句,则显示所有记录。

在WHERE表达式中,可以使用MySQL支持的函数和运算符。

 

4-8 MySQL group by语句对查询结果分组

[GROUP BY {col_name|position} [ASC|DESC],...]

代码:

mysql> SELECT sex FROM users GROUP BY sex;

 

4-9  having语句设置分组条件

 

分组条件:对某一部分记录做分组。

[HAVING where_condition]

选择年龄大于35的分组代码:

mysql> SELECT age FROM users GROUP BY age HAVING age > 35;

 

4-10 order by语句对查询结果排序

对查询结果进行排序

[ORDER BY { col_name | expr | position} [ASC|DESC],...]

 

按照id降序排列:DESCEND下降意思

mysql> SELECT * FROM users ORDER BY id DESC;

+----+----------+----------+-----+------+

| id | username | password | age | sex  |

+----+----------+----------+-----+------+

|  7 | 111      | 222      |  33 | NULL |

|  5 | John     | 456      |  10 |    0 |

|  4 | John     | 456      |  36 |    0 |

|  3 | John     | 456      |  27 |    0 |

|  2 | John     | 456      |  38 |    0 |

|  1 | Tom      | 123      |  29 |    0 |

+----+----------+----------+-----+------+

6 rows in set (0.00 sec)

 

默认按照年龄增长的方式代码:

mysql> SELECT * FROM users ORDER BY age;

 

4-11 limit语句限制查询数量

限制查询结果返回的数量

[LIMIT {[offset,] row_count |row_count OFFSET offset}]

 

指定返回三条数据

mysql> SELECT * FROM users LIMIT 3;

+----+----------+----------+-----+------+

| id | username | password | age | sex  |

+----+----------+----------+-----+------+

|  1 | Tom      | 123      |  29 |    0 |

|  2 | John     | 456      |  38 |    0 |

|  3 | John     | 456      |  27 |    0 |

+----+----------+----------+-----+------+

3 rows in set (0.00 sec)

 

从第三条记录开始显示2条:

mysql> SELECT * FROM users LIMIT 3,2;

+----+----------+----------+-----+------+

| id | username | password | age | sex  |

+----+----------+----------+-----+------+

|  4 | John     | 456      |  36 |    0 |

|  5 | John     | 456      |  10 |    0 |

+----+----------+----------+-----+------+

2 rows in set (0.00 sec)

 

mysql> CREATE TABLE test(

    -> id TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

    -> username VARCHAR(20)

    -> );

Query OK, 0 rows affected (0.03 sec)

 

mysql> SELECT * FROM test;

Empty set (0.00 sec)

 

把旧表的内容插入新表

mysql> INSERT test(username) SELECT username FROM users WHERE age >=30;

Query OK, 3 rows affected (0.01 sec)

Records: 3  Duplicates: 0  Warnings: 0

 

下表展示了添加的test表。test也是一个数据库呢。

mysql> SHOW TABLES;

+----------------+

| Tables_in_test |

+----------------+

| provinces      |

| tb1            |

| tb2            |

| tb3            |

| tb4            |

| tb5            |

| tb6            |

| test           |

| users          |

| users1         |

| users2         |

+----------------+

11 rows in set (0.00 sec)

 

4-12 总结

数据记录的

增删改查

INSERT

UPDATE

DELETE

SELECT

 

5-1 数据准备

退出旧的数据表代码:

mysql> \q

Bye

 

mysql -uroot -p044500 imooc;

 

 

 

mysql> CREATE DATABASE imooc;

Query OK, 1 row affected (0.01 sec)

 

mysql> USE imooc;

Database changed

mysql> CREATE TABLE IF NOT EXISTS tdb_goods(

    ->     goods_id    SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

    ->     goods_name  VARCHAR(150) NOT NULL,

    ->     goods_cate  VARCHAR(40)  NOT NULL,

    ->     brand_name  VARCHAR(40)  NOT NULL,

    ->     goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0,

    ->     is_show     BOOLEAN NOT NULL DEFAULT 1,

    ->     is_saleoff  BOOLEAN NOT NULL DEFAULT 0

    ->   );

Query OK, 0 rows affected (0.02 sec)

 

mysql> INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is

_saleoff) VALUES('R510VC 15.6?????','???','??','3399',DEFAULT,DEFAULT);

Query OK, 1 row affected (0.01 sec)

 

mysql>

mysql>  INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,i

s_saleoff) VALUES('Y400N 14.0???????','???','??','4899',DEFAULT,DEFAULT);

Query OK, 1 row affected (0.00 sec)

 

 

mysql> SHOW TABLES;

+-----------------+

| Tables_in_imooc |

+-----------------+

| tdb_goods       |

+-----------------+

1 row in set (0.00 sec)

 

错误代码:

mysql> SELECT * FROM imooc;

ERROR 1146 (42S02): Table 'imooc.imooc' doesn't exist

 

正确代码:

mysql> SELECT * FROM tdb_goods;

 

错误代码:

mysql> SHOW tdb_goods;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that

corresponds to your MySQL server version for the right syntax to use near 'tdb_g

oods' at line 1

 

数据乱码,因为最开始用utf8的编码方式

在客户端用gbk的编码方式显示我们的数据,但是并不会影响数据表数据编码方式。

SET NAMES gbk;

 

 查看当前数据库编码:

 

mysql> use xxx

mysql> show variables like 'character_set_database';

修改xxx数据库的编码,把它修改为你要的编码 gbk  (注意不是utf-8)。或许你的是gbk gb2312 。

 

mysql> alter database imooc CHARACTER SET gbk;

 

删除数据库

DROP DATABASE imooc;

 

5-2 MySQL 子查询简介.

子查询subquery

出现在其他sql语句内的select子句。

子查询指嵌套在查询内部,且必须始终出现在圆括号内。

子查询可以包含多个关键字或者条件。如DISTINCT, GROUP BY, ORDER BY, LIMIT函数等。

子查询的外层查询可以使SELECT, INSERT, UPDATE, SET , DO

子查询返回值:标量,一行,一列,或者子查询

 

5-3 由比较运算符引发的子查询 

 

使用比较运算符的子查询=,>,<,>=等等

语法结构:

operand comparison_operator subquery

求价格平均值

select avg(goods_price) from tdb_goods;

进行四舍五入,保留小数点后面两位。代码:

select round(avg(goods_price),2) from tdb_goods;

avg是求平均值的函数

求大于平均值的产品价格代码

select goods_id, goods_name, goods_price from tdb_goods where goods_price >= 5636.36;

求大于平均值的产品价格代码

select goods_id, goods_name, goods_price from tdb_goods where goods_price >= (select round(avg(goods_price),2) from tdb_goods);

以上代码其实就是子查询了。把小代码放在括号里。

 

查找超极本的价格代码:

select goods_price from tdb_goods where goods_cate ='超极本';

 

有哪些超极本代码:

select * from tdb_goods where goods_cate = '超极本'\G;

查询哪些商品价格大于超极本代码:

select goods_id, goods_name, goods_price from tdb_goods where goods_price >(select goods_price from tdb_goods where goods_cate ='超极本');

以上代码错误,因为>后面有三个结果。

 

策略,用any, some, all修饰的比较运算符

select goods_id, goods_name, goods_price from tdb_goods where goods_price >any (select goods_price from tdb_goods where goods_cate ='超极本');

这里使用了any,意识是大于任何一个数字,也就是大于最小值就行。some也是大于最小值,all必须大于所有值,也就是最大值。

 

5-4 由[NOT] IN/EXISTS引发的子查询

 

 

5-5

使用INSERT...SELECT插入记录 

再做一张新的数据表存储重复的品牌和分类,为了降低存储容量,加快查询数据。

新建数据表代码:

create table if not exists tdb_goods_cates(cate_id smallint unsigned primary key auto_increment, cate_name varchar(40) not null);

 

快速查找重复部分代码:

select goods_cate from tdb_goods group by goods_cate;

把查询结果写入数据表中insert...select

insert [into] tbl_name[(col_name,...)] select...

证明数据表还是空的代码:

select * from tdb_goods_cates;

 

insert tdb_goods_cates(cate_name) select goods_cate from tdb_goods group by goods_cate;

 

数据已经写入,但是里面的数据没有使用外键,也就是在旧的数据表里面还是汉字,应该用新的数据表里面的数字代码来代替重复汉字。

也就是下节课的多表更新

5-6 多表更新

 

update table_references set col_name1={expr1|default} [, col_name2={expr2|default}]... [where where_condition]

 

语法结构:

table_reference

{[inner|cross join|{left|right} [outer] join} 

table_reference on conditional_expr

 

连接类型

inner, outer, left, right

 

代码:

update tdb_goods inner join tdb_goods_cates on goods_cate = cate_name set goods_cate = cate_id;

 

5-7 多表更新之一步到位

 

1创建表

2记录写入新创建的表

3 更新旧表

把以上1,2步骤融合为一个操作更简便。

叫做多表更新:create ...select

create table [if not exists] tbl_name [(create_definition,...)]

 

查找有几个品牌create table tdb_goods_brands (brand_id smallint unsigned primary key auto_increment, brand_name varchar(40) not null) select brand_name from tdb_goods group by brand_name;

 

更新商品表代码:

update tdb_goods inner join tdb_goods_brands on brand_name = brand_name set brand_name = brand_id;

 

以上代码又问题,因为两个表的brand_name名字一样,唯一的办法就是两个表的名字不同。

 

或者用别名

update tdb_goods as g inner join tdb_goods_brands as b on g.brand_name = b.brand_name set g.brand_name = brand_id;

 

5-8 连接的语法结构 

 

数据表参照

table_reference

 

5-9 

内连接INNER JOIN

join, cross join, inner join是等价的。

使用on设定连接条件,用where进行结果过滤。

5-10

外连接OUTER JOIN

左外连接是显示左表的全部和右表符合连接条件的记录。

右外连接:显示右表的全部记录及其左表符合连接条件的记录。

 

5-11多表连接

 

5-12关于连接的几点说明

外连接:

5-13

无限级分类表设计:商品种类下面可以进行无限分类,例如图书下面可以分太多。

自身连接:同一个数据表对其自身进行连接。

代码:select s.type_id, s.type_name, p.type_name from tdb_goods_types as s left join tdb_goods_types as p on s.parent_id = p.type_id;

 

select * from tdb_goods_types;

5-14多表删除

delete tbl_name

 

6-1 课程回顾

6-2 字符函数

concat()连接字符

select concat('imooc', 'mysql');

使用指定的分隔符进行字符连接。

select concat_ws('|','a','b','c');

a|b|c

select concat_ws('-','a','b','c');

 

a-b-c

得到小写字符lower()

大写字符upper()

获取左侧

select left('mysql',2);

select upper(left('mysql',2));

求字符长度length()

删除左侧空格ltrim()

删除右侧空格rtrim()

删除左右两侧空格trim()

替换

select replace('???my???sql','?','!');

 截取,从第一位截取2个

select substring('mysql',1,2);

从第二位截取到末尾

select substring('mysql',2);

模式匹配like

%代表任意字符

_代表任意一个字符

6-3 

MySQL 数值运算符和函数

进1取整,向上取整

select ceil(3.01);返回4

select 3/4;返回0.75000

select 3 div 4;返回0;

floor()舍1取整

mod()取余数

power()幂运算

round()四舍五入

truncate()数字截取

 

6-4 比较运算符和函数

between...and...在范围内

select 15 between 1 and 22;

select 35 not between 1 and 22;

select 10 in(5,10,15,20);

在之间。在集合里面。

is null。。。为空

select * from test where first_name is null;

 

6-5 日期时间函数

now()返回当前日期时间

select now();

curdate();

curtime();

日期变化

date_add();

select date_add('2014-3-12', interval 365 day);

select date_add('2014-3-12', interval -365 day);

添加三周

select date_add('2014-3-12', interval 3 week);

日期格式化

select date_format('2014-3-12', '%m/%d/%Y');

03/12/2014

 

6-6 MySQL 信息函数 

 

连接ID

select connection_id();

当前数据库

select database();

最后插入记录

6-7 聚合函数

聚合函数只有一个返回值

avg()求平均值。

select avg(goods_price) as avg_price from tdb_goods;

 

6-8 MySQL 加密函数

信息摘要算法

md5()

select md5('admin');

 

password('admin');

 

7-1 课程回顾

 

7-2 自定义函数简介

user-defined function UDF是一种MySQL扩展的途径,用法和内置函数相同

 

两个必要条件:参数和返回值

创造自定义函数

create function function_name

关于函数体:

函数体

 

7-3 MySQL 创建不带参数的自定义函数

select now();

select date_format(now(), '%Y年%m月%d日 %H点:%i分:%s秒');

create function f1() returns varchar(30) return date_format(now(), '%Y年%m月%d日 %H点:%i分:%s秒');

 

select f1();就代替上面的代码了

 

7-4 创建带有参数的自定义函数

 

create function f2(num1 smallint unsigned, num2 smallint unsigned) returns float (10,2) unsigned return (num1 + num2)/2;

调用下,用来求平均值:

select f2(12, 15);

 

7-5 MySQL 创建具有复合结构函数体的自定义函数

create function adduser(username varchar(20)) return int unsigned return insert test(username) values(username);

修改分隔符,现在都用//来表示语句结束

delimiter//

 

create function adduser(username varchar(20)) return int unsigned return begin insert test(username) values(username); last_insert_id(); end//

 

select addusers('rose');//

 

8-1 课程回顾

自定义函数,对MySQL扩展的一种途径。

 

8-2 存储过程简介

sql语句和控制语句的预编译集合,用一个名称存储并且作为一个单元处理。

优点:

增强功能和灵活性

实现快速执行速度

减少网络流量

 

8-3 MySQL 存储过程语法结构解析

in参数表示参数的值必须在调用存储过程中指定

out表示值可以被修改

inout表示

 

comment注释

过程体:

 

8-4 MySQL 创建不带参数的存储过程

create procedure spl() select version();

call spl;

call spl();

 

8-5 

带有in类型参数的存储过程

delete from table where

8-6

MySQL 创建带有IN和OUT类型参数的存储过程

 

8-7MySQL 创建带有多个OUT类型参数的存储过程

 

8-8 存储过程和自定义函数的区别

 

9-1 课程回顾

 

9-2 MySQL 存储引擎简介

查看数据表的创建命令

show create table test;

存储引擎有:

myISAM,INNODB,MEMORY, CSV, Archive

 

9-3 MySQL 相关知识点之并发处理

并发控制:当多个连接对记录进行修改时候保证数据的一致性和完整性。

 

解决方法:锁

共享锁,排它锁。

共享锁(读锁),同一时间,多个用户可以读取同一个资源。

排他锁(写锁):任何一个时候只能有一个用户可以写入资源。

锁的颗粒

表锁:是一种开销最小的锁策略

行锁:是一种开销最大的锁的策略。

 

9-4 MySQL 相关知识点之事务处理

 

9-5 MySQL 相关知识点之外键和索引

外键:保证数据一致性的策略

索引:对数据表中的一列或者多列进行排序的一种结构。

9-6 各个存储引擎特点

 

9-7 MySQL 设置存储引擎

修改存储引擎方法:

修改配置文件,

创建数据表命令实现。

 

create table tp1( s1 varchar(10) )engine = MyIsam;

 

show create table tp1;

alter table tp1 engine = InnoDB;

10-1 课程回顾

10-2

MySQL图形 管理工具之phpMyAdmin

打开网址,下载对应软件,下载解压,在浏览器里面输入127.0.0.1/PHPMyAdmin/

然后输入账号root,密码:044500

10-3

MySQL图形 管理工具之Navicat for MySQL

 

10-4 

MySQL图形 管理工具之MySQL Workbench

 

 

认识你是我们的缘分,同学,等等,学习人工智能,记得关注我。

 

微信扫一扫
关注该公众号

《湾区人工智能》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值