目录

1.认识数据库

2.关系型数据库及关键字

3.SQL

4.MySQL

5.基本操作

        SQL基本操作

        mysql基本操作

6.库操作

        mysql操作

7.表操作:

8.数据操作:

9.中文数据的问题(在cmd中)

10.校对集:

11.web乱码问题

12.数据库的范式

使用drop和delete 的区别


1.认识数据库

  1. 什么是数据库?
    • database,存储数据的仓库。
    • 能够高效的存储和处理数据的介质。(磁盘,内存)
  2. 数据库的分类:
        基于存储介质不同:关系型数据库(SQL)和非关系型数据库(NoSQL:not only SQL)
  3. 数据库产品:
    • 关系型数据库
      • 大型:Oracle,DB2
      • 中型:SQL-SERVER,Mysql
      • 小型:access等
    • 非关系型数据库:
      memcached,mongodb,Redis
  4. 关系型数据库和非关系型数据库的区别:
    关系型数据库:安全(保存磁盘基本不可能丢失),容易理解,比较浪费空间(二维表)
    非关系型数据库:效率,但是不够安全(丢失断电)

2.关系型数据库及关键字

  1. 什么是关系型数据库?
        建立在关系模型上(数学模型)的数据库。
  2. 关系模型:建立在关系上的模型。
       关系模型包括三个方面:
    • 数据结构:数据存储的问题,二维表(有行和列)
    • 操作指令:所有SQL语句
    • 完整性约束:表内数据约束(字段与字段),表与表之间的约束(外键)
  3. 关系型数据库的设计:
        从需要存储的数据需求中分析,如果是一类数据(实体)应该设计成一张二维表。
    :表由表头(字段名:规定数据的名字)和数据部分(存储数据的单元)组成。
  4. 关键字说明:
    数据库:database(DB)
    数据库系统:DBS(Database System):是一种虚拟系统,将多种内容关联起来称呼
    DBS=DBMS+DB
    DBMS:Database Management System:数据库管理系统,专门管理数据库
    DBA:Database Administator,数据库管理员= - =
    行/记录(row/record):本质是一个东西,指的都是表中的一行,行是从结构角度出发,记录是从数据角度出发。
    列/字段(column/field):本质都是数据库中的一列数据

3.SQL

  1. SQL:Structed Query Language,结构化查询语言(数据以查询为主:99%是在进行查询操作)
  2. SQL分为三个部分:
    • DDL:Date Definiton Language,数据定义语言用来维护存储数据的结构(数据库,表)
      代表指令:creat,drop,alter
    • DML:Data Maniplation Language,数据操作语言,用来对数据进行操作(数据表中的内容),代表指令:insert,delete,update等。其中DML内部又单独进行了一个分类:
      —DQL:Data Query Language,数据查询语言,如select
      —DCL:Data Control Language,数据库控制语言,主要负责管理权限(用户),代表指令:grank,revoke等。
  3. SQL是关系型数据库的操作指令,SQL是一种约束(类似W3C),不同的数据库产品(如Orcal,mysql)内部会有一些细微差别。

4.MySQL

  1. MySQL是一种c/s结构的软件:客户端/服务器,若想访问服务器必须通过客户端(服务器一直运行,客户端在需要的时候运行)
  2. MySQL的安装与配置:
    1. Windows安装MySQL服务

    2. 下载MySQL安装包(windows):mysql-installer**5.7.**.msi

    3. 双击、按照教程安装即可  MySQL 安装 | 菜鸟教程

      1. 【最好安装MSI版本,不要安装解压包,你自己不会调。】
    4. 交互方式:
          –1.客户端连接认证,连接服务器。
      开启服务:mysqld --consolenet start mysql
      root用户登录:mysql -u root -p
          –2.发送SQL
          –3.服务器接收SQL指令,处理SQL指令,返回操作结果
          –4.客户端接收结果,显示结果
      show databases;(注意分号)

      –5.断开连接(释放资源,服务器并发限制)
      exit,quit\q
  3. Mysql服务器对象:
    将Mysql服务器内部对象分成了四层:
    系统(DBMS)>数据库(DB)>数据表(Table)>字段(field)
    windows>mysqld.exe>DB>Table>filed
  4. MySQL特点:
    1. 关系型数据库,关系型数据库的特点

    2. 数据是以行和列的形式去存储的

    3. 这一系列的行和列称为表

    4. 表中的每一行叫一条记录

    5. 表中的每一列叫一个字段

    6. 表和表之间的逻辑关联叫关系


5.基本操作

        SQL基本操作

  1. 基本操作:CRUD
    按操作对象进行分类,分为三类:库操作,表操作,数据操作
  2. 在cmd中注释
    -- 注释,也可以用#

        mysql基本操作

启动和连接MySQL服务

1. 服务端启动

  查看MySQL服务状态:sudo /etc/init.d/mysql status   

        停止、启动、重启MySQL服务:sudo /etc/init.d/mysql stop | start | restart

2. 客户端连接

   mysql -h主机地址 -u用户名 -p密码    mysql -hlocalhost -uroot -p123456   

          本地连接可以省略 -h 选项   mysql -u用户名 -p密码    mysql -uroot -p123456

3.  退出

  exit 或者 ctrl+Z 或者 ctrl+D

基本SQL命令

  每条SQL命令必须以分号结尾, SQL命令关键字不区分字母大小写, 使用 \c 来终止命令的执行 (Linux中 ctrl + c), 所有的数据都是以文件的形式存放在数据库目录下, 数据库目录:/var/lib/mysql


6.库操作

  1. 创建数据库:
    • 基本语法:
      Create database 数据库名字 [库选项];
      库选项:用来约束数据库,分为两个选项:
      –1.字符集设置:charset/character set 具体字符集(数据存储的编码格式),常用GBK,UTF8
      –2.校对集:collation 集体校对集(数据比较的规则)

      标准写法:
      CREATE DATABASE test
      CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
      
      或者:
      CREATE DATABASE test
      CHARSET 'utf8' COLLATE 'utf8_general_ci';
      
    • 注意:
      实测:一定要带上字符集与校对集一起,否则会报错
      数据库的名字不能使用关键字或保留字,如果非要使用,那么必须用反引号:
      create database `database` charset 'utf8';
      
      中文名数据库是可以的,但是要要保证服务器能识别字符集,建议别用。
      create database 中国 charset 'utf8';
      create database `中国` charset 'utf8';
      

      解决方案:在创建前提示字符集。(set names gbk)
      set names gbk;
      creat database 中国 charset 'utf8' ...;
      
    • 创建数据库的SQL语句执行之后发生了什么:
      1.在数据库系统中,增加了对应的数据库信息。
      2.会在保存数据的文件下:Data目录创建一个对应数据库名字的文件夹。但是中文数据库在此时会乱码,所以不推荐。
      3.每个数据库下都有一个opt文件,保存了库选项。(字符集,校对集)
  2. 查看数据库:
    • 查看所有数据库:
      show databases;
      
    • 查看指定部分数据库:模糊查询
      show databases like 'pattern';
      
      pattern:匹配模式
      _:匹配单个字符
      %:匹配多个字符

       
    • 查看数据库的创建语句:
      show create database 数据库名字;
      
      若出现错误,检查一下是否是拼写错误。
  3. 更新数据库(修改):
    数据库名字:不可修改(不安全)
    数据库修改仅限库选项和字符集。
    Alter database dbname [库选项];
    Charset/character set [=] 字符集
    Collate [=] 校对集
    
    修改数据库test字符集为GBK:
    Alter database test charset GBK;
    
    修改后校对集也会跟着改变。
    一旦数据库里有数据后最好不要修改。指定为UTF8就行。
  4. 删除数据库(所有操作的删除最简单)
    结构的操作属于DDL:
    dorp database dbname;
    
    删除test02数据库:
    drop database test02;
    

    –看不到数据库文件了
    –数据库内部表全部删除
    不要随意删除,需先备份后操作,删除不可逆。

        mysql操作

1.MySQL连接

使用mysql二进制的方式连接

[root@host]# mysql -u root -p
Enter password:******

2.MySQL创建数据库

创建数据库的命令:

CREATE DATABASE 数据库名;
​
mysql> create DATABASE 数据库名;

3.MySQL删除数据库

drop database <数据库名>;
​
mysql> drop database 数据库名;

4.关于数据库

#显示数据库
show databases;
#显示数据表
show tables;
#选择数据库
use examples;

6.对表的操作

①给指定列添加数据

insert into  表名 (列名1,列名2.....) values(数据1,数据2.....);
​

②给全部列添加数据

insert into 表名 values(数据1,数据2,.......);
//所有列都有数据,并且一一对应

③批量添加数据

 insert into  表名 (列名1,列名2.....) values(数据1,数据2.....),(数据1,数据2....)........;
 insert into  表名 values(数据1,数据2,.......),(数据1,数据2,.......),(数据1,数据2,.......).....;

④修改数据

update 表名 set 列名1 = 值1,列名2 = 值2,.....[where 条件];

⑤删除数据

delete from 表名 [where条件];

⑥查询数据

select * from 表名;
​
select
        字段列表
from
        表名列表
where
        条件列表
 group by 
        分组字段
 having
        分组之后的条件
 order by
        排序
 limit
        分页限定

⑦查询全部

​
查询全部表数据
select * from 表名;
查询某些字段
select 字段1,字段2.....from 表名;
去除重复
select distinct 字段1,字段2,.....from 表名;
四则计算
select 字段1 (+,-,*,/)字段2 from 表名;
//如果某一列为null,可以进行替换
ifnull(表达式1,表达式2)
//表达式1为列名
//表达式2为值
例如:
select name,ifnull(mark,0)+10 from student;
起别名
select 字段1 as 别名 from 表名
//as可以省略,必须加空格
​

⑧条件查询

select * from 表名[where条件1,条件2.....];

⑨聚合函数

select 函数名(类名) from 表名 where 条件;

⑩排序查询

//ASC 升序 DESC 降序,多个排序时,前面相同后面才会排序
select * from 表名 where 条件 order by 列名 排序方式 列名 排序方式
​

6.分组查询

select 列名 from 表名 where 条件 group by 分组条件 having 过滤条件 order by 列名 排序方式

7.分页查询

select 列名 from 表名 where 条件 group by 分组条件 having 过滤条件 order by 列名 排序方式 limit 当前页数,每页条数;
​
//当前页数 = (页数-1)*每页条数

8.多表查询

内连接查询(数据有主外键关联)
显示内连接
select 列名 from 表1 [inner] join 表2 on 条件;
//inner 可以省略
隐式内连接
select 列名 from 表1,表2 where 条件;
​
​
​
外连接
左连接(查询左表数据及左右表有关联的数据)
select 列名 from 表1 lift [outer] join 表2 on 条件;
右连接
(查询左表数据及左右表有关联的数据)
select 列名 from 表1 right [outer] join 表2 on 条件;
//[outer]可以省略
​
子查询
单行单列查询
select 列名 from 表名 where 列名 = (select 列名 from 表名 where 条件);
多行单列查询
用in或notin
select 列名 from 表名 where 列名 notin (select 列名 from 表名 where 条件);
多行多列查询
select 列名 from 表名 别名,(select 列名 from 表名 where 条件) 别名 where 条件;

7.创建约束

1.SQL约束

SQL 约束用于规定表中的数据规则。

如果存在违反约束的数据行为,行为会被约束终止。

约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。

SQL CREATE TABLE + CONSTRAINT 语法

CREATE TABLE *table_name*
(
*column_name1 data_type*(*size*) *constraint_name*,
*column_name2 data_type*(*size*) *constraint_name*,
*column_name3 data_type*(*size*) *constraint_name*,
....
);

在 SQL 中,我们有如下约束:

  • NOT NULL - 指示某列不能存储 NULL 值。

  • UNIQUE - 保证某列的每行必须有唯一的值。

  • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。

  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。

  • CHECK - 保证列中的值符合指定的条件。

  • DEFAULT - 规定没有给列赋值时的默认值。

create table if not exists per(
  id bigint auto_increment comment '主键',
  name varchar(20) not null comment '人员姓名',
  work_id bigint not null comment '工作id',
  create_time date default '2021-04-02',
  primary key(id),
  foreign key(work_id) references work(id)
)
​
create table if not exists work(
  id bigint auto_increment comment '主键',
  name varchar(20) not null comment '工作名称',
  create_time date default '2021-04-02',
  primary key(id)
)

2.取别名

列的 SQL 别名语法

SELECT column_name AS alias_name
FROM table_name;

表的 SQL 别名语法

SELECT column_name(s)
FROM table_name AS alias_name;

2.SQL LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

SQL LIKE 语法

SELECT *column_name(s)*
FROM *table_name*
WHERE *column_name* LIKE *pattern*;

3.SQL 通配符

在 SQL 中,通配符与 SQL LIKE 操作符一起使用。

SQL 通配符用于搜索表中的数据。

在 SQL 中,可使用以下通配符:

通配符描述
%替代 0 个或多个字符
_替代一个字符
[charlist]字符列中的任何单一字符
[^charlist] 或 [!charlist]不在字符列中的任何单一字符

4.IN 操作符

IN 操作符允许您在 WHERE 子句中规定多个值。

SQL IN 语法

SELECT *column_name(s)*
FROM *table_name*
WHERE *column_name* IN (*value1*,*value2*,...);

SQL BETWEEN 操作符

BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。

SQL BETWEEN 语法

SELECT *column_name(s)*
FROM *table_name*
WHERE *column_name* BETWEEN *value1* AND *value2;*

5.SQL INNER JOIN 关键字

INNER JOIN 关键字在表中存在至少一个匹配时返回行。

6.JOIN

  • INNER JOIN:如果表中有至少一个匹配,则返回行

  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行

  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行

  • FULL JOIN:只要其中一个表中存在匹配,则返回行

SQL INNER JOIN 语法

SELECT *column_name(s)*
FROM *table1*
INNER JOIN *table2*
ON *table1.column_name*=*table2.column_name*;
​
或:
​
SELECT *column_name(s)*
FROM *table1*
JOIN *table2*
ON *table1.column_name*=*table2.column_name*;

SQL LEFT JOIN 关键字

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

SQL LEFT JOIN 语法

SELECT *column_name(s)*
FROM *table1*
LEFT JOIN *table2*
ON *table1.column_name*=*table2.column_name*;
​
或:
​
SELECT *column_name(s)*
FROM *table1*
LEFT OUTER JOIN *table2*
ON *table1.column_name*=*table2.column_name*;

  • INNER JOIN:如果表中有至少一个匹配,则返回行

  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行

  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行

  • FULL JOIN:只要其中一个表中存在匹配,则返回行

SQL RIGHT JOIN 关键字

RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

SQL RIGHT JOIN 语法

SELECT *column_name(s)*
FROM *table1*
RIGHT JOIN *table2*
ON *table1.column_name*=*table2.column_name*;
​
或:
​
SELECT *column_name(s)*
FROM *table1*
RIGHT OUTER JOIN *table2*
ON *table1.column_name*=*table2.column_name*;
​
**注释:**在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。

SQL FULL OUTER JOIN 关键字

FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.

FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。

SQL FULL OUTER JOIN 语法

SELECT *column_name(s)*
FROM *table1*
FULL OUTER JOIN *table2*
ON *table1.column_name*=*table2.column_name*;

8.SQL UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT *column_name(s)* FROM *table1*
UNION
SELECT *column_name(s)* FROM *table2*;

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法

SELECT *column_name(s)* FROM *table1*
UNION ALL
SELECT *column_name(s)* FROM *table2*;

注释:UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

SQL SELECT INTO 语句


通过 SQL,您可以从一个表复制信息到另一个表。

SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。


SQL SELECT INTO 语句

SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。

注意:

MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT 。

当然你可以使用以下语句来拷贝表结构及数据:

CREATE TABLE 新表
AS
SELECT * FROM 旧表 

SQL SELECT INTO 语法

我们可以复制所有的列插入到新表中:

SELECT *
INTO *newtable* [IN *externaldb*]
FROM *table1;*
​
或者只复制希望的列插入到新表中:
​
SELECT *column_name(s)*
INTO *newtable* [IN *externaldb*]
FROM *table1;*

SQL INSERT INTO SELECT 语句


通过 SQL,您可以从一个表复制信息到另一个表。

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。


SQL INSERT INTO SELECT 语句

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。

SQL INSERT INTO SELECT 语法

我们可以从一个表中复制所有的列插入到另一个已存在的表中:

**INSERT** **INTO** table2
**SELECT** * **FROM** table1;

或者我们可以只复制希望的列插入到另一个已存在的表中:

**INSERT** **INTO** table2
(column_name(s))
**SELECT** column_name(s)
**FROM** table1;

SQL CREATE DATABASE 语句

CREATE DATABASE 语句用于创建数据库。

SQL CREATE DATABASE 语法

CREATE DATABASE *dbname*;


SQL CREATE DATABASE 实例

下面的 SQL 语句创建一个名为 "my_db" 的数据库:

CREATE DATABASE my_db;

数据库表可以通过 CREATE TABLE 语句来添加。

SQL SELECT TOP 子句

SELECT TOP 子句用于规定要返回的记录的数目。

SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的。

注意:并非所有的数据库系统都支持 SELECT TOP 语句。 MySQL 支持 LIMIT 语句来选取指定的条数数据, Oracle 可以使用 ROWNUM 来选取。

SQL Server / MS Access 语法

SELECT TOP *number*|*percent* *column_name(s)*
FROM *table_name*;

MySQL 语法

SELECT *column_name(s)*
FROM *table_name*
LIMIT *number*;
​
### 实例
​
SELECT *
FROM Persons
LIMIT 5;
​

-- 在创建数据表时语法如下: CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段) -- 将创建数据表创号后语法如下: ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);


7.表操作:

表与字段是密不可分的。

  1. 新增数据表
    Create table [if not exists] 表名(字段名称 数据类型,字段名称 数据类型...)[表选项]
    
    if not exists:如果表不存在则执行,否则不执行后面代码。
    [表选项]:控制表的表现
        -字符集:charset/character set 具体字符集; –保证表中数据存储的字符集
        -校对集:collate 具体校对集;
        -存储引擎:innodb和myisam等;


    例:创建一张学生表
    若直接使用:
    create table if not exits student(
    name varchar(10),
    number varchar(10),
    age int
    )charset utf8;
    
    会报错:原因是没有指定数据库,有两个解决办法:
    1.显式地指定表所属数据库(在数据库环境外):
    create table [if not exists] dbname.tablename(...)[字符集]
    
    2.隐式地指定表所属数据库(进入数据库环境,则表自动归属):
    进入数据库环境:
    use dbname
    
    若进入test数据库则使用use test
    再执行上述代码。

    创建数据表的SQL指令执行后发生了什么:
    –指定数据库上已经存在的对应表
    –在数据库对应的文件夹下会产生对应表的结构(跟存储引擎有关):编译后的文件,需要反编译才能看
  2. 查看数据表:
    查看数据表之前需先进入某数据库环境,再用show查询:
    use dbname
    
    有几种方式:
    • 查看所有表:
      show tables;
      
    • 查看部分表:模糊查询
      show tables 'parttern';
      
      如查询以s结尾的表:
      SHOW TABLES LIKE '%s';
      
      这样会使索引失效,影响效率。
    • 查看表创建语句:
      show create table student\g  --\g效果和‘;’相同
      show create table student\G  --\G将查到的结果旋转90度,纵向
      
    • 查看表结构(三种方式):
      DESC student;
      descripe student;
      show colums from student;
      
  3. 修改数据表:
    包括修改表本身及修改字段。
    • 修改表本身:表名和表选项
      修改表名:
      rename table 老表名 to 新表名;
      
      修改表选项:字符集,校对集和存储引擎
      Alter table 表名 表选项 [=] 值;
      
    • 修改字段:增加,修改,重命名,删除
      1.新增字段:
      alter table 表名 add [column] 字段名 数据类型 [属性][位置]
      
      属性:是否自增,是否为空,是否有默认值等
      位置:字段可以存放在表中的任意位置
      –First:第一个位置
      –After column:在哪个字段后(后跟字段名)
      给学生表新增一个ID字段放到第一个位置:
      ALTER TABLE te_student
      ADD COLUMN id int
      FIRST;
      
      在name属性后添加一个sex性别:
      ALTER TABLE te_student ADD COLUMN sex VARCHAR(4) AFTER name;
      
      2.修改字段:位置,属性数据类型等:
      alter table 表名 modify 字段名 数据类型 [属性][位置]
      
      如修改字段age位置:
      ALTER TABLE te_student MODIFY age INT AFTER name;
      
      3.修改字段名字(也可以修改位置不加则不变)
      alter table 表名 change 旧字段 新字段名 数据类型 [属性][位置];
      
      如修改te_student表中的name为stu_name:
      ALTER TABLE te_student CHANGE name stu_name VARCHAR(10);
      
      4.删除字段:
      alter table 表名 drop 字段名;
      
      注意:
      如果表中已经存在数据,会删除表中所有数据且不可逆。
  4. 删除数据表:
    drop table 表名;
    
    如删除st_student表:
    DROP TABLE te_student;
    

8.数据操作:

  1. 新增数据:
    有两种方案:
    1. 全表字段插入数据,不需要指定字段列表:要求数据的值出现的顺序必须与表中设计的字段的顺序一致,凡是非数值数据都需要用引号(单引号)包裹
      insert into 表名 values(值列表)[,(值列表)];  --可以一次性插入多条
      
      如给te_student添加我的信息(先把number数据类型改为varchar(20))
      INSERT INTO te_student VALUES(1,'kenshine','男',22,'201503111073');
      
      但是添加中文时要注意。参考第9条。
    2. 给部分字段插入数据,需要选定字段名列表:子段列表的顺序与字段的顺序无关,但是致列表的顺序必须和字段列表顺序一致。
      insert into 表名(字段列表) values(值列表);
      
      如再给te_student添加一个Tom的信息:
      INSERT INTO te_student(id,name,number,sex,age) VALUES(2,'Tom','123456789','女',18);
      
      注意:非数值类型一定要加上单引号。
  2. 查看数据(查询):
    • 简单查看:
      select * from 表名;
      SELECT * FROM te_student;
      
    • 查看指定字段,指定条件的数据:
      select 字段名[,字段名] from 表名 where 字段名 = 值;
      
      如查看我的学号和名字:
      SELECT number,name FROM te_student WHERE id=1;
      
  3. 更新数据:
    Update 表名 set 字段=值[,字段=值] [where 字段名=值];
    
    建议都加上where,否则都会更新。
    如更新学生Tom的性别为男:
    UPDATE te_student SET sex='男' WHERE name='Tom';
    
  4. 删除数据:
    删除是不可逆的,三思而后行。
    delete from 表名 [where 字段名=值];    --建议加上where
    
    把Tom删除:
    DELETE FROM te_student WHERE name='Tom';
    

9.中文数据的问题(在cmd中)

  1. 原因:
    计算机只识别二进制,人类更多的是识别符号,需要有个二进制与字符的对应关系(字符集)。
  2. 存中文数据,会出现问题:
    中文数据转换成了像\xD5\xC5\xD4\xBD这种形式,报错。
    原因1:这是中文在当前(编码)字符集下对应的二进制编码转换为十六进制,两个汉字->四个字节-(GBK)。
    原因2:服务器任务数据时UTF-8,一个汉字三个字节,第四个就出错了。


    所有的数据库服务器的一些特性都是通过服务器端的变量来保存,系统会先读取自己的变量。
    1.查看服务器能识别哪些字符集:
    show character set;
    
    我的mysql查询出了41种,基本是都能识别的。
    2.查看服务器与客户端交互的字符集(默认的对外处理的字符集):
    show variables like 'character_set%';
    

    问题根源:第一行character_set_client,客户端对服务器的字符集为utf8,而客户端数据为gbk。
    修改服务器对客户端的字符集为GBK:
    set character_set_client=gbk;
    
  3. 上述问题解决之后,插入中文数据,使用select查看数据,仍然乱码:
    原因:数据来源服务器,解析数据是客户端(服务器给三个字节UTF8,而客户端接收却是GBK)
    解决方法:
    set character_set_result=gbk;
    
  4. 但是,一个很严重的问题:
    set 变量=值;修改只是会话级别,当前客户端,当次连接有效,关闭失效
    所以设置这种服务器的字符集有快捷方式:
    set names gbk;
    
    它等价于:
    set character_set_result=gbk;set character_set_client=gbk;set character_set_connection=gbk;
    connection连接层,与client和result统一效率更高。

10.校对集:

  1. 校对集:数据比较的方式。
  2. 校对集有三种格式:
    • _bin (binary):二进制比较,取出二进制位,从左到右一位一位的比较,区分大小写。
    • _cs (case sensitive):大小写敏感,区分大小写(不常见)
    • _ci (case insensitive):大小写不敏感,不区分大小写
  3. 查看字符集:
    查看服务器支持的所有字符集:
    show collaction;
    
  4. 校对集的应用:
    只有当数据产生比较时才会生效。如order by字段名 [asc|desc]才有效,asc升序,desc降序,默认是降序。
  5. 注意:
    校对集必须在没有数据之前设定好,如果有了数据再修改,那么修改无效。
    具体如何修改字符集参考表的修改。
  6. 老师是这么讲的,但是我的编码都是utf8在cmd下也没有乱码,很奇怪。

11.web乱码问题

  1. 动态网站的构成:浏览器,Apache服务器(java后端),数据库服务器,三个部分都有自己的字符集(针对中文的),数据在三个部分来回传递,很容易产生乱码。
  2. 解决方案:
    java服务端—>浏览器(jsp自带):
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
    浏览器—>服务器:表单由java服务端提供。


    java服务端—>数据库服务器端:set character_set_client = utf8;,
    数据库服务器端—>java服务端:set character_set_result = utf8;,
    一劳永逸的办法:set names utf8;
    但是默认好像就是utf-8的。

    12.数据库的范式

    1. 第一范式(确保每列保持原子性)

    2. 第二范式(确保表中的每列都和主键相关)

    3. 三范式(确保每列都和主键列直接相关,而不是间接相关


      使用drop和delete 的区别

      不同点:

    4. delete:删除表的内容,表的结构还存在,不释放空间,可以回滚恢复;

    5. drop:删除表内容和结构,释放空间,没有备份表之前要慎

    6. truncate:删除表的内容,表的结构存在,可以释放空间,没有备份表之前要慎

更多推荐

MySQL数据库【基础】