MySQL初学
数据库:服务器(存数据)+客户端(连接服务器,操作数据)
- 数据库是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放,是有一定的规则的,否则查询的效率会很低。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。即这个互联网世界就是数据世界。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。
数据库是一个按数据结构来存储和管理数据的计算机软件系统。数据库的概念实际包括两层意思:- 数据库是一个实体,它是能够合理保管数据的“仓库”,用户在该“仓库”中存放要管理的事务数据,“数据”和“库”两个概念结合成为数据库。
- 数据库是数据管理的新方法和技术,它能更合适的组织数据、更方便的维护数据、更严密的控制数据和更有效的利用数据。
MySQL服务开启、关闭
- Windows服务方式启动:
-
DOS命令方式启动:
以管理员身份运行命令提示符
net start mysql80 # 启动MySQL服务,mysql80 是MySQL服务名
net stop mysql80 # 关闭MySQL服务
控制台连接数据库
MySQL 是⼀个需要账户名密码登录的数据库,登陆后使⽤,它提供了⼀个默认的 root 账号,使 ⽤安装时设置的密码即可登录。或者使⽤MySQL安装时添加的账号和密码登录。
登录格式:
mysql -u⽤户名 -p密码
例:
mysql -uroot -p123456
mysql -hIP地址 -u⽤户名 -p密码
例:
mysql -h127.0.0.1 -uroot -p123456
mysql --host=IP地址 --user=⽤户名 --password=密码
例:
mysql --h=127.0.0.1 --u=root --p=123456
quit或exit # 退出MySQL
数据库管理系统
数据库管理系统(DataBase Management System,DBMS):指⼀种操作和管理数据库的⼤ 型软件,⽤于建⽴、使⽤和维护数据库,对数据库进⾏统⼀管理和控制,以保证数据库的安全性 和完整性。⽤户通过数据库管理系统访问数据库中表内的数据
SQL的概念
Structured Query Language 结构化查询语⾔
作用
- 是⼀种所有关系型数据库的查询规范,不同的数据库都⽀持。
- 通⽤的数据库操作语⾔,可以⽤在不同的数据库中。
- 不同的数据库 SQL 语句有⼀些区别 – 称为“⽅⾔”。
SQL语句分类
- Data Definition Language (DDL 数据定义语⾔), 如:建库,建表
- Data Manipulation Language(DML 数据操纵语⾔),如:对表中的记录操作增删改 (可通过事务操作撤销)
- Data Query Language(DQL 数据查询语⾔),如:对表中的查询操作
- Data Control Language(DCL 数据控制语⾔),如:对⽤户权限的设置
DDL操作数据库
创建数据库的几种方法:
- 创建数据库:
CREATE DATABASE 数据库名;
- 判断数据库是否已经存在,不存在则创建数据库:
CREATE DATABASE IF NOT EXISTS 数据库名;
- 创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
具体操作
-- 直接创建数据库
create database db1;
-- 判断是否存在,如果不存在则创建数据库
create database if not exists db2;
-- 创建数据库并指定字符集为 gbk
create database db3 default character set gbk;
查看数据库
-- 查看所有的数据库
show databases;
-- 查看某个数据库的定义信息
show create database db3;
show create database db1;
修改数据库
- 修改数据库默认的字集符
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;
- 具体操作
-- 将db3数据库的字符集改成utf8
alter database db3 character set utf8;
删除数据库
- 删除数据库的语法
DROP DATABASE 数据库名;
- 具体操作
-- 删除db2数据库
drop database db2;
使用数据库
- 查看正在使用的数据库
SELECT DATABASE(); # 使⽤的⼀个mysql中的全局函数
- 使⽤/切换数据库
USE 数据库名;
- 具体操作
-- 查看正在使⽤的数据库
select database();
-- 改变要使⽤的数据库
use db4;
DDL操作表结构
- 创建表的格式
CREATE TABLE 表名 (
字段名 1 字段类型 1,
字段名 2 字段类型 2
);
创建表的关键字 | 说明 |
---|---|
CREATE | 创建 |
TABLE | 表 |
查看表
SHOW TABLE; --查看某个数据库中的所有表
DESC 表名; --查看表结构
SHOW CREATE TABLE 表名; --查看创建表的SQL语句
快速创建⼀个表结构相同的表
CREATE TABLE 新表名 LIKE 旧表名; --语法
-- 创建s1表,s1表结构和student表结构相同
create table s1 like student;
desc s1;
删除表
DROP TABLE 表名; --直接删除表
DROP TABLE IF EXISTS 表名; --判断表是否存在,如果存在则删除表
-- 直接删除表 s1 表
drop table s1;
-- 判断表是否存在并删除 s1 表
drop table if exists `create`;
修改表结构
ALTER TABLE 表名 ADD 列名 类型; --添加表列
-- 为学⽣表添加⼀个新的字段remark,类型为varchar(20)
alter table student add remark varchar(20);
ALTER TABLE 表名 MODIFY 列名 新的类型; --修改列类型MODIFY
-- 将student表中的remark字段的改成varchar(100)
alter table student modify remark varchar(100);
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型; --修改列名 CHANGE
-- 将student表中的remark字段名改成intro,类型varchar(30)
alter table student change remark intro varchar(30);
ALTER TABLE 表名 DROP 列名; --删除列 DROP
-- 删除student表中的字段intro
alter table student change remark intro varchar(30);
RENAME TABLE 表名 TO 新表名; --修改表名
-- 将学⽣表student改名成student2
rename table student to student2;
ALTER TABLE 表名 character set 字符集; --修改字符集 character set
-- 将student2表的编码修改成gbk
alter table student2 character set gbk;
DML操作表中的数据
用于对表中的记录进行增删改操作
插入记录
INSERT [INTO] 表名 [字段名] VALUES (字段值);
# INSERT INTO 表名:表示往哪张表中添加数据
# (字段名 1, 字段名 2, ...):要给哪些字段设置值
# VALUES (值 1, 值 2, ...):设置具体的值
插⼊全部字段
-- 所有的字段名都写出来
INSERT INTO 表名 (字段名 1, 字段名 2, 字段名 3...) VALUES (值 1, 值 2, 值 3);
-- 不写字段名
INSERT INTO 表名 VALUES (值 1, 值 2, 值 3...);
插⼊部分数据
INSERT INTO 表名 (字段名 1, 字段名 2, ...) VALUES (值 1, 值 2, ...);
insert into student (id,name,age,sex) values (1, '孙悟空', 20, '男');
insert into student (id,name,age,sex) values (2, '孙悟天', 16, '男');
-- 插⼊所有列
insert into student values (3, '孙悟饭', 18, '男', '⻳仙⼈洞中');
-- 如果只插⼊部分列,必须写列名
insert into student values (3, '孙悟饭', 18, '男');
select * from student;
更新表记录
UPDATE 表名 SET 列名=值 [WHERE 条件表达式]
# UPDATE: 需要更新的表名
# SET: 修改的列值
# WHERE: 符合条件的记录才更新
# 你可以同时更新⼀个或多个字段。
# 你可以在 WHERE ⼦句中指定任何条件。
- 不带条件修改数据
UPDATE 表名 SET 字段名=值; -- 修改所有的⾏
-- 不带条件修改数据,将所有的性别改成⼥
update student set sex = '⼥';
- 待条件修改数据
UPDATE 表名 SET 字段名=值 WHERE 字段名=值;
-- 带条件修改数据,将 id 号为 2 的学⽣性别改成男
update student set sex='男' where id=2;
-- ⼀次修改多个列,把 id 为 3 的学⽣,年龄改成 26 岁,address 改成北京
update student set age=26, address='北京' where id=3;
若不能修改则需要修改数据库安全模式
SET SQL_SAFE_UPDATES = 0;
删除表记录
DELETE FROM 表名 [WHERE 条件表达式]
# 如果没有指定 WHERE ⼦句,MySQL 表中的所有记录将被删除。
# 你可以在 WHERE ⼦句中指定任何条件
- 无条件删除
DELETE FROM 表名;
-- 不带条件删除数据,删除表中的所有数据
delete from student;
- 带条件删除
DELETE FROM 表名 WHERE 字段名=值
-- 带条件删除数据,删除 id 为 1 的记录
delete from student where id=1;
- 使用truncate删除表中所有记录
TRUNCATE TABLE 表名;
- truncate和delete的区别
- truncate 相当于删除表的结构,再创建⼀张表。
DQL查询表中的数据
查询不会对数据库中的数据进⾏修改,只是⼀种显示数据的⽅式。
SELECT 列名 FROM 表名 [WHERE 条件表达式]
# 1) SELECT 命令可以读取⼀⾏或者多⾏记录。
# 2) 你可以使⽤星号(*)来代替其他字段,SELECT 语句会返回表的所有字段数据
# 3) 你可以使⽤ WHERE 语句来包含任何条件。
简单查询
- 查询表所有行和列的数据
-- 使⽤*表示所有列
SELECT * FROM 表名;
-- 查询所有的学⽣
select * from student;
- 查询指定列
-- 查询指定列的数据, 多个列之间以逗号分隔
SELECT 字段名 1, 字段名 2, 字段名 3, ... FROM 表名;
-- 查询 student 表中的 name 和 age 列
select name,age from student;
指定列的别名进⾏查询
- 使⽤关键字
- 使⽤别名的好处:显示的时候使⽤新的名字,并不修改表的结构。
- 语法
-- 对列指定别名
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名;
-- 使⽤别名
select name as 姓名, age as 年龄 from student;
-- 对列和表同时指定别名
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名 AS 表别名;
-- 表使⽤别名
select st.name as 姓名, age as 年龄 from student as st;
清除重复值
- 查询指定列并且结果不出现重复数据
SELECT DISTINCT 字段名 FROM 表名;
-- 查询学⽣来⾄于哪些地⽅
select address from student;
-- 去掉重复的记录
select distinct address from student;
查询结果参与运算
- 某列数据和固定值运算
SELECT 列名 1 + 固定值 FROM 表名;
- 某列数据和其他列数据参与运算
SELECT 列名 1 + 列名 2 FROM 表名;
- 实例
/* 需求:
准备数据: 添加数, 英语成绩列, 给每条记录添加对应的数学和英语成绩.
查询的时候将数学和英语的成绩相加
*/
select * from student;
-- 给所有的数学加 5 分
select math + 5 from student;
-- 查询 math + english 的和
select * from student;
select *, (math+english) as 总成绩 from student;
-- as 可以省略
select *, (math+english) 总成绩 from student;
条件查询
- 为什么要条件查询
- 如果没有查询条件,则每次查询所有的⾏。实际应⽤中,⼀般要指定查询的条件,对记录进 ⾏过滤。
- 条件查询的语法
SELECT 字段名 FROM 表名 WHERE 条件;
# 流程: 取出表中的每条数据,满⾜条件的记录就返回,不满⾜条件的记录不返回
- 逻辑运算符
逻辑运算符 | 说明 |
---|---|
and 或 && | 与,SQL 中建议使⽤前者,后者并不通⽤。 |
or 或 || | 或 |
not 或 ! | ⾮ |
- 实例:
-- 查询 age ⼤于 35 且性别为男的学⽣(两个条件同时满⾜)
select * from student where age > 35 and sex = '男';
-- 查询 age ⼤于 35 或性别为男的学⽣(两个条件其中⼀个满⾜)
select * from student where age > 35 or sex = '男';
-- 查询id是1或3或5的学⽣
select * from student where id = 1 or id = 3 or id = 5;
-- 查询 english 成绩⼤于等于 75,且⼩于等于 90 的学⽣
select * from student where english between 75 and 90;
-- LIKE 表示模糊查询
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
SELECT 字段名 FROM 表名 WHERE 字段 in (数据 1, 数据 2...);
-- in ⾥⾯的每个数据都会作为⼀次条件,只要满⾜条件的就会显示
-- 查询id是1或3或5的学⽣
select * from student where id in(1, 3, 5);
-- 查询id不是1或3或5的学⽣
select * from student where id not in(1, 3, 5);
- MySQL通配符
通配符 | 说明 |
---|---|
% | 匹配任意多个字符串 |
_ | 匹配⼀个字符 |
- 实例:
-- 查询姓⻢的学⽣
select * from student where name like '⻢%';
select * from student where name like '⻢';
-- 查询姓名中包含'德'字的学⽣
select * from student where name like '%德%';
-- 查询姓⻢,且姓名有两个字的学⽣
select * from student where name like '⻢_';
- 查询id是1或3或5的学⽣
select * from student where id in(1, 3, 5);
- 查询id不是1或3或5的学⽣
select * from student where id not in(1, 3, 5);
- MySQL通配符
通配符 | 说明 |
---|---|
% | 匹配任意多个字符串 |
_ | 匹配⼀个字符 |
- 实例:
-- 查询姓⻢的学⽣
select * from student where name like '⻢%';
select * from student where name like '⻢';
-- 查询姓名中包含'德'字的学⽣
select * from student where name like '%德%';
-- 查询姓⻢,且姓名有两个字的学⽣
select * from student where name like '⻢_';