我下面所有的SQL语句是基于MySQL 5.6+运行。
MySQL 为关系型数据库(Relational Database Management System),一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:
表头(header)
: 每一列的名称;列(col)
: 具有相同数据类型的数据的集合;行(row)
: 每一行用来描述某个人/物的具体信息;值(value)
: 行的具体信息, 每个值必须与该列的数据类型相同;键(key)
: 表中用来识别某个特定的人\物的方法, 键的值在当前列中具有唯一性。
登录MySQL
mysql -h 127.0.0.1 -u <用户名> -p<密码>. # 默认用户名<root>,-p 是密码,⚠️参数后面不需要空格
mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p
mysql> exit # 退出 使用 “quit;” 或 “\q;” 一样的效果
mysql> status; # 显示当前mysql的version的各种信息
mysql> select version(); # 显示当前mysql的version信息
mysql> show global variables like 'port'; # 查看MySQL端口号
创建数据库
对于表的操作需要先进入库use 库名;
-- 创建一个名为 samp_db 的数据库,数据库字符编码指定为 gbk
create database samp_db character set gbk;
drop database samp_db; # 删除 库名为 samp_db 的库
show databases; # 显示数据库列表。
se samp_db; # 选择创建的数据库
samp_db show tables; # 显示 samp_db 下面所有的表名字
describe 表名; # 显示数据表的结构
delete from 表名; # 清空表中记录
创建数据库表
CREATE TABLE 语法
语句用于从表中选取数据。
CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... );
# 如果数据库中存在user_accounts表,就把它从数据库中drop掉
DROP TABLE IF EXISTS `user_accounts`;
CREATE TABLE `user_accounts` (
`id` int(100) unsigned NOT NULL AUTO_INCREMENT primary key,
`password` varchar(32) NOT NULL DEFAULT '' COMMENT '用户密码',
`reset_password` tinyint(32) NOT NULL DEFAULT 0 COMMENT '用户类型:0-不需要重置密码;1-需要重置密码',
`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机',
`create_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`update_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
-- 创建唯一索引,不允许重复
UNIQUE INDEX idx_user_mobile(`mobile`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
COMMENT='用户表信息';
数据类型的属性解释
NULL
:数据列可包含NULL值;NOT NULL
:数据列不允许包含NULL值;DEFAULT
:默认值;PRIMARY KEY
:主键;AUTO_INCREMENT
:自动递增,适用于整数类型;UNSIGNED
:是指数值类型只能为正数;CHARACTER SET name
:指定一个字符集;COMMENT
:对表或者字段说明;
删除数据库表
DROP/TRUNCATE TABLE 语法
语句用于删除数据库中的现有表。
DROP TABLE 表名称; -- 用于删除数据库中的现有表。
TRUNCATE TABLE 表名称; -- 用于删除表内的数据,但不删除表本身。
-- 删除现有表 Shippers:
DROP TABLE Shippers;
-- 删除现有表 Shippers 表内的数据,不删除表:
TRUNCATE TABLE Shippers;
增删改查
SELECT
SELECT 语法
语句用于从表中选取数据。
SELECT 列名称1, 列名称2, ... FROM 表名称;
SELECT * FROM 表名称;
-- 从 Customers 表中选择 CustomerName 和 City 列:
SELECT CustomerName, City FROM Customers;
-- 从 Customers 表中选择所有列:
SELECT * FROM Customers;
-- 表 station 取个别名叫 s,表 station 中不包含 字段 id=13 或者 14 的,并且 id 不等于 4 的 查询出来,只显示 id
SELECT s.id from station s WHERE id in (13,14) and id not in (4);
-- 从表 users 选取 id=3 的数据,并只拉一条数据(据说能优化性能)
SELECT * FROM users where id=3 limit 1
-- 结果集中会自动去重复数据
SELECT DISTINCT Company FROM Orders
-- 表 Persons 字段 Id_P 等于 Orders 字段 Id_P 的值,
-- 结果集显示 Persons表的 LastName、FirstName字段,Orders表的OrderNo字段
SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p, Orders o WHERE p.Id_P = o.Id_P
-- gbk 和 utf8 中英文混合排序最简单的办法
-- ci是 case insensitive, 即 “大小写不敏感”
SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using gbk) collate gbk_chinese_ci;
SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using utf8) collate utf8_unicode_ci;
UPDATE
Update 语法
语句用于修改表中的数据。
UPDATE 表名称 SET 列名称1 = 值1, 列名称2 = 值2, ... WHERE 条件;
-- update语句设置字段值为另一个结果取出来的字段
UPDATE user set name = (SELECT name from user1 WHERE user1 .id = 1 )
WHERE id = (SELECT id from user2 WHERE user2 .name='小苏');
-- 更新表 orders 中 id=1 的那一行数据更新它的 title 字段
UPDATE `orders` set title='这里是标题' WHERE id=1;
INSERT
INSERT 语法
用于向表格中插入新的行。
INSERT INTO 表名称 (列名称1, 列名称2, 列名称3, ...) VALUES (值1, 值2, 值3, ...);
INSERT INTO 表名称 VALUES (值1, 值2, 值3, ...);
DELETE
DELETE 语法
语句用于删除表中的现有记录。
DELETE FROM 表名称 WHERE 条件;
-- 在不删除table_name表的情况下删除所有的行,清空表。
DELETE FROM table_name
-- 或者
DELETE * FROM table_name
-- 删除 Person 表字段 LastName = 'JSLite'
DELETE FROM Person WHERE LastName = 'JSLite'
-- 删除 表meeting id 为2和3的两条数据
DELETE from meeting where id in (2,3);
WHERE
WHERE 语法
用于仅提取满足指定条件的记录
SELECT 列名称, 列名称, ... FROM 表名称 WHERE 条件1;