SQL语言(MySQL入门)

SQL语言(MySQL入门)

SQL(Structured Query Language,结构化查询语言)是关系型数据库语言的标准。数据库当中的操作都是通过SQL语句来实现,它可以方便地嵌套在Java,C#,PHP等程序语言当中,以实现数据库数据的增删改查操作。



1. 引言

  • 数据定义语言(Data Definition Language,DDL) 主要用于创建数据库和数据库对象,为数据库操作提供对象。包括create创建,alter修改,drop删除语句。
  • 数据操作语言(Data Manipulation Language,DML) 主要用于操作数据库中的数据。包括insert插入,update更新,delete删除语句。
  • 数据查询语言(Data Query Language,DQL) 主要用于查询数据库中的数据。包括select查询语句。
  • 数据控制语言(Data Control Language,DCL) 主要用于实现对象的访问权限及对数据库操作事务的控制。包括grant,revoke,commit,rollback语句。grant语句用于给用户授权,revoke语句用于回收权限,commit语句用于事务提交,rollback语句用于事务回滚。

2. DB数据库的操作

进入数据库时我们先不着急操作,先来个求救信号help,再次熟悉一下MySQL命令。

mysql> help
List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
notee     (\t) Don't write into outfile.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.

2.1 数据库的查看

查看所有数据库。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ai                 |
| mybatis            |
| mysql              |
| onlinedb           |
| performance_schema |
| personnel          |
| shop               |
| stulist            |
| test               |
+--------------------+
10 rows in set

查看数据库中所有支持的引擎。

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set

查看 MySQL 服务器系统支持的默认存储引擎。

mysql> show variables like 'storage_engine';
+----------------+--------+
| Variable_name  | Value  |
+----------------+--------+
| storage_engine | InnoDB |
+----------------+--------+
1 row in set

查看事务相关信息。

mysql> show engine innodb status;

查看数据库中所有支持的字符集与排序规则。

mysql> show character set;

查看数据库中用户的权限。

mysql> show grants;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set

注:GRANT ALL PRIVILEGES ON * . * TO ‘root’@‘localhost’ IDENTIFIED BY PASSWORD表示赋予root用户操作数据库的所有权限,localhost表示在本地登录,identified by password表示设置登录密码。

2.2 数据库的创建

创建数据库sqltest。

mysql> create database sqltest;
Query OK, 1 row affected 

显示该数据库的默认字符集以及排序规则。

mysql> show create database sqltest;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| sqltest  | CREATE DATABASE `sqltest` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+
1 row in set

2.3 数据库的修改

将数据库sqltest的字符集修改为utf8,排序规则修改为utf_general_ci。

mysql> alter database sqltest
    -> character set utf8
    -> collate utf8_general_ci;
Query OK, 1 row affected
mysql> show create database sqltest;
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| sqltest  | CREATE DATABASE `sqltest` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set

2.4 数据库的删除

删除数据库sqltest。

mysql> drop database sqltest;
Query OK, 0 rows affected

2.5 数据库的使用

使用数据库sqltest。

mysql> use sqltest;
Database changed

3. Table表的操作

3.1 表的查看

查看所有表格。

mysql> show tables;
+-------------------+
| Tables_in_sqltest |
+-------------------+
| goods             |
| users             |
+-------------------+
2 rows in set

查看users表的结构。

mysql> describe sqltest.users;
+-------+-----------------+------+-----+---------+----------------+
| Field | Type            | Null | Key | Default | Extra          |
+-------+-----------------+------+-----+---------+----------------+
| id    | int(12)         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(32)     | NO   |     | NULL    |                |
| sex   | enum('男','女') | YES  |     ||                |
+-------+-----------------+------+-----+---------+----------------+
3 rows in set
mysql> show create table users;
| users | CREATE TABLE `users` (
  `id` int(12) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `name` varchar(32) NOT NULL,
  `sex` enum('男','女') DEFAULT '男',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
1 row in set

3.2 表的创建

创建一个users表,它有3个列,分别是id,name,sex。

mysql> create table users(
    -> id int(12) primary key auto_increment comment '用户ID',
    -> name varchar(32) not null,
    -> sex enum('男','女') default'男'
    -> );
Query OK, 0 rows affected

注:primary key auto_increment表示该字段为主键且自增,comment表示说明备注。

3.3 表的修改

3.3.1 修改表名

将users表的表名修改为user。

mysql> alter table users rename user;
Query OK, 0 rows affected
mysql> show tables;
+-------------------+
| Tables_in_sqltest |
+-------------------+
| goods             |
| user              |
+-------------------+
2 rows in set
3.3.2 修改字段(列)

将user表的字段名id修改为uid,同时修改数据类型的长度为20。

mysql> alter table user change id uid int(20);
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc user;
+-------+-----------------+------+-----+---------+-------+
| Field | Type            | Null | Key | Default | Extra |
+-------+-----------------+------+-----+---------+-------+
| uid   | int(20)         | NO   | PRI | 0       |       |
| name  | varchar(32)     | NO   |     | NULL    |       |
| sex   | enum('男','女') | YES  |     ||       |
+-------+-----------------+------+-----+---------+-------+
3 rows in set

注:在修改字段时,必须指定新字段名的数据类型,即使新字段的类型与原类型相同。

3.3.3 修改字段排列位置

将user表中的name字段与sex字段交换位置,把name调到sex的后面去。

mysql> alter table user modify name varchar(32) after sex;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc user;
+-------+-----------------+------+-----+---------+-------+
| Field | Type            | Null | Key | Default | Extra |
+-------+-----------------+------+-----+---------+-------+
| uid   | int(20)         | NO   | PRI | 0       |       |
| sex   | enum('男','女') | YES  |     ||       |
| name  | varchar(32)     | YES  |     | NULL    |       |
+-------+-----------------+------+-----+---------+-------+
3 rows in set
3.3.4 修改字段类型

将user表中的name字段类型修改为varchar(30),约束条件为not null。

mysql> alter table user modify name varchar(30) not null;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc user;
+----------+-----------------+------+-----+---------+-------+
| Field    | Type            | Null | Key | Default | Extra |
+----------+-----------------+------+-----+---------+-------+
| uid      | int(20)         | NO   | PRI | 0       |       |
| sex      | enum('男','女') | YES  |     ||       |
| name     | varchar(30)     | NO  |     | NULL    |       |
+----------+-----------------+------+-----+---------+-------+
3 rows in set

注:若只需要修改字段的类型,用modify进行修改,SQL语句为:ALTER TABLE 表名 MODIFY 字段名 新数据类型;

3.3.5 添加字段

在user表中添加password字段,数据类型为varchar(30),约束条件为not null。

mysql> alter table user add password varchar(30) not null;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc user;
+----------+-----------------+------+-----+---------+-------+
| Field    | Type            | Null | Key | Default | Extra |
+----------+-----------------+------+-----+---------+-------+
| uid      | int(20)         | NO   | PRI | 0       |       |
| sex      | enum('男','女') | YES  |     ||       |
| name     | varchar(30)     | NO  |     | NULL    |       |
| password | varchar(30)     | NO   |     | NULL    |       |
+----------+-----------------+------+-----+---------+-------+
4 rows in set

注:枚举类型enum(枚举成员1,枚举成员2,…);在C#或C++,Java等一些计算机编程语言中是一种基本数据类型而不是构造数据类型,而在C语言等计算机编程语言中是一种构造数据类型。它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。

3.3.6 删除字段

将user表中的sex字段删除。

mysql> alter table user drop sex;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc user;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| uid      | int(20)     | NO   | PRI | 0       |       |
| name     | varchar(30) | NO  |     | NULL    |       |
| password | varchar(30) | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set
3.3.7 修改表的存储引擎

将user表默认的存储引擎InnoDB修改为MyISAM。

mysql> alter table user engine=MyISAM;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
mysql> show create table user;
| user  | CREATE TABLE `user` (
  `uid` int(20) NOT NULL DEFAULT '0',
  `name` varchar(30) NOT NULL,
  `password` varchar(30) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
1 row in set

3.4 表的复制

复制user表的结构及数据到user2表。

mysql> create table user2 select * from user;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
mysql> show tables;
+-------------------+
| Tables_in_sqltest |
+-------------------+
| goods             |
| user              |
| user2             |
+-------------------+
3 rows in set

复制user表的结构到user3表。

mysql> create table user3 select * from user where false;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
mysql> show tables;
+-------------------+
| Tables_in_sqltest |
+-------------------+
| goods             |
| user              |
| user2             |
| user3             |
+-------------------+
4 rows in set

复制user表的部分字段及数据到user4表。

mysql> create table user4 as(select uid,name from user);
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| uid   | int(20)     | NO   |     | 0       |       |
| name  | varchar(30) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set

3.5 表的删除

将表user4删除。

mysql> drop table user4;
Query OK, 0 rows affected
mysql> show tables;
+-------------------+
| Tables_in_sqltest |
+-------------------+
| goods             |
| user              |
| user2             |
| user3             |
+-------------------+
4 rows in set

4. Constraint约束的操作

只有InnoDB类型的表才可以使用外键,像MyISAM这种类型不支持外键约束。

4.1 约束的创建

标识字段id为主键约束,字段name为非空约束。

mysql> create table users(
    -> id int(12) primary key auto_increment comment '用户ID',
    -> name varchar(32) not null,
    -> );
Query OK, 0 rows affected

将字段gid添加外键约束,外键名为FK_gid,关联到goods表,以及外键约束的级联更新和删除。

mysql> alter table user add
    -> constraint FK_gid foreign key(gid)
    -> references goods(gid)
    -> on update cascade on delete cascade;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
mysql> show create table user;
| user  | CREATE TABLE `user` (
  `uid` int(20) NOT NULL DEFAULT '0',
  `name` varchar(30) NOT NULL,
  `password` varchar(30) NOT NULL,
  `gid` int(12) NOT NULL,
  PRIMARY KEY (`uid`),
  KEY `FK_gid` (`gid`),
  CONSTRAINT `FK_gid` FOREIGN KEY (`gid`) REFERENCES `goods` (`gid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
1 row in set

注:CASCADE指定在更新和删除操作表中记录时,如果该值被其他表引用,则级联更新或删除从表中相应的记录。

4.2 约束的删除

删除user表中的外键约束。

mysql> alter table user drop foreign key FK_gid;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

5. Data数据的操作

5.1 数据的添加

在user表里添加张三,李四,王麻子三个用户数据。

mysql> insert into user values
    -> (10001,'张三','z123456'),
    -> (10002,'李四','lisi000'),
    -> (10003,'王麻子','wangmazi');
Query OK, 3 rows affected
Records: 3  Duplicates: 0  Warnings: 0

将user2表中uid大于10003的用户数据插入到user表中。

mysql> replace into user(uid,name,password)
    -> select uid,name,password
    -> from user2
    -> where uid>10003;
Query OK, 2 rows affected
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from user;
+-------+--------+----------+
| uid   | name   | password |
+-------+--------+----------+
| 10001 | 张三   | z123456  |
| 10002 | 李四   | lisi000  |
| 10003 | 王麻子 | wangmazi |
| 10004 | 大胖   | 6666666  |
| 10005 | 小瘦   | 8888888  |
+-------+--------+----------+
5 rows in set

将管理员小文添加到user表中,它的uid为10000,password为123。

mysql> replace into user
    -> set uid=10000,
    -> name='小文',
    -> password='123';
Query OK, 1 row affected
mysql> select * from user where name='小文';
+-------+------+----------+
| uid   | name | password |
+-------+------+----------+
| 10000 | 小文 | 123      |
+-------+------+----------+
1 row in set

注:replace和insert用法一样,都可以用来插入数据。

5.2 数据的查看

查看user表里的所有数据。

mysql> select * from user;
+-------+--------+----------+
| uid   | name   | password |
+-------+--------+----------+
| 10001 | 张三   | z123456  |
| 10002 | 李四   | lisi000  |
| 10003 | 王麻子 | wangmazi |
+-------+--------+----------+
3 rows in set

查看user2表里的所有数据。

mysql> select * from user2;
+-------+------+----------+
| uid   | name | password |
+-------+------+----------+
| 10004 | 大胖 | 6666666  |
| 10005 | 小瘦 | 8888888  |
+-------+------+----------+
2 rows in set

5.3 数据的修改

将user表中管理员小文的password修改为xiao123。

mysql> update user
    -> set password='xiao123'
    -> where name='小文';
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from user where uid='10000';
+-------+------+----------+
| uid   | name | password |
+-------+------+----------+
| 10000 | 小文 | xiao123  |
+-------+------+----------+
1 row in set

5.4 数据的删除

将user表中小瘦用户数据删除掉。

mysql> delete from user
    -> where uid='10005';
Query OK, 1 row affected
mysql> select * from user;
+-------+--------+----------+
| uid   | name   | password |
+-------+--------+----------+
| 10000 | 小文   | xiao123  |
| 10001 | 张三   | z123456  |
| 10002 | 李四   | lisi000  |
| 10003 | 王麻子 | wangmazi |
| 10004 | 大胖   | 6666666  |
+-------+--------+----------+
5 rows in set

删除user2表中的所有数据。

mysql> truncate user2;
Query OK, 0 rows affected
mysql> select * from user2;
Empty set

——>以上内容是关于SQL语言的基础知识,希望对初学者或再次学习者有所帮助,基础打扎实,不怕风吹雨打! 如果以上内容有错误或者内容不全,望大家提出!我也会继续写好每一篇博文!

待续未完
——文优

欢迎观看和提问!!!

下一篇:SQL数据查询(MySQL入门)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文优

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值