一、启动/关闭MYSQL服务
net start mysql
D:\>net start mysql
MySQL 服务正在启动 ..
MySQL 服务已经启动成功。
net stop mysql
C:\WINDOWS\system32>net stop mysql
MySQL 服务正在停止
二、登录和退出MYSQL
//登录方法1
D:\>mysql -u root -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
//登录方法2
D:\>mysql -u root -p -P3306 -h 127.0.0.1
C:\WINDOWS\system32>mysql -u root -p -P3306 -h 127.0.0.1
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.7.22 MySQL Community Server (GPL)
//退出
mysql>exit;
mysql>quit;
mysql>\q;
三、修改提示符
prompt
D:\>mysql -u root -p root -prompt \h(服务器名称localhost)
mysql>prompt \h(服务器名称localhost);
MYSQL提示符
\D 完整的日期
\d 当前数据库
\h 服务器名称
\u 当前用户
\u@\h \d>
当前用户@服务器名称 当前数据库>
四、MYSQL常用命令和语法规范
1、显示当前服务器版本
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.22 |
+-----------+
1 row in set (0.12 sec)
2、显示当前日期时间
mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2018-07-24 15:26:22 |
+---------------------+
1 row in set (0.05 sec)
3、显示当前用户
mysql> SELECT USER();
+----------------+
| USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.03 sec)
4、MySQL语句规范
1)、关键字与函数名称全部大写(小写可以执行,为了区分关键字)
2)、数据库名称、表名称、字段名称全部小写
3)、SQL语句必须以分号结尾
五、操作数据库
{}:必选项
[]:可选项
1、创建数据库
CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name
[DEFAULT] CHARACTER SET [=] charset_name
mysql> CREATE DATABASE t1;
Query OK, 1 row affected (0.07 sec)
//创建已存在的数据库
mysql> CREATE DATABASE t1;
ERROR 1007 (HY000): Can't create database 't1'; database exists
//显示错误信息
mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message |
+-------+------+---------------------------------------------+
| Error | 1007 | Can't create database 't1'; database exists |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)
//显示数据库属性
mysql> SHOW CREATE DATABASE t1;
+----------+-------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------+
| t1 | CREATE DATABASE `t1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------+
1 row in set (0.14 sec)
2、显示数据库列表
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bluedot |
| kdd |
| mysql |
| performance_schema |
| sys |
| t1 |
+--------------------+
7 rows in set (0.32 sec)
3、修改数据库
ALTER {DATABASE|SCHEMA} [db_name]
[DEFAULT] CHARACTER SET [=] charset_name
//修改数据库t1的编码为gbk
mysql> ALTER DATABASE t1 CHARACTER SET = gbk;
Query OK, 1 row affected (0.18 sec)
mysql> SHOW CREATE DATABASE t1;
+----------+------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------+
| t1 | CREATE DATABASE `t1` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+------------------------------------------------------------+
1 row in set (0.00 sec)
4、删除数据库
mysql> DROP DATABASE t1;
Query OK, 0 rows affected (1.32 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bluedot |
| kdd |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
//删除已经删除的数据库
mysql> DROP DATABASE t1;
ERROR 1008 (HY000): Can't drop database 't1'; database doesn't exist
mysql> SHOW WARNINGS;
+-------+------+--------------------------------------------------+
| Level | Code | Message |
+-------+------+--------------------------------------------------+
| Error | 1008 | Can't drop database 't1'; database doesn't exist |
+-------+------+--------------------------------------------------+
1 row in set (0.00 sec)
六、数据类型
1、基本类型
整型int、浮点型float、双精度浮点 double
2、日期时间型
3、字符型
七、数据表的操作
1、创建数据表
打开数据库
USE 数据库名称;
mysql> USE t1;
Database changed
//显示打开的数据库
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| t1 |
+------------+
1 row in set (0.00 sec)
//数据表应该事先考虑好
CREATE TABLE [IF NOT EXISTS] table_name(column_name data_type,...)
//数据表应该事先考虑好
CREATE TABLE [IF NOT EXISTS] table_name(column_name data_type,...)
mysql> CREATE TABLE tb1(
-> username VARCHAR(20),
-> age TINYINT UNSIGNED,
-> salary FLOAT(8,2) UNSIGNED
-> );
Query OK, 0 rows affected (0.68 sec)
2、查看数据表
mysql> SHOW TABLES;
+--------------+
| Tables_in_t1 |
+--------------+
| tb1 |
+--------------+
1 row in set (0.00 sec)
//查看数据库的数据表列表
mysql> SHOW TABLES FROM mysql;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| engine_cost |
| event |
| func |
| general_log |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
31 rows in set (0.00 sec)
3、查看数据表结构
mysql> SHOW COLUMNS FROM tb1;
+----------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| username | varchar(20) | YES | | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
| salary | float(8,2) unsigned | YES | | NULL | |
+----------+---------------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
4、记录(行)的插入和查找
插入数据
INSERT [INTO] table_name [(col_name,...)] VALUES(val,...)
//省略全部字段名,必须给全部字段赋值
mysql> INSERT tb1 VALUES('Tom',25,7819.25);
Query OK, 1 row affected (0.12 sec)
//否则,报错
mysql> INSERT tb1 VALUES('Tom',25);
ERROR 1136 (21S01): Column count doesn't match value count at row 1
//赋值部分字段
mysql> INSERT tb1(username,salary) VALUES('Tom',5600);
Query OK, 1 row affected (0.08 sec)
记录的查找
SELECT expr,... FROM table_name
//全部记录,*用来过滤字段
mysql> SELECT * FROM tb1;
+----------+------+---------+
| username | age | salary |
+----------+------+---------+
| Tom | 25 | 7819.25 |
| Tom | NULL | 5600.00 |
+----------+------+---------+
2 rows in set (0.00 sec)
5、空值和非空
NULL,字段值可以为空
NOT NULL,字段值不可以为空
mysql> CREATE TABLE tb2(
-> username VARCHAR(20) NOT NULL,
-> age TINYINT UNSIGNED NULL
-> );
Query OK, 0 rows affected (0.47 sec)
//查看数据表属性
mysql> SHOW COLUMNS FROM tb2;
+----------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| username | varchar(20) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
+----------+---------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
//插入空值
mysql> INSERT tb2 VALUES('Tom',NULL);
Query OK, 1 row affected (0.07 sec)
mysql> SELECT *FROM tb2;
+----------+------+
| username | age |
+----------+------+
| Tom | NULL |
+----------+------+
1 row in set (0.00 sec)
//错误测试
mysql> INSERT tb2 VALUES(NULL,26);
ERROR 1048 (23000): Column 'username' cannot be null
6、约束
主键约束:PRIMARY KEY
每一张数据表只能存在一个 主键
主键保证了记录的唯一性
主键自动为 NOT NULL
mysql> CREATE TABLE tb3(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(30) NOT NULL
-> );
Query OK, 0 rows affected (0.57 sec)
mysql> SHOW COLUMNS FROM tb3;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(30) | NO | | NULL | |
+----------+----------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
唯一约束:UNIQUE KEY
唯一约束可以保证记录的唯一性
唯一约束的字段可以为空值(NULL)
每张数据表可以存在多个唯一约束
mysql> CREATE TABLE tb5(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(20) NOT NULL UNIQUE KEY,
-> age TINYINT UNSIGNED
-> );
Query OK, 0 rows affected (0.44 sec)
mysql> SHOW COLUMNS FROM tb5;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | NO | UNI | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
+----------+----------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> INSERT tb5(username,age) VALUES('Tom',25);
Query OK, 1 row affected (0.09 sec)
//唯一约束
mysql> INSERT tb5(username,age) VALUES('Tom',22);
ERROR 1062 (23000): Duplicate entry 'Tom' for key 'username'
默认约束:DEFAULT
mysql> CREATE TABLE tb6(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(20) NOT NULL UNIQUE KEY,
-> sex ENUM('1','2','3') DEFAULT '3'
-> );
Query OK, 0 rows affected (0.56 sec)
mysql> SHOW COLUMNS FROM tb6;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | NO | UNI | NULL | |
| sex | enum('1','2','3') | YES | | 3 | |
+----------+----------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> INSERT tb6(username) VALUES('Tom');
Query OK, 1 row affected (0.09 sec)
mysql> SELECT *FROM tb6;
+----+----------+------+
| id | username | sex |
+----+----------+------+
| 1 | Tom | 3 |
+----+----------+------+
1 row in set (0.00 sec)
7、自动编号
//自动编号 AUTO_INCREMENT
mysql> CREATE TABLE tb3(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(30)
-> );
Query OK, 0 rows affected (0.38 sec)
mysql> INSERT tb3(username) VALUES('Tom');
Query OK, 1 row affected (0.10 sec)
mysql> INSERT tb3(username) VALUES('John');
Query OK, 1 row affected (0.10 sec)
mysql> INSERT tb3(username) VALUES('Rose');
Query OK, 1 row affected (0.10 sec)
mysql> INSERT tb3(username) VALUES('Dimitar');
Query OK, 1 row affected (0.10 sec)
mysql> SELECT *FROM tb3;
+----+----------+
| id | username |
+----+----------+
| 1 | Tom |
| 2 | John |
| 3 | Rose |
| 4 | Dimitar |
+----+----------+
4 rows in set (0.00 sec)
//非自动编号
mysql> CREATE TABLE tb4(
-> id SMALLINT UNSIGNED PRIMARY KEY,
-> username VARCHAR(30)
-> );
Query OK, 0 rows affected (0.38 sec)
mysql> SHOW COLUMNS FROM tb4;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| id | smallint(5) unsigned | NO | PRI | NULL | |
| username | varchar(30) | YES | | NULL | |
+----------+----------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> INSERT tb4 VALUES(22,'Tom');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT tb4 VALUES(4,'John');
Query OK, 1 row affected (0.10 sec)
mysql> SELECT *FROM tb4;
+----+----------+
| id | username |
+----+----------+
| 22 | Tom |
| 4 | John |
+----+----------+
2 rows in set (0.00 sec)
八、约束和修改数据表
1)、约束保证了数据的完整性和一致性
2)、约束分为表级约束和列级约束
3)、约束的类型包括:
NOT NULL(非空约束) PRIMARY KEY(主键约束) UNIQUE KEY(唯一约束)
DEFAUT(默认约束) FOREIIGN KEY(外键约束)
1、外键约束:FOREIIGN KEY
保证数据一致性
实现一对一一对多关系
外键约束要求:
1)、父表和字表必须具有相同的存储引擎,禁止使用临时表
2)、数据表的存储引擎只能为InnoDB
3)、外键列和参照列必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同,而字符的长度可以不同
4)、外键列和参照列必须创建索引。如果外键列不存在索引的话,MYSQL将自动创建索引
编辑数据表的默认存储 引擎
MYSQL配置文件
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
2、外键约束的参照操作
1)、CASCADE:从父表删除和更新且自动更新子表中匹配的行
2)、SET NULL:从父表删除和更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL
3)、RESTRICT:拒绝对父表的删除或更新操作
4)、NO ACTION:标准SQL的关键字,在MYSQL中与RESTRICT相同
mysql> CREATE TABLE province(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> pname VARCHAR(20) NOT NULL
-> );
Query OK, 0 rows affected (0.69 sec)
//外键类型需要与父表的相同
mysql> CREATE TABLE users(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(10) NOT NULL,
-> pid SMALLINT ,FOREIGN KEY(pid) REFERENCES province(id)
-> );
ERROR 1215 (HY000): Cannot add foreign key constraint
mysql> CREATE TABLE users(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(10) NOT NULL,
-> pid SMALLINT UNSIGNED ,FOREIGN KEY(pid) REFERENCES province(id)
-> );
Query OK, 0 rows affected (0.47 sec)
//CASCADE举例
mysql> CREATE TABLE users1(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(10) NOT NULL,
-> pid SMALLINT UNSIGNED ,FOREIGN KEY(pid) REFERENCES province(id) ON DELETE CASCADE
-> );
Query OK, 0 rows affected (0.56 sec)
mysql> INSERT province(pname) VALUES('A');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT province(pname) VALUES('B');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT province(pname) VALUES('C');
Query OK, 1 row affected (0.09 sec)
mysql> SELECT *FROM province;
+----+-------+
| id | pname |
+----+-------+
| 1 | A |
| 2 | B |
| 3 | C |
+----+-------+
3 rows in set (0.06 sec)
mysql> INSERT users1(username,pid) VALUES('TOM',3);
Query OK, 1 row affected (0.09 sec)
mysql> INSERT users1(username,pid) VALUES('JOHN',2);
Query OK, 1 row affected (0.09 sec)
mysql> INSERT users1(username,pid) VALUES('HN',3);
Query OK, 1 row affected (0.10 sec)
mysql> SELECT *FROM users1;
+----+----------+------+
| id | username | pid |
+----+----------+------+
| 1 | TOM | 3 |
| 2 | JOHN | 2 |
| 3 | HN | 3 |
+----+----------+------+
3 rows in set (0.00 sec)
mysql> DELETE FROM province WHERE id = 3;
Query OK, 1 row affected (0.15 sec)
mysql> SELECT *FROM users1;
+----+----------+------+
| id | username | pid |
+----+----------+------+
| 2 | JOHN | 2 |
+----+----------+------+
1 row in set (0.00 sec)
3、表级约束和列级约束
列级约束:对一个数据列建立的约束
表级约束:对多个数据列建立的约束
不是所有的约束都存在列级和表级约束
4、修改数据表
1)、添加单列
ALTER TABLE table_name ADD [COLUMN] column_name column_definition
[FIRST | AFTER column_name]
FIRST:添加的列在最前方
AFTER column_name:添加的列在column_name后面
默认在最后一列
mysql> ALTER TABLE users1 ADD age TINYINT UNSIGNED NOT NULL DEFAULT 10;
Query OK, 0 rows affected (1.21 sec)
Records: 0 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 | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| age | tinyint(3) unsigned | NO | | 10 | |
+----------+----------------------+------+-----+---------+----------------+
4 rows in set (0.07 sec)
mysql> ALTER TABLE users1 ADD password VARCHAR(20) NOT NULL AFTER username;
Query OK, 0 rows affected (1.41 sec)
Records: 0 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(20) | NO | | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| age | tinyint(3) unsigned | NO | | 10 | |
+----------+----------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
2)、添加多列
ALTER TABLE table_name ADD [COMLUM]
(column_name column_definition,...)
3)、删除列
ALTER TABLE table_name DROP column_name
ALTER TABLE table_name DROP column_name,...
mysql> ALTER TABLE users1 DROP username;
Query OK, 0 rows affected (1.27 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW COLUMNS FROM users1;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| password | varchar(20) | NO | | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| age | tinyint(3) unsigned | NO | | 10 | |
+----------+----------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> ALTER TABLE users1 DROP password,DROP age;
Query OK, 0 rows affected (1.40 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW COLUMNS FROM users1;
+-------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
+-------+----------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
4)、添加主键约束
ALTER TABLE table_name ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type](index_col_name,...)
5)、添加唯一约束
ALTER TABLE table_name ADD [CONSTRAINT [symbol]] UNIQUE
[INDEX|KEY][index_name][index_type](index_col_name,...)
6)、添加外键约束
ALTER TABLE table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY
[INDEX|KEY][index_name](index_col_name,...)
reference_definition
7)、添加/删除默认约束
ALTER TABLE table_name ALTER [COLUMN] col_name
{SET DEFAULT literal|DROP DEFAULT}
8)、删除主键约束
ALTER TABLE table_name DROP PRIMARY KEY;
9)、删除唯一约束
ALTER TABLE table_name DROP INDEX {INDEX|KEY}index_name;
10)、删除外键约束
ALTER TABLE table_name DROP FOREIGN KEY fk_symbol
11)、修改列定义
ALTER TABLE table_name MODIEY [COLUMN]old_col_name new_col_name
column_definition [FIRST|AFTER col_name]
12)、数据表更名
方法1:ALTER TABLE table_name RENAME [TO|AS] new_table_name
方法2:RENAME TABLE table_name TO new_table_name
九、记录的操作
1、插入记录
方法1:
INSERT [INTO] table_name [col_name,...] {VALUES|VALUE}({expr|DEFAULT},...),(...),...
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.46 sec)
mysql> INSERT users VALUES(NULL,'Tom','123',20,1);
Query OK, 1 row affected (0.14 sec)
mysql> select *from users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 20 | 1 |
+----+----------+----------+-----+------+
1 row in set (0.00 sec)
mysql> INSERT users VALUES(NULL,'John','123',19,1);
Query OK, 1 row affected (0.09 sec)
mysql> select *from users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 20 | 1 |
| 2 | John | 123 | 19 | 1 |
+----+----------+----------+-----+------+
2 rows in set (0.00 sec)
mysql> INSERT users VALUES(NULL,'Tom','123',20,1);
Query OK, 1 row affected (0.04 sec)
mysql> select *from users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 20 | 1 |
| 2 | John | 123 | 19 | 1 |
| 3 | Tom | 123 | 20 | 1 |
+----+----------+----------+-----+------+
3 rows in set (0.00 sec)
//使用默认值
mysql> INSERT users VALUES(NULL,'Tom','123',DEFAULT,1);
Query OK, 1 row affected (0.09 sec)
mysql> select *from users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 20 | 1 |
| 2 | John | 123 | 19 | 1 |
| 3 | Tom | 123 | 20 | 1 |
| 4 | Tom | 123 | 10 | 1 |
+----+----------+----------+-----+------+
4 rows in set (0.00 sec)
//多行赋值
mysql> INSERT users VALUES(NULL,'Tim','123',20,1),(NULL,'Rose','123',20,1)
-> ;
Query OK, 2 rows affected (0.09 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select *from users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 20 | 1 |
| 2 | John | 123 | 19 | 1 |
| 3 | Tom | 123 | 20 | 1 |
| 4 | Tom | 123 | 10 | 1 |
| 5 | Tim | 123 | 20 | 1 |
| 6 | Rose | 123 | 20 | 1 |
+----+----------+----------+-----+------+
6 rows in set (0.00 sec)
方法2(使用较少):
INSERT [INTO] table_name SET col_name={expr|DEFAULT},...
说明:与第一种方式的区别在于,此方法可以使用子查询(SubQuery)
mysql> INSERT users SET username = 'Ben',password = '123';
Query OK, 1 row affected (0.06 sec)
mysql> select *from users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 20 | 1 |
| 2 | John | 123 | 19 | 1 |
| 3 | Tom | 123 | 20 | 1 |
| 4 | Tom | 123 | 10 | 1 |
| 5 | Tim | 123 | 20 | 1 |
| 6 | Rose | 123 | 20 | 1 |
| 7 | Ben | 123 | 10 | NULL |
+----+----------+----------+-----+------+
7 rows in set (0.00 sec)
方法3:
INSERT [INTO] table_name[(col_name),...] SELECT ...
说明:此方法可以将查询结果插入到指定的数据表
2、更新记录
单表更新
UPDATE[LOW_PRIORITY][IGNORE]table_reference SET col_name1={expr1|DEFAULT}
[,col_name2={expr2|DEFAULT}]...[WHERE where_condition]
//省略条件,更新全部数据
mysql> UPDATE users set age = age + 5;
Query OK, 7 rows affected (0.12 sec)
Rows matched: 7 Changed: 7 Warnings: 0
mysql> select *from users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 25 | 1 |
| 2 | John | 123 | 24 | 1 |
| 3 | Tom | 123 | 25 | 1 |
| 4 | Tom | 123 | 15 | 1 |
| 5 | Tim | 123 | 25 | 1 |
| 6 | Rose | 123 | 25 | 1 |
| 7 | Ben | 123 | 15 | NULL |
+----+----------+----------+-----+------+
7 rows in set (0.00 sec)
//多字段更新
mysql> UPDATE users set age = age - id,sex = 0;
Query OK, 7 rows affected (0.09 sec)
Rows matched: 7 Changed: 7 Warnings: 0
mysql> select *from users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 24 | 0 |
| 2 | John | 123 | 22 | 0 |
| 3 | Tom | 123 | 22 | 0 |
| 4 | Tom | 123 | 11 | 0 |
| 5 | Tim | 123 | 20 | 0 |
| 6 | Rose | 123 | 19 | 0 |
| 7 | Ben | 123 | 8 | 0 |
+----+----------+----------+-----+------+
7 rows in set (0.00 sec)
//条件更新
mysql> UPDATE users set age = age + 10 WHERE id%2=0;
Query OK, 3 rows affected (0.09 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> select *from users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 24 | 0 |
| 2 | John | 123 | 32 | 0 |
| 3 | Tom | 123 | 22 | 0 |
| 4 | Tom | 123 | 21 | 0 |
| 5 | Tim | 123 | 20 | 0 |
| 6 | Rose | 123 | 29 | 0 |
| 7 | Ben | 123 | 8 | 0 |
+----+----------+----------+-----+------+
7 rows in set (0.00 sec)
3、删除记录
单表:
DELETE FROM table_name [WHERE where_condition]
mysql> DELETE FROM users WHERE id = 6;
Query OK, 1 row affected (0.06 sec)
mysql> select *from users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 24 | 0 |
| 2 | John | 123 | 32 | 0 |
| 3 | Tom | 123 | 22 | 0 |
| 4 | Tom | 123 | 21 | 0 |
| 5 | Tim | 123 | 20 | 0 |
| 7 | Ben | 123 | 8 | 0 |
+----+----------+----------+-----+------+
6 rows in set (0.00 sec)
4、查询表达式解析
查找记录
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 3+5;
+-----+
| 3+5 |
+-----+
| 8 |
+-----+
1 row in set (0.00 sec)
mysql> SELECT username,id FROM users;
+----------+----+
| username | id |
+----------+----+
| Tom | 1 |
| John | 2 |
| Tom | 3 |
| Tom | 4 |
| Tim | 5 |
| Ben | 7 |
+----------+----+
6 rows in set (0.00 sec)
查询表达式
每一个表达式表示想要的一列,必须有至少一个
多列之间以英文逗号
星号(*)表示所有列。table_name.*可以表示命名表的所有列
查询表达式可以使用[AS]alias_name为其赋予别名
别名可用与GROUP BY,ORDER BY或HAVING子句
5、条件表达式
对记录进行过滤,如果没有指定WHERE子句,则显示所有记录。
在WHERE表达式中,可以使用MYSQL支持的函数或运算符
6、查询结果分组GROUP BY
[GROUP BY{col_name|position}[ASC|DESC],...]
mysql> SELECT sex FROM users GROUP BY sex;
+------+
| sex |
+------+
| 0 |
+------+
1 row in set (0.05 sec)
7、分组条件
[HAVING where_condition]
mysql> SELECT age FROM users GROUP BY age HAVING age >22;
+-----+
| age |
+-----+
| 24 |
| 32 |
+-----+
2 rows in set (0.00 sec)
十、子查询和连接
子查询是指在另一个查询语句中的SELECT子句。
例句:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement),
SELECT column1 FROM t2 称为Sub Query[子查询]。
所以,我们说子查询是嵌套在外查询内部。而事实上它有可能在子查询内部再嵌套子查询。
子查询必须出现在圆括号之间。
1、使用比较运算符的子查询
运算符:=、>、<、<=、>=、<>、!=、<=>
语法结构:operand comparisor_operator subquery
mysql> SELECT AVG(goods_price) FROM tdb_goods;
+------------------+
| AVG(goods_price) |
+------------------+
| 5636.3636364 |
+------------------+
1 row in set (0.01 sec)
mysql> SELECT ROUND(AVG(goods_price),2) FROM tdb_goods;
+---------------------------+
| ROUND(AVG(goods_price),2) |
+---------------------------+
| 5636.36 |
+---------------------------+
1 row in set (0.00 sec)
mysql> SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >=5636.36;
+----------+-----------------------------------------+-------------+
| goods_id | goods_name | goods_price |
+----------+-----------------------------------------+-------------+
| 3 | G150TH 15.6英寸游戏本 | 8499.000 |
| 7 | SVP13226SCB 13.3英寸触控超极本 | 7999.000 |
| 13 | iMac ME086CH/A 21.5英寸一体电脑 | 9188.000 |
| 17 | Mac Pro MD878CH/A 专业级台式电脑 | 28888.000 |
| 18 | HMZ-T3W 头戴显示设备 | 6999.000 |
| 20 | X3250 M4机架式服务器 2583i14 | 6888.000 |
| 21 | HMZ-T3W 头戴显示设备 | 6999.000 |
+----------+-----------------------------------------+-------------+
7 rows in set (0.00 sec)
mysql> SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >=(SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);
+----------+-----------------------------------------+-------------+
| goods_id | goods_name | goods_price |
+----------+-----------------------------------------+-------------+
| 3 | G150TH 15.6英寸游戏本 | 8499.000 |
| 7 | SVP13226SCB 13.3英寸触控超极本 | 7999.000 |
| 13 | iMac ME086CH/A 21.5英寸一体电脑 | 9188.000 |
| 17 | Mac Pro MD878CH/A 专业级台式电脑 | 28888.000 |
| 18 | HMZ-T3W 头戴显示设备 | 6999.000 |
| 20 | X3250 M4机架式服务器 2583i14 | 6888.000 |
| 21 | HMZ-T3W 头戴显示设备 | 6999.000 |
+----------+-----------------------------------------+-------------+
7 rows in set (0.00 sec)
2、用ANY\SOME\或ALL修饰的比较运算符
operand comparisor_operator ANY(subquery)
operand comparisor_operator SOME(subquery)
operand comparisor_operator ALL(subquery)
mysql> SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >= ANY(SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);
+----------+-----------------------------------------+-------------+
| goods_id | goods_name | goods_price |
+----------+-----------------------------------------+-------------+
| 3 | G150TH 15.6英寸游戏本 | 8499.000 |
| 7 | SVP13226SCB 13.3英寸触控超极本 | 7999.000 |
| 13 | iMac ME086CH/A 21.5英寸一体电脑 | 9188.000 |
| 17 | Mac Pro MD878CH/A 专业级台式电脑 | 28888.000 |
| 18 | HMZ-T3W 头戴显示设备 | 6999.000 |
| 20 | X3250 M4机架式服务器 2583i14 | 6888.000 |
| 21 | HMZ-T3W 头戴显示设备 | 6999.000 |
+----------+-----------------------------------------+-------------+
7 rows in set (0.00 sec)
mysql> SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >= ALL(SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);
+----------+-----------------------------------------+-------------+
| goods_id | goods_name | goods_price |
+----------+-----------------------------------------+-------------+
| 3 | G150TH 15.6英寸游戏本 | 8499.000 |
| 7 | SVP13226SCB 13.3英寸触控超极本 | 7999.000 |
| 13 | iMac ME086CH/A 21.5英寸一体电脑 | 9188.000 |
| 17 | Mac Pro MD878CH/A 专业级台式电脑 | 28888.000 |
| 18 | HMZ-T3W 头戴显示设备 | 6999.000 |
| 20 | X3250 M4机架式服务器 2583i14 | 6888.000 |
| 21 | HMZ-T3W 头戴显示设备 | 6999.000 |
+----------+-----------------------------------------+-------------+
7 rows in set (0.01 sec)
mysql> SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >= SOME(SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);
+----------+-----------------------------------------+-------------+
| goods_id | goods_name | goods_price |
+----------+-----------------------------------------+-------------+
| 3 | G150TH 15.6英寸游戏本 | 8499.000 |
| 7 | SVP13226SCB 13.3英寸触控超极本 | 7999.000 |
| 13 | iMac ME086CH/A 21.5英寸一体电脑 | 9188.000 |
| 17 | Mac Pro MD878CH/A 专业级台式电脑 | 28888.000 |
| 18 | HMZ-T3W 头戴显示设备 | 6999.000 |
| 20 | X3250 M4机架式服务器 2583i14 | 6888.000 |
| 21 | HMZ-T3W 头戴显示设备 | 6999.000 |
+----------+-----------------------------------------+-------------+
7 rows in set (0.00 sec)
3、INT EXISTS(少用)引发的子查询
operand comparisor_operator [NOT] IN(subquery)
4、使用INSERT ... SELECT插入记录
将查询结果写入数据表
INSERT [INTO] table_name[(col_name,...)] SELECT ...
例句:INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROM GROUP BY goods_cate;
mysql> SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
+---------------------+
| goods_cate |
+---------------------+
| 台式机 |
| 平板电脑 |
| 服务器/工作站 |
| 游戏本 |
| 笔记本 |
| 笔记本配件 |
| 超级本 |
+---------------------+
7 rows in set (0.00 sec)
mysql> INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
Query OK, 7 rows affected (0.10 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> SELECT *FROM tdb_goods_cates;
+---------+---------------------+
| cate_id | cate_name |
+---------+---------------------+
| 1 | 台式机 |
| 2 | 平板电脑 |
| 3 | 服务器/工作站 |
| 4 | 游戏本 |
| 5 | 笔记本 |
| 6 | 笔记本配件 |
| 7 | 超级本 |
+---------+---------------------+
7 rows in set (0.00 sec)
5、多表更新
语法结构:tale_reference {[INNER|CROSS]JOIN|{LEFT|RIGHT}[OUTER]JOIN}
table_reference ON conditional_expr
INNER JOIN 内连接
在MYSQL中,JOIN,CROSS JOIN和INNER JOIN是等价的
LEFT[OUTER] JOIN左外连接
RIGHT[OUTER] JOIN右外连接
mysql> UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name SET goods_cate = cate_id;
Query OK, 22 rows affected (0.09 sec)
Rows matched: 22 Changed: 22 Warnings: 0
mysql> SELECT *FROM tdb_goods;
+----------+--------------------------------------------------------------------------------------+------------+------------+-------------+---------+------------+
| goods_id | goods_name | goods_cate | brand_name | goods_price | is_show | is_saleoff |
+----------+--------------------------------------------------------------------------------------+------------+------------+-------------+---------+------------+
| 1 | R510VC 15.6英寸笔记本 | 5 | 华硕 | 3399.000 | 1 | 0 |
| 2 | Y400N 14.0英寸笔记本电脑 | 5 | 联想 | 4899.000 | 1 | 0 |
| 3 | G150TH 15.6英寸游戏本 | 4 | 雷神 | 8499.000 | 1 | 0 |
| 4 | X550CC 15.6英寸笔记本 | 5 | 华硕 | 2799.000 | 1 | 0 |
| 5 | X240(20ALA0EYCD) 12.5英寸超极本 | 7 | 联想 | 4999.000 | 1 | 0 |
| 6 | U330P 13.3英寸超极本 | 7 | 联想 | 4299.000 | 1 | 0 |
| 7 | SVP13226SCB 13.3英寸触控超极本 | 7 | 索尼 | 7999.000 | 1 | 0 |
| 8 | iPad mini MD531CH/A 7.9英寸平板电脑 | 2 | 苹果 | 1998.000 | 1 | 0 |
| 9 | iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版) | 2 | 苹果 | 3388.000 | 1 | 0 |
| 10 | iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版) | 2 | 苹果 | 2788.000 | 1 | 0 |
| 11 | IdeaCentre C340 20英寸一体电脑 | 1 | 联想 | 3499.000 | 1 | 0 |
| 12 | Vostro 3800-R1206 台式电脑 | 1 | 戴尔 | 2899.000 | 1 | 0 |
| 13 | iMac ME086CH/A 21.5英寸一体电脑 | 1 | 苹果 | 9188.000 | 1 | 0 |
| 14 | AT7-7414LP 台式电脑 (i5-3450四核 4G 500G 2G独显 DVD 键鼠 Linux ) | 1 | 宏碁 | 3699.000 | 1 | 0 |
| 15 | Z220SFF F4F06PA工作站 | 3 | 惠普 | 4288.000 | 1 | 0 |
| 16 | PowerEdge T110 II服务器 | 3 | 戴尔 | 5388.000 | 1 | 0 |
| 17 | Mac Pro MD878CH/A 专业级台式电脑 | 3 | 苹果 | 28888.000 | 1 | 0 |
| 18 | HMZ-T3W 头戴显示设备 | 6 | 索尼 | 6999.000 | 1 | 0 |
| 19 | 商务双肩背包 | 6 | 索尼 | 99.000 | 1 | 0 |
| 20 | X3250 M4机架式服务器 2583i14 | 3 | IBM | 6888.000 | 1 | 0 |
| 21 | HMZ-T3W 头戴显示设备 | 6 | 索尼 | 6999.000 | 1 | 0 |
| 22 | 商务双肩背包 | 6 | 索尼 | 99.000 | 1 | 0 |
+----------+--------------------------------------------------------------------------------------+------------+------------+-------------+---------+------------+
22 rows in set (0.00 sec)
6、多表更新之一步到位
UPDATE table_references SET col_name1 = {expr1|DEFAULT}
[,col_name2 = {expr2|DEFAULT}]...
[WHERE where_condition]
创建数据表的同时将查询结果写入数据表
CREAT TABLE [IF NOT EXISTS] table_name
[(creat_definition,...)]
select_statement
mysql> SELECT brand_name FROM tdb_goods GROUP BY brand_name;
+------------+
| brand_name |
+------------+
| IBM |
| 华硕 |
| 宏碁 |
| 惠普 |
| 戴尔 |
| 索尼 |
| 联想 |
| 苹果 |
| 雷神 |
+------------+
9 rows in set (0.94 sec)
mysql> 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;
Query OK, 9 rows affected (0.78 sec)
Records: 9 Duplicates: 0 Warnings: 0
mysql> show tables ;
+------------------+
| Tables_in_t1 |
+------------------+
| tdb_goods |
| tdb_goods_brands |
| tdb_goods_cates |
| tdb_goods_types |
| users |
+------------------+
5 rows in set (0.00 sec)
mysql> SELECT *FROM tdb_goods_brands;
+----------+------------+
| brand_id | brand_name |
+----------+------------+
| 1 | IBM |
| 2 | 华硕 |
| 3 | 宏碁 |
| 4 | 惠普 |
| 5 | 戴尔 |
| 6 | 索尼 |
| 7 | 联想 |
| 8 | 苹果 |
| 9 | 雷神 |
+----------+------------+
9 rows in set (0.00 sec)
//创建内连接
mysql> UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS b ON g.brand_name =b.brand_name
-> SET g.brand_name = b.brand_id;
Query OK, 22 rows affected (0.16 sec)
Rows matched: 22 Changed: 22 Warnings: 0
mysql> SELECT *FROM tdb_goods_brands;
+----------+------------+
| brand_id | brand_name |
+----------+------------+
| 1 | IBM |
| 2 | 华硕 |
| 3 | 宏碁 |
| 4 | 惠普 |
| 5 | 戴尔 |
| 6 | 索尼 |
| 7 | 联想 |
| 8 | 苹果 |
| 9 | 雷神 |
+----------+------------+
9 rows in set (0.00 sec)
mysql> SELECT *FROM tdb_goods;
+----------+--------------------------------------------------------------------------------------+------------+------------+-------------+---------+------------+
| goods_id | goods_name | goods_cate | brand_name | goods_price | is_show | is_saleoff |
+----------+--------------------------------------------------------------------------------------+------------+------------+-------------+---------+------------+
| 1 | R510VC 15.6英寸笔记本 | 5 | 2 | 3399.000 | 1 | 0 |
| 2 | Y400N 14.0英寸笔记本电脑 | 5 | 7 | 4899.000 | 1 | 0 |
| 3 | G150TH 15.6英寸游戏本 | 4 | 9 | 8499.000 | 1 | 0 |
| 4 | X550CC 15.6英寸笔记本 | 5 | 2 | 2799.000 | 1 | 0 |
| 5 | X240(20ALA0EYCD) 12.5英寸超极本 | 7 | 7 | 4999.000 | 1 | 0 |
| 6 | U330P 13.3英寸超极本 | 7 | 7 | 4299.000 | 1 | 0 |
| 7 | SVP13226SCB 13.3英寸触控超极本 | 7 | 6 | 7999.000 | 1 | 0 |
| 8 | iPad mini MD531CH/A 7.9英寸平板电脑 | 2 | 8 | 1998.000 | 1 | 0 |
| 9 | iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版) | 2 | 8 | 3388.000 | 1 | 0 |
| 10 | iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版) | 2 | 8 | 2788.000 | 1 | 0 |
| 11 | IdeaCentre C340 20英寸一体电脑 | 1 | 7 | 3499.000 | 1 | 0 |
| 12 | Vostro 3800-R1206 台式电脑 | 1 | 5 | 2899.000 | 1 | 0 |
| 13 | iMac ME086CH/A 21.5英寸一体电脑 | 1 | 8 | 9188.000 | 1 | 0 |
| 14 | AT7-7414LP 台式电脑 (i5-3450四核 4G 500G 2G独显 DVD 键鼠 Linux ) | 1 | 3 | 3699.000 | 1 | 0 |
| 15 | Z220SFF F4F06PA工作站 | 3 | 4 | 4288.000 | 1 | 0 |
| 16 | PowerEdge T110 II服务器 | 3 | 5 | 5388.000 | 1 | 0 |
| 17 | Mac Pro MD878CH/A 专业级台式电脑 | 3 | 8 | 28888.000 | 1 | 0 |
| 18 | HMZ-T3W 头戴显示设备 | 6 | 6 | 6999.000 | 1 | 0 |
| 19 | 商务双肩背包 | 6 | 6 | 99.000 | 1 | 0 |
| 20 | X3250 M4机架式服务器 2583i14 | 3 | 1 | 6888.000 | 1 | 0 |
| 21 | HMZ-T3W 头戴显示设备 | 6 | 6 | 6999.000 | 1 | 0 |
| 22 | 商务双肩背包 | 6 | 6 | 99.000 | 1 | 0 |
+----------+--------------------------------------------------------------------------------------+------------+------------+-------------+---------+------------+
22 rows in set (0.00 sec)
//改变字段的数据类型
mysql> ALTER TABLE tdb_goods
-> CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,
-> CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;
Query OK, 22 rows affected (1.12 sec)
Records: 22 Duplicates: 0 Warnings: 0
//查看表的定义
mysql> SHOW COLUMNS FROM tdb_goods;
+-------------+------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------------+------+-----+---------+----------------+
| goods_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| goods_name | varchar(150) | NO | | NULL | |
| cate_id | smallint(5) unsigned | NO | | NULL | |
| brand_id | smallint(5) unsigned | NO | | NULL | |
| goods_price | decimal(15,3) unsigned | NO | | 0.000 | |
| is_show | tinyint(1) | NO | | 1 | |
| is_saleoff | tinyint(1) | NO | | 0 | |
+-------------+------------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
7、连接
语法结构:table_reference
{[INNER|CROSS]JOIN|{LEFT|RIGHT}[OUTER]JOIN}
table_reference ON conditional_expr
数据表参照
table_reference
table_name [[AS]alias]|table_subquery [AS] alias
数据表可以使用table_name AS alias_name或者table_name alias_name赋予别名
table_subquery可以作为子查询使用在FROM子句中,这样的查询不许为其赋予别名
MYSQL在SELECT语句、多表更新、多表删除语句中支持JOIN操作
8、连接类型
INNER JOIN 内连接
在MYSQL中,JOIN,CROSS JOIN和INNER JOIN是等价的
LEFT[OUTER] JOIN左外连接
RIGHT[OUTER] JOIN右外连接
使用ON关键字来设定连接条件,也可以使用WHERE来代替
通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果集记录的过滤
mysql> SELECT goods_id,goods_name,cate_name FROM tdb_goods INNER JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;
+----------+--------------------------------------------------------------------------------------+---------------------+
| goods_id | goods_name | cate_name |
+----------+--------------------------------------------------------------------------------------+---------------------+
| 1 | R510VC 15.6英寸笔记本 | 笔记本 |
| 2 | Y400N 14.0英寸笔记本电脑 | 笔记本 |
| 3 | G150TH 15.6英寸游戏本 | 游戏本 |
| 4 | X550CC 15.6英寸笔记本 | 笔记本 |
| 5 | X240(20ALA0EYCD) 12.5英寸超极本 | 超级本 |
| 6 | U330P 13.3英寸超极本 | 超级本 |
| 7 | SVP13226SCB 13.3英寸触控超极本 | 超级本 |
| 8 | iPad mini MD531CH/A 7.9英寸平板电脑 | 平板电脑 |
| 9 | iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版) | 平板电脑 |
| 10 | iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版) | 平板电脑 |
| 11 | IdeaCentre C340 20英寸一体电脑 | 台式机 |
| 12 | Vostro 3800-R1206 台式电脑 | 台式机 |
| 13 | iMac ME086CH/A 21.5英寸一体电脑 | 台式机 |
| 14 | AT7-7414LP 台式电脑 (i5-3450四核 4G 500G 2G独显 DVD 键鼠 Linux ) | 台式机 |
| 15 | Z220SFF F4F06PA工作站 | 服务器/工作站 |
| 16 | PowerEdge T110 II服务器 | 服务器/工作站 |
| 17 | Mac Pro MD878CH/A 专业级台式电脑 | 服务器/工作站 |
| 18 | HMZ-T3W 头戴显示设备 | 笔记本配件 |
| 19 | 商务双肩背包 | 笔记本配件 |
| 20 | X3250 M4机架式服务器 2583i14 | 服务器/工作站 |
| 21 | HMZ-T3W 头戴显示设备 | 笔记本配件 |
| 22 | 商务双肩背包 | 笔记本配件 |
+----------+--------------------------------------------------------------------------------------+---------------------+
22 rows in set (0.07 sec)
十一、运算符和函数
1、字符函数
mysql> SELECT CONCAT('t1','-mysql');
+-----------------------+
| CONCAT('t1','-mysql') |
+-----------------------+
| t1-mysql |
+-----------------------+
1 row in set (0.09 sec)
mysql> SELECT CONCAT_ws('|','A','B','C');
+----------------------------+
| CONCAT_ws('|','A','B','C') |
+----------------------------+
| A|B|C |
+----------------------------+
1 row in set (0.06 sec)
mysql> SELECT FORMAT(12560.12,2);
+--------------------+
| FORMAT(12560.12,2) |
+--------------------+
| 12,560.12 |
+--------------------+
1 row in set (0.09 sec)
mysql> SELECT FORMAT(12560.12,1);
+--------------------+
| FORMAT(12560.12,1) |
+--------------------+
| 12,560.1 |
+--------------------+
1 row in set (0.00 sec)
mysql> SELECT FORMAT(12560.12,0);
+--------------------+
| FORMAT(12560.12,0) |
+--------------------+
| 12,560 |
+--------------------+
1 row in set (0.00 sec)
mysql> SELECT LOWER('MYSQl');
+----------------+
| LOWER('MYSQl') |
+----------------+
| mysql |
+----------------+
1 row in set (0.00 sec)
mysql> SELECT UPPER('mysQl');
+----------------+
| UPPER('mysQl') |
+----------------+
| MYSQL |
+----------------+
1 row in set (0.00 sec)
mysql> SELECT LEFT('MYSQL',2);
+-----------------+
| LEFT('MYSQL',2) |
+-----------------+
| MY |
+-----------------+
1 row in set (0.08 sec)
mysql> SELECT LOWER(LEFT('MYSQL',2));
+------------------------+
| LOWER(LEFT('MYSQL',2)) |
+------------------------+
| my |
+------------------------+
1 row in set (0.00 sec)
mysql> SELECT LOWER(RIGHT('MYSQL',3));
+-------------------------+
| LOWER(RIGHT('MYSQL',3)) |
+-------------------------+
| sql |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT LENGTH('MY SQL');
+------------------+
| LENGTH('MY SQL') |
+------------------+
| 6 |
+------------------+
1 row in set (0.08 sec)
mysql> SELECT LTRIM(' MY SQL');
+------------------+
| LTRIM(' MY SQL') |
+------------------+
| MY SQL |
+------------------+
1 row in set (0.05 sec)
mysql> SELECT RTRIM(' MY SQL');
+------------------+
| RTRIM(' MY SQL') |
+------------------+
| MY SQL |
+------------------+
1 row in set (0.00 sec)
mysql> SELECT LENGTH(LTRIM(' MY SQL'));
+--------------------------+
| LENGTH(LTRIM(' MY SQL')) |
+--------------------------+
| 6 |
+--------------------------+
1 row in set (0.00 sec)
mysql> SELECT LENGTH(' MY SQL');
+-------------------+
| LENGTH(' MY SQL') |
+-------------------+
| 7 |
+-------------------+
1 row in set (0.00 sec)
mysql> SELECT SUBSTRING('MYSQL',1,2);
+------------------------+
| SUBSTRING('MYSQL',1,2) |
+------------------------+
| MY |
+------------------------+
1 row in set (0.00 sec)
mysql> SELECT 'MYSQL' LIKE 'M%';
+-------------------+
| 'MYSQL' LIKE 'M%' |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
2、数值运算符与函数
mysql> SELECT 3+4;
+-----+
| 3+4 |
+-----+
| 7 |
+-----+
1 row in set (0.07 sec)
mysql> SELECT CEIL(4.01);
+------------+
| CEIL(4.01) |
+------------+
| 5 |
+------------+
1 row in set (0.06 sec)
mysql> SELECT FLOOR(4.01);
+-------------+
| FLOOR(4.01) |
+-------------+
| 4 |
+-------------+
1 row in set (0.00 sec)
mysql> SELECT 3/4;
+--------+
| 3/4 |
+--------+
| 0.7500 |
+--------+
1 row in set (0.06 sec)
mysql> SELECT 3 DIV 4;
+---------+
| 3 DIV 4 |
+---------+
| 0 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT 3 % 4;
+-------+
| 3 % 4 |
+-------+
| 3 |
+-------+
1 row in set (0.00 sec)
mysql> SELECT 3 MOD 4;
+---------+
| 3 MOD 4 |
+---------+
| 3 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT POWER(2,3);
+------------+
| POWER(2,3) |
+------------+
| 8 |
+------------+
1 row in set (0.07 sec)
mysql> SELECT ROUND(12123.311231,2)
-> ;
+-----------------------+
| ROUND(12123.311231,2) |
+-----------------------+
| 12123.31 |
+-----------------------+
1 row in set (0.07 sec)
mysql> SELECT TRUNCATE(12123.311231,2);
+--------------------------+
| TRUNCATE(12123.311231,2) |
+--------------------------+
| 12123.31 |
+--------------------------+
1 row in set (0.00 sec)
mysql> SELECT TRUNCATE(12123.1231,2);
+------------------------+
| TRUNCATE(12123.1231,2) |
+------------------------+
| 12123.12 |
+------------------------+
1 row in set (0.00 sec)
3、比较运算符与函数
mysql> SELECT 15 between 1 and 22;
+---------------------+
| 15 between 1 and 22 |
+---------------------+
| 1 |
+---------------------+
1 row in set (0.07 sec)
mysql> SELECT 15 not between 1 and 22;
+-------------------------+
| 15 not between 1 and 22 |
+-------------------------+
| 0 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT 10 IN (5,10,12,3);
+-------------------+
| 10 IN (5,10,12,3) |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.07 sec)
mysql> SELECT NULL IS NULL;
+--------------+
| NULL IS NULL |
+--------------+
| 1 |
+--------------+
1 row in set (0.06 sec)
mysql> SELECT 0 IS NULL;
+-----------+
| 0 IS NULL |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)
4、日期时间函数
mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2018-10-01 16:28:53 |
+---------------------+
1 row in set (0.08 sec)
mysql> SELECT CURDATE();
+------------+
| CURDATE() |
+------------+
| 2018-10-01 |
+------------+
1 row in set (0.01 sec)
mysql> SELECT CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 16:29:19 |
+-----------+
1 row in set (0.00 sec)
mysql> SELECT DATE_ADD('2018-10-01',INTERVAL 300 DAY);
+-----------------------------------------+
| DATE_ADD('2018-10-01',INTERVAL 300 DAY) |
+-----------------------------------------+
| 2019-07-28 |
+-----------------------------------------+
1 row in set (0.07 sec)
mysql> SELECT DATE_ADD('2018-10-01',INTERVAL -300 DAY);
+------------------------------------------+
| DATE_ADD('2018-10-01',INTERVAL -300 DAY) |
+------------------------------------------+
| 2017-12-05 |
+------------------------------------------+
1 row in set (0.01 sec)
mysql> SELECT DATE_ADD('2018-10-01',INTERVAL 3 WEEK);
+----------------------------------------+
| DATE_ADD('2018-10-01',INTERVAL 3 WEEK) |
+----------------------------------------+
| 2018-10-22 |
+----------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT DATEDIFF('2017-06-09','2018-10-01');
+-------------------------------------+
| DATEDIFF('2017-06-09','2018-10-01') |
+-------------------------------------+
| -479 |
+-------------------------------------+
1 row in set (0.07 sec)
mysql> SELECT DATE_FORMAT('2018-10-01','%m/%d/%Y');
+--------------------------------------+
| DATE_FORMAT('2018-10-01','%m/%d/%Y') |
+--------------------------------------+
| 10/01/2018 |
+--------------------------------------+
1 row in set (0.00 sec)
5、信息函数
mysql> SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
| 33 |
+-----------------+
1 row in set (0.00 sec)
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| t1 |
+------------+
1 row in set (0.00 sec)
mysql> SELECT USER();
+----------------+
| USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.22 |
+-----------+
1 row in set (0.05 sec)
6、聚合函数
mysql> select *from tdb_goods;
+----------+--------------------------------------------------------------------------------------+---------+----------+-------------+---------+------------+
| goods_id | goods_name | cate_id | brand_id | goods_price | is_show | is_saleoff |
+----------+--------------------------------------------------------------------------------------+---------+----------+-------------+---------+------------+
| 1 | R510VC 15.6英寸笔记本 | 5 | 2 | 3399.000 | 1 | 0 |
| 2 | Y400N 14.0英寸笔记本电脑 | 5 | 7 | 4899.000 | 1 | 0 |
| 3 | G150TH 15.6英寸游戏本 | 4 | 9 | 8499.000 | 1 | 0 |
| 4 | X550CC 15.6英寸笔记本 | 5 | 2 | 2799.000 | 1 | 0 |
| 5 | X240(20ALA0EYCD) 12.5英寸超极本 | 7 | 7 | 4999.000 | 1 | 0 |
| 6 | U330P 13.3英寸超极本 | 7 | 7 | 4299.000 | 1 | 0 |
| 7 | SVP13226SCB 13.3英寸触控超极本 | 7 | 6 | 7999.000 | 1 | 0 |
| 8 | iPad mini MD531CH/A 7.9英寸平板电脑 | 2 | 8 | 1998.000 | 1 | 0 |
| 9 | iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版) | 2 | 8 | 3388.000 | 1 | 0 |
| 10 | iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版) | 2 | 8 | 2788.000 | 1 | 0 |
| 11 | IdeaCentre C340 20英寸一体电脑 | 1 | 7 | 3499.000 | 1 | 0 |
| 12 | Vostro 3800-R1206 台式电脑 | 1 | 5 | 2899.000 | 1 | 0 |
| 13 | iMac ME086CH/A 21.5英寸一体电脑 | 1 | 8 | 9188.000 | 1 | 0 |
| 14 | AT7-7414LP 台式电脑 (i5-3450四核 4G 500G 2G独显 DVD 键鼠 Linux ) | 1 | 3 | 3699.000 | 1 | 0 |
| 15 | Z220SFF F4F06PA工作站 | 3 | 4 | 4288.000 | 1 | 0 |
| 16 | PowerEdge T110 II服务器 | 3 | 5 | 5388.000 | 1 | 0 |
| 17 | Mac Pro MD878CH/A 专业级台式电脑 | 3 | 8 | 28888.000 | 1 | 0 |
| 18 | HMZ-T3W 头戴显示设备 | 6 | 6 | 6999.000 | 1 | 0 |
| 19 | 商务双肩背包 | 6 | 6 | 99.000 | 1 | 0 |
| 20 | X3250 M4机架式服务器 2583i14 | 3 | 1 | 6888.000 | 1 | 0 |
| 21 | HMZ-T3W 头戴显示设备 | 6 | 6 | 6999.000 | 1 | 0 |
| 22 | 商务双肩背包 | 6 | 6 | 99.000 | 1 | 0 |
| 23 | LaserJet Pro P1606dn 黑白激光打印机 | 12 | 4 | 1849.000 | 1 | 0 |
+----------+--------------------------------------------------------------------------------------+---------+----------+-------------+---------+------------+
23 rows in set (0.00 sec)
mysql> SELECT AVG(goods_price) FROM tdb_goods;
+------------------+
| AVG(goods_price) |
+------------------+
| 5471.6956522 |
+------------------+
1 row in set (0.22 sec)
mysql> SELECT COUNT(goods_id) FROM tdb_goods;
+-----------------+
| COUNT(goods_id) |
+-----------------+
| 23 |
+-----------------+
1 row in set (0.06 sec)
mysql> SELECT MIN(goods_price) FROM tdb_goods;
+------------------+
| MIN(goods_price) |
+------------------+
| 99.000 |
+------------------+
1 row in set (0.04 sec)
mysql> SELECT MAX(goods_price) FROM tdb_goods;
+------------------+
| MAX(goods_price) |
+------------------+
| 28888.000 |
+------------------+
1 row in set (0.00 sec)
mysql> SELECT SUM(goods_price) FROM tdb_goods;
+------------------+
| SUM(goods_price) |
+------------------+
| 125849.000 |
+------------------+
1 row in set (0.00 sec)
7、加密函数
MD5(); 信息摘要算法
PASSWORD(); 密码算法
mysql> SELECT MD5('admin');
+----------------------------------+
| MD5('admin') |
+----------------------------------+
| 21232f297a57a5a743894a0e4a801fc3 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> SELECT PASSWORD('admin');
+-------------------------------------------+
| PASSWORD('admin') |
+-------------------------------------------+
| *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
+-------------------------------------------+
1 row in set, 1 warning (0.07 sec)
//修改密码
SET PASSWORD = PASSWORD('123456');
8、自定义函数
自定义函数(UDF)
用户自定义函数(user-defined function,UDF)是一种MYSQL扩展的途径,用法和内置函数相同
函数可以返回任意的数据类型
创建自定义函数
CREAT FUNCTION function_name RETURNS
{STRING|INTEGER|REAL|DECIMAL}
routine_body
函数体:
函数体由合法的SQL语句组成
函数体可以是简单的SELECT或者INSERT语句
函数体如果未复合结构则使用BEGIN...END语句
符合结构可以包含声明,循环,控制结构
创建不带参的自定义函数
mysql> CREATE FUNCTION MYNOW() RETURNS VARCHAR(30)
-> RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H时%i分%s秒');
Query OK, 0 rows affected (0.04 sec)
mysql> SELECT MYNOW();
+-----------------------------------+
| MYNOW() |
+-----------------------------------+
| 2018年10月01日 18时51分43秒 |
+-----------------------------------+
1 row in set (0.00 sec)
创建带有参数的自定义函数
mysql> CREATE FUNCTION F2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
-> RETURNS FLOAT(10,2) UNSIGNED
-> RETURN (num1+num2)/2;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT F2(10,15);
+-----------+
| F2(10,15) |
+-----------+
| 12.50 |
+-----------+
1 row in set (0.06 sec)
创建具有复合结构函数体的自定义函数
必须包含在begin。。。end之间
删除自定义函数
DROP FUNCTION [IF EXISTS] function_name
十二、存储
1、存储过程简介
存储过程
SQL命令--》 MYSQL引擎--》分析 语法正确--》可识别命令
执行--》执行结果 返回--》客户端
存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为单元处理
优点:
增强SQL语句的功能和灵活性
实现较快的执行速度
减少了网络流量
2、创建存储过程
CREAT
[DEFINER = {user|CURRENT_USER}]
PROCEDURE sp_name([proc_parameter[,...]])
[characteristic...]routine_body
proc_parameter:
[IN|OUT|INOUT]param_name type
参数:
IN,表示该参数的值必须在调用村塾过程时指定
OUT,表示该参数的值可以被存储过程改变,并且可以返回
INOUT,表示该参数的调用时指定,并且可以被改变和返回
过程体:
过程体由合法的SQL语句组成
过程体可以是任意SQL语句
过程体如果为复合结构则使用BEGIN...END语句
复合结构可以包含声明,循环,控制结构
3、调用存储过程:
CALL sp_name([parameter[,...]])
CALL sp_name[()]
4、删除存储过程:
DROP PROCEDURE [IF EXISTS]sp_name
mysql> DROP PROCEDURE removeUserById;
Query OK, 0 rows affected (0.04 sec)
5、创建不带参的存储过程
mysql> CREATE PROCEDURE sp1() SELECT VERSION();
Query OK, 0 rows affected (0.00 sec)
mysql> CALL sp1;
+-----------+
| VERSION() |
+-----------+
| 5.7.22 |
+-----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
6、创建带IN类型参的存储过程
mysql> SELECT *FROM users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 24 | 0 |
| 2 | John | 123 | 32 | 0 |
| 3 | Tom | 123 | 22 | 0 |
| 4 | Tom | 123 | 21 | 0 |
| 5 | Tim | 123 | 20 | 0 |
| 7 | Ben | 123 | 8 | 0 |
+----+----------+----------+-----+------+
6 rows in set (0.08 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE removeUserById (IN p_id INT UNSIGNED)
-> BEGIN
-> DELETE FROM users WHERE id = p_id;
-> END
-> //
Query OK, 0 rows affected (0.01 sec)
mysql> DELIMITER ;
mysql> CALL removeUserById(7);
Query OK, 1 row affected (0.09 sec)
mysql> SELECT *FROM users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 24 | 0 |
| 2 | John | 123 | 32 | 0 |
| 3 | Tom | 123 | 22 | 0 |
| 4 | Tom | 123 | 21 | 0 |
| 5 | Tim | 123 | 20 | 0 |
+----+----------+----------+-----+------+
5 rows in set (0.00 sec)
7、创建带有IN和OUT类型参数的存储过程
mysql> SELECT *FROM users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 24 | 0 |
| 2 | John | 123 | 32 | 0 |
| 3 | Tom | 123 | 22 | 0 |
| 4 | Tom | 123 | 21 | 0 |
| 5 | Tim | 123 | 20 | 0 |
+----+----------+----------+-----+------+
5 rows in set (0.14 sec)
//结束符修改为//
mysql> DELIMITER //
mysql> CREATE PROCEDURE removeUserAndReturnUserNum(IN p_id INT UNSIGNED,OUT userName INT UNSIGNED)
-> BEGIN
-> DELETE FROM users WHERE id = p_id;
-> SELECT count(id) FROM users INTO userNum;
-> end;
-> //
Query OK, 0 rows affected (0.13 sec)
//结束符修改为;
mysql> DELIMITER ;
mysql> SELECT COUNT(id) FROM users;
+-----------+
| COUNT(id) |
+-----------+
| 5 |
+-----------+
1 row in set (0.00 sec)
//删除ID为5的用户返回用户总数给用户变量@nums
mysql> CALL removeUserAndReturnUserNum(5,@nums);
Query OK, 1 row affected (0.12 sec)
mysql> SELECT *FROM users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 24 | 0 |
| 2 | John | 123 | 32 | 0 |
| 3 | Tom | 123 | 22 | 0 |
| 4 | Tom | 123 | 21 | 0 |
+----+----------+----------+-----+------+
4 rows in set (0.00 sec)
mysql> SELECT @nums;
+-------+
| @nums |
+-------+
| 4 |
+-------+
1 row in set (0.00 sec)
8、创建带有多个OUT类型参数的存储过程
mysql> DELIMITER //
mysql> CREATE PROCEDURE removeUserByAgeAndReturnInfors(IN p_age SMALLINT UNSIGNED,OUT deleteUser SMALLINT UNSIGNED,OUT userCounts SMALLINT UNSIGNED)
-> BEGIN
-> DELETE FROM users WHERE age = p_age;
-> SELECT COUNT(id) FROM users INTO userCounts;
-> SELECT ROW_COUNT() INTO deleteUser;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL removeUserByAgeAndReturnInfors(22,@a,@b);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT @a,@b;
+------+------+
| @a | @b |
+------+------+
| 1 | 3 |
+------+------+
1 row in set (0.00 sec)
mysql> SELECT *FROM users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 24 | 0 |
| 2 | John | 123 | 32 | 0 |
| 4 | Tom | 123 | 21 | 0 |
+----+----------+----------+-----+------+
3 rows in set (0.00 sec)
9、存储过程与自定义函数的区别
存储过程实现的功能要复杂一些;函数的针对性更强
存储过程可以返回多个值;函数只能有一个返回值
存储过程一般独立来执行;函数可以作为其他SQL语句的组成部分来出现
10、修改存储过程
ALTER PROCEDURE sp_name[characteristic...]
COMMENT 'string'
|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIDIES SQL DATA}
|SQL SECURITY{DEFINER|INVOKER}
十三、存储引擎
1、存储引擎简介
MYSQL 可以将数据以不同的技术存储在文件(内存)中,这种技术称为存储引擎
每一种存储引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛且不同的功能
MYSQL支持的存储引擎
MyISAM
InnoDB
Memory
CSV
Archive
2、相关知识点
并发控制:当多个连接对记录进行修改是保证数据的一致性和完整性
解决:锁
共享锁(读锁):在同一时间段,多用户可以读取同一资源,读取过程中数据不会发生任何变化
排他锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁时会阻塞或者写锁操作
锁颗粒
表锁:一种开销最小的策略锁
行锁:一种开销最大的策略锁,支持最大并发
事务
事务用于保证数据库的完整性
事务的特性(ACID)
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
外键
索引
是对数据表中一列或者多列的值进行排序的一种结构
分类:普通索引、唯一索引、全文索引、btree索引、hash索引
3、修改存储引擎方法
1)、通过修改MYSQL配置文件
-default-storage-engine = engine
2)、通过创建数据表命令实现
-CREATE TABLE table_name(
...
...
)ENGINE = engine;
3)、通过修改数据表命令实现
-ALTER TABLE table_name ENGINE [=] engine_name;