SQL DML 和 DDL
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
查询和更新指令构成了 SQL 的 DML 部分:
SELECT - 从数据库表中获取数据
UPDATE - 更新数据库表中的数据
DELETE - 从数据库表中删除数据
INSERT INTO - 向数据库表中插入数据
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
数据库发展史
文件系统-》层次模型-》网状模型-》关系型数据库
优点:解决了导航的问题、数据完整性得到了解决
缺点:多表查询效率低
解决方法:使用NOSQL(非关系型数据库,Redis、mongodb等等),在数据库中按照键值对来存储。
SQL
结构化查询语言,标准SQL,也叫SQL-92
access 微软 SQL
SQL Server 微软 T-SQL
Oracle 甲骨文 PL/SQL
MySQL 被甲骨文收购 MySQL
windows 服务开启
win+R services.msc 打开服务面板
net start 查看已经开启的服务
net start mysql
启动服务net stop mysql
关闭服务
MySQL客户端连接服务器
安装文件目录下的:MySQL 5.5 Command Line Client
navicat 客户端
PHPmyadmin 客户端
设置环境变量后:mysql -hlocalhost -uroot -proot -P3306
(如果MySQL服务器在本地,IP地址可以省略;如果MySQL服务器用的是3306端口,-P也是可以省略的)
退出登录
exit;
quit;
\q;
MySQL中的命令后面要加分号,windows命令行的命令后面不用加分号
数据库基本概念
数据库:数据库中存放的是表,一个数据库中可以存放多个表
表:用来存放数据
关系:两个表的公共字段
行:记录,也是实体
列:字段,也是属性
表结构 行 列
表数据 记录 字段
面向对象 实体 属性
表的冗余只能减少,不能杜绝
数据完整性:正确的数据类型,准确的数据范围
数据库操作
连接数据库
Mac xampp :$ /Applications/XAMPP/xamppfiles/bin/mysql -hlocalhost -uroot -p -P3306
密码初始为空;
创建数据库
语法:create database [if not exists] 数据名
1 | mysql> create database if not exists uiste; |
问题一:
如果创建的数据库已存在,就会报错
解决:创建数据库的时候判断一下数据库是否存在,如果不存在再创建
问题二:
如果数据库名是关键字和特殊字符要报错
解决:在特殊字符、关键字行加上反引号create database `$@%`;
为了创建数据库时万无一失,我们可以在所有的数据库名上加上反引号
MySQL数据库的目录
数据库文件保存的路径在安装MySQL的时候就配置好。
也可以在my.ini
配置文件中更改
1 | #Path to the database root |
Mac xampp 数据库文件夹:/Applications /XAMPP/xamppfiles/var/mysql
创建一个数据库,就对应一个文件夹,在文件夹中有一个db.opt文件。在此文件中设置数据库的字符集和校对集
1 | default-character-set = utf8 |
显示所有数据库【show databases】
1 | mysql> show databases; |
information_schema:存储了MySQL服务器管理数据库的信息。比如:数据库名、表、字段名、数据类型及访问权限等等
performance_schema:MySQL5.5新增的表,用来保存数据库服务器性能的参数
mysql:MySQL系统数据库,保存的登录用户名,密码,以及每个用户的权限等等
test:给用户学习和测试的数据库。
删除数据库
语法:drop database [if exists] `数据库名`
1 | mysql> drop database if exists uiste; |
问题:
如果删除的数据库不存在,会报错
解决:删除之前判断一下,如果存在就删除
显示创建数据库的语句
语法:show create database 数据库名
1 | mysql> show create database uiste; |
修改数据库字符编码
语法:alter database `数据库名` charset=字符编码
1 | mysql> alter database uiste charset=utf8; |
选择数据库
语法:use `数据库名
1 | mysql> use uiste; |
表的操作
创建表
1 | create table [if not exists] `表名`( |
表名和字段名如果用了关键字,要用反引号引起来。
创建简单的表
1 | mysql> create table student( |
创建复杂的表
1 | mysql> create table `goods`( |
create table 数据库名.表名,用于给指定的数据库创建表
1 | mysql> create table uiste.teacher( |
数据表文件
- 一个数据库对应一个文件夹
- 一个表对应一个或多个文件夹
引擎是myisam,一个表对应三个文件(不支持外键约束)t1.frm 表结构
t1.MYD 表数据
t1.MYI 表索引
引擎是innodb,一个表对应一个表结构文件
所有的innodb引擎的数据统一的存放在data\ibdata1文件中。如果数据量很大,MySQL会自动的创建ibdata2,ibdata3,…,目的就是为了便于管理。
constraint:约束
显示所有表
语法:show tables;
1 | mysql> show tables; |
显示创建表的语句
语法:show create table `表名`
1 | mysql> show create table student; |
将两个字段竖着排列
语法:show create table `表名`\G
1 | mysql> show create table student \G |
查看表结构
语法:desc[ribe] `表名`
1 | mysql> desc student; |
desc 是 describe 的简写
复制表
语法一:create table 新表 select 字段 from 旧表
1 | mysql> create table student2 select * from student; |
特点:不能复制父表的键,能够复制父表的数据
语法二:create table 新表 like 旧表
1 | mysql> create table student3 like student; |
特点:只能复制表结构,不能复制表数据
删除表
语法:drop table [if exists] 表1,表2,…
1 | mysql> drop table if exists student2; |
如果删除一个不存在的表就会报错,删除的时候可以判断一下,存在就删除
可以一次删除多个表
1 | mysql> drop tables if exists student2,student3; |
修改表
语法:alter table 表名
添加字段
语法:alter table 表名add [column] 字段名 数据类型 [位置]
1 | mysql> alter table student add age int(8) after name; |
默认字段放在表的最后
添加first
字段放在表的第一位
添加after name
放在 name 字段之后
删除字段
语法:alter table 表 drop [column] 字段名
1 | mysql> alter table student drop age; |
修改字段(改名)
语法:alter table 表 change [column] 原字段名 新字段名 数据类型 …
1 | mysql> alter table student change sex age int(8); |
同时修改多个字段
1 | mysql> alter table student change age myage int(8) comment '我的学生年龄',change name myname varchar(16) not null comment '我的学生姓名'; |
修改字段(不改名)
语法:alter table 表 modify 字段名 字段属性…
1 | mysql> alter table student modify myage int(3) not null default 18 comment '如果你没 有设置年龄,我就是永远的18岁'; |
只更改字段属性
修改引擎
语法:alter table 表名 engine=引擎名
1 | mysql> alter table student engine=myisam; |
修改表名
语法:alter table 表名 rename to 新表名
1 | mysql> alter table student rename to student2; |
将表移动到其他数据库
语法:alter table 表名 rename to 数据库名.数据表名
1 | alter table student2 rename to test.student3; |
数据操作
插入数据
语法:insert into 表名 (字段名, 字段名,…) values (值1, 值1,…)
- 插入一条数据
1 | mysql> insert into student (id,name,age) values (1,'小兰',25); |
- 插入字段名的顺序和数据库字段名的顺序可以不一致
- 插入值的个数、顺序必须和插入字段名的个数、顺序要一致
- 简写方式:
1 | mysql> insert into student values (2,'杜总',24); |
- 自动增长列,可以直接插入null。
- 插入默认值和空值
1 | mysql> insert into student values (null,'张宝',null); |
自动增长列,可以直接插入null
default关键字用来插入默认值,null用来插入空值
- 插入多条数据
1 | mysql> insert into student values (null,'小张',18),(null,'圆哥',18); |
- 使用insert…set…插入数据
1 | mysql> insert into student set name='赵哥',age=54; |
更新数据
语法:update 表名 set 字段=值 [where 条件] [order by 排序] [limit 限制]
- 将id为三的年龄改为30
1 | mysql> update student set age=30 where id=3; |
需要更改多个内容的时候将需要变更的内容用逗号连接;
- 将id 从大到小数前3名的学生年龄改为16岁
1 | mysql> update student set age=16 order by id desc limit 3; |
删除数据
语法:delete from 表名 [where 条件] [order by 排序] [limit 限制]
1 | mysql> delete from student where id=9; |
删除id <=7;
1 | mysql> delete from student where id<=7; |
清空表
1 | mysql> delete from student; |
清空表:truncate table 表名
1 | mysql> truncate table student; |
delete from 表和truncate table 表区别?
delete from 表:遍历表记录,一条一条的删除
truncate table:将原表销毁,再创建一个同结构的新表。就清空表而言,这种方法效率高。
字符集
字符集:字符在保存和传输时对应的二进制编码集合
数据存储时使用字符集
MySQL可以在服务器上、数据库、表、字段上设置字符集
脚下留心:一般在数据库和表上设置字符集,每个字段设置字符集太麻烦。
数据传输时使用字符集
发现:在插入数据的时候,如果有中文会报错
1 | mysql> insert into student values (null,'李白'); |
分析:客户端编码和服务器连接层编码必须一致,如果不一致就会报错。
查看客户端的字符编码
客户端发送某种编码给服务器,由客户端决定
客户端编码不能改变
客户端右键——属性——选项——可以查看当前客户端的字符编码(GBK)
查看服务器的字符编码
1 | mysql> show variables like 'character_set_%'; |
解决:只要将服务器的编码设置成gbk就可以解决
测试:插入中文
查询:插入中文
原因:结果返回的是utf8,客户端用gbk来解析,所以乱码
解决:服务器按gbk返回即可
1 | mysql>set character_set_results=gbk; |
查询:结果
总结:客户端编码、
character_set_client
、character_set_results
三个编码的值一致即可操作中文。
多学一招:我们只要设置“set names 字符编码”
,就可以更改character_set_client
、character_set_results
的值。
查看所有字符集
1 |
|
校对集
在某种特定的字符集下,字符和字符的大小关系。比如a和B的大小关系:如果不区分大小写a<B;如果区分大小写a>B。
脚下留心:不同的校对集他们的比较结果是不一样的
语法:collate=校对集
创建两个表
1 | create table stu1( |
测试
1 | mysql> select * from stu1 order by name; |
校对集的规则:
1、_bin:按二进制编码进行比较
2、_ci:不区分大小写进行比较
查看所有的校对集
1 | mysql> show collation; |