数据库基本知识点

1.数据库

1.定义

是按照数据结构来组织, 存储 和 管理数据的 仓库

组成:  库  database
      表  table
​
      库中包含了 表
      表中包含了 数据

2.分类

2.1 关系型数据库

MySQL, SQLServer, Oracle ...

优点:
    保持数据的一致性
    擅长做复杂数据查询
    支持事务
​
缺点:
    读写性能比 非关系的差一点.  尤其是 海量数据的高效率读写
    表结构固定, 不灵活

2.2 非关系型数据库

Redis, MongoDB, ...

优点:
    读写速度快
    格式灵活
    开源
​
缺点:
    表结构复杂, 导致复杂查询能力较弱
    不支持事务   

3.注释

/* 多行注释 * /
-- 单行
# 单行

注意: ​ 单行注释符 与 注释内容 之间至少保留一个空格

4.MySQL基础操作

使用方法:

方式一: 通过图型界面工具,如 Navicat 等

方式二: 通过在命令行敲命令来操作

2.操作数据库的步骤

连接, 打开库, 操作, 关闭退出

1.通过命令行连接MySQL

 

2. 数据库语法的特点

1) SQL 语句可以换行, 要以分号结尾

2) 命令不区分大小写. 关键字和函数建议用大写

3) 如果提示符为 '> 那么需要输入一个'回车

4) 命令打错了换行后不能修改, 可以用 \c 取消

 

3. 数据表操作

数据库管理系统中, 可以有很多, 每个数据库中可以包括多张数据

3.操作数据库的步骤

数据库常见命令

  1. 设置密码 set password = password('密码')

  2. 查看数据库

    show databases;  复数
  3. 创建数据库

        create database ` 库名 `;
        create database if not exists ` 库名 `;
        create database if not exists ` 库名 ` default charset=编码;
        
    注意:
        1) 编码不要写成utf-8,  写成 utf8, 中间没有 "-".
        2) if not exists 判断库若存在 , 则不创建
                              库若不存在, 则创建
        3) 反引号 具有屏蔽关键字的作用. 
            推荐:  库名, 表名, 字段名 最好都加上反引号
    create database `p4`;
    create database if not exists `p4`;
    create database if not exists `p4` default charset=utf8;
    create database p5;
    create database create;
    create database `create`;
  4. 删除数据库

    drop database `库名`;
  5. 使用数据库

    use `库名`;
    注意:
        在使用 表之前, 必须先使用 库
  6. 查看数据表

show tables;
  1. 创建数据表

    create table if not exists `表名`(
                `字段名`   字段类型    字段属性,
                `字段名`   字段类型    字段属性,
            ...
                `字段名`   字段类型    字段属性        (最后一个字段的分号, 不能写)
        )engine=引擎 default charset=编码;

MySQL字段类型

数值类型

tinyint 1字节 可以表示 0-255 (无符号) 可以表示 -128 ~ 127 (有符号)

int 4字节 无符号(0,4 294 967 295) 有符号 (-2 147 483 648,2 147 483 647)

decimal 以字符串形式存储的浮点数 decimal(5, 2) 表示数值总共5位, 小数占2位

日期和时间类型

datetime 8字节 1000-01-01 00:00:00 -- 9999-12-31 23:59:59

字符串类型

char 定长字符串 char(7) 不管实际插入多少字符, 它都会占用7个字符位置(中文一个汉字也是一个位置)

varchar 变长字符串 varchar(7) 如果实际插入4个字符, 那么它只占4个字符位置

text 这种类型用来存放超大文本

enum 枚举类型( 多选一 ) sex enum('w','m','x') 代表sex这个字段, 可以取 'w', 'm', 'x' 中的一个值

MySQL引擎

# MyISAM InnoDB
事务 No Yes
全文索引 Yes No 可用Sphinx代替
表总行数 存储 count() 可直接获取 count() 若带where条件, 则会遍历整表, 消耗巨大 未存储 当场遍历整表, 消耗巨大
CURD 擅长R (read), 查询数据 擅长CUD 增(create) 删(delete) 改(update)
行表锁 表锁 开销小, 加锁快, 低并发 行锁 (默认) , 表锁 开销大, 加锁慢, 易死锁, 高并发
区别:
InnoDB类型的表数据 增 删 改速度 没有MyISAM的快,但支持事务,相对 安全
MyISAM类型中的表数据增 删 改速 度快,不支持事务,没有InnoDB安全

MySQL字段属性

属性 属性名 描述
PRIMARY KEY 主键索引 主键数据不能为空 主键数据不能重复
UNIQUE 唯一索引 索引数据不能重复 索引数据可以为NULL. (null 不参与比较) 索引可以提高查询速度 占用磁盘空间 索引不宜太多(消耗空间, 消耗性能)
AUTO_INCREMENT 自增 每新增一条数据, 该字段值+1 根据记录+1, 而非已有最大值+1 不允许重复 常配合主键使用
NOT NULL 非空约束 该字段必须有值
NULL 空约束 该字段可以不给值
DEFAULT 默认值 没有给该字段赋值时, 则自动采用默认值
UNSIGNED 无符号 没有正负号, 即没有负数
COMMENT 注释描述 描述说明字段, 尤其是 开关类字段. 例如: 性别, 状态, 是否上架 ...
ZEROFILL 补零 显示宽度不足时, 高位用0代替 自动加上 unsigned 属性

实例

以下为创建数据表 userinfo实例:

   create table userinfo(
       id int unsigned not null AUTO_INCREMENT PRIMARY KEY,
       username varchar(255) not null,
       password char(32) not null,
       email varchar(100) not null,
       pic varchar(50) default './public/img/pic.jpg'
   )engine=innodb default charset=utf8;

 

实例解析:

如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。

AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。

PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。

ENGINE 设置存储引擎,CHARSET 设置编码。

  1. 删除数据表

    drop table `表名`;
  2. 查看表结构

    desc `表名`;
  3. 查看建表语句

    show  create  table `表名`;

4.修改表结构

alter table 表名 action(更改选项);

添加字段:

alter table 表名 add 新字段名 类型 约束 after 指定字段名;  
  • 在用户表的最后追加一个num字段 设置为 int not null

alter table userinfo add num int not null;
  • 在用户表的email字段后添加一个age字段,设置int not null default 20;

alter table userinfo add age int not null default 20 after  email;

删除字段:

alter table 表名 drop 被删除的字段名    
  • 删除user表的aa字段

alter table userinfo drop num;

修改字段:

alter table 表名 change 被修改后的字段信息
  • change可以修改字段名

alter table userinfo change age age_new int;

添加索引:

  • 为user表中的email字段添加普通索引,索引名为index_eamil

    alter table userinfo add index index_email(email);

删除索引:

  • 将user表中index_email的索引删除

alter table userinfo drop index index_email;

添加唯一索引:

alter table userinfo add unique uni_name(username);  

查看索引名字从建表语句中看 修改表名:

ALTER TABLE 旧表名 RENAME AS 新表名

更改表类型:

ALTER TABLE 表名称 ENGINE="InnoDB" 

MySQL数据库中的表类型一般常用两种:MyISAMInnoDB

删除数据表

删除表操作时要非常小心,因为执行删除命令后所有数据都会消 失

删除MySQL数据表的通用语法:

DROP TABLE table_name;

5.数据库记录操作 增删改查

5.1添加数据

格式: insert into 表名[(字段列表)] values(值列表...);

--标准添加(指定所有字段,给定所有的值)
mysql> insert into userinfo(id,username,password,email,pic) value('3',lisi','123','[email protected]',' ./public/img/pic.jpg');
​
--指定部分字段添加值
mysql> insert into userinfo(id,username,password,email) value(1,'zs','123','[email protected]');
​
-- 不指定字段添加值
mysql> insert into userinfo value(null,'wangwu','2222','22@qqicom','img/1.jpg');
​
-- 批量添加值
mysql> insert into userinfo values(null,'zhaoliu','123456','22333@qqicom','img/1.jpg'),(null,'uu01','123456','22@qqicom','img/1.jpg'),
(null,'uu02','123456','22@qqicom','img/1.jpg'),
(null,'qq02','123456','22@qqicom','img/1.jpg'),
(null,'uu03','123456','22@qqicom','img/1.jpg'),
(null,'qq03','123456','22@qqicom','img/1.jpg'),
(null,'aa','123456','22@qqicom','img/1.jpg')
    
    values 和value 的区别 
    可以混用 单行vlaues快 多行value快

5.2修改数据

格式:update 表名 set 字段1=值1,字段2=值2,字段n=值n... where 条件

-- 将id为11的age改为35,sex改为m值
mysql> update stu set age=35,sex='m' where id=11;

-- 将id值为12和14的数据值sex改为m,classid改为lamp92
mysql> update stu set sex='m',classid='lamp92' where id=12 or id=14 --等价于下面
mysql> update stu set sex='m',classid='lamp92' where id in(12,14);

任务:

  • 修改id为1,2,3的数据

  • 将id为11的age改为35,sex改为0值

  • 将id值为6和9的数据值sex改为0,email改为[email protected]

  • 将姓名为张三并且年龄是20的数据,密码改为747474

  • 更新年龄小于20的用户密码 为abc

update users set age='20' where id=1 or id=2 or  id=3;
update users set age="35",sex='0' where id=11;
update users set sex='0',email='[email protected]' where id=6 or id=9;
update users set pssword='74747' where username="张三"  and age=20;
update users set pssword='abc' where age<'20';

5.3删除数据

格式:delete from 表名 [where 条件]

-- 删除stu表中id值为100的数据
mysql> delete from stu where id=100;
Query OK, 0 rows affected (0.00 sec)

-- 删除stu表中id值为20到30的数据
mysql> delete from stu where id>=20 and id<=30;
Query OK, 0 rows affected (0.00 sec)

-- 删除stu表中id值为20到30的数据(等级于上面写法)
mysql> delete from stu where id between 20 and 30;
Query OK, 0 rows affected (0.00 sec)

-- 删除stu表中id值大于200的数据
mysql> delete from stu where id>200;
Query OK, 0 rows affected (0.00 sec)

6.MySQL 数据操作 DQL

数据的DQL操作:数据查询

格式:

    select [字段列表]  |  *  from 表名

    [where 搜索条件]

    [group by 分组字段 [having 子条件]]

    [order by 排序 asc|desc]

    [limit 分页参数]

6.1基础查询

mysql> select * from stu;
+----+----------+-----+-----+---------+
| id | name     | age | sex | classid |
+----+----------+-----+-----+---------+
|  1 | zhangsan |  20 | m   | lamp138 |
|  2 | lisi     |  20 | m   | lamp138 |
|  3 | wangwu   |  21 | w   | lamp138 |
|  4 | zhaoliu  |  25 | w   | lamp94  |
|  5 | uu01     |  26 | m   | lamp94  |
|  6 | uu02     |  28 | w   | lamp92  |
|  7 | qq02     |  24 | m   | lamp92  |
|  8 | uu03     |  32 | m   | lamp138 |
|  9 | qq03     |  23 | w   | lamp94  |
| 10 | aa       |  19 | m   | lamp138 |
| 11 | sad      |  35 | m   | lamp94  |
| 12 | tt       |  25 | m   | lamp92  |
| 13 | wer      |  25 | w   | lamp94  |
| 14 | xx       |  25 | m   | lamp92  |
| 15 | kk       |   0 | w   | lamp94  |
+----+----------+-----+-----+---------+
15 rows in set (0.00 sec)

6.2where条件查询

  • 你可以在 WHERE 子句中指定任何条件。

  • 你可以使用 AND 或者 OR 指定一个或多个条件。

  • WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。

  • WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。

1. 查询班级为lamp138期的学生信息
mysql> select * from stu where classid='lamp138';

2. 查询lamp138期的男生信息(sex为m)
mysql> select * from stu where classid='lamp138' and sex='m';

3. 查询id号值在10以上的学生信息
mysql> select * from  stu where id>10;

4. 查询年龄在20至25岁的学生信息
mysql> select * from stu where age>=20 and age<=25;
mysql> select * from stu where age between 20 and 25;

5. 查询年龄不在20至25岁的学生信息
mysql> select * from stu where age not between 20 and 25;
mysql> select * from stu where age<20 or age>25;

6. 查询id值为1,8,4,10,14的学生信息
select * from stu where id in(1,8,4,10,14);
mysql> select * from stu where id=1 or id=8 or id=4 or id=10 or id=14;

7. 查询lamp138和lamp94期的女生信息
mysql> select * from stu where classid in('lamp138','lamp94') and sex='w';
mysql> select * from stu where (classid='lamp138' or classid='lamp94') and sex='w

6.3LIKE 子句

WHERE 子句中可以使用等号=来设定获取数据的条件,如 "runoob_author = 'RUNOOB.COM'"。

但是有时候我们需要获取 runoob_author 字段含有 "COM" 字符的所有记录,

这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。

LIKE 子句中使用百分号%字符来表示任意字符,类似于UNIX或正则表达式中的星号*。

如果没有使用百分号%, LIKE 子句与等号=的效果是一样的。

LIKE 通常与 % 一同使用,类似于一个元字符的搜索。 你可以使用 AND 或者 OR 指定一个或多个条件。 你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。 可以使用regexp正则来代替 like

--9. 查询name字段值是以zh开头的所有信息
mysql> select * from stu where name like "zh%";
mysql> select * from stu where name regexp  "^zh"; --正则写法
+----+----------+------+-----+---------+
| id | name     | age  | sex | classid |
+----+----------+------+-----+---------+
| 14 | zhangle  |   29 | m   |       5 |
|  1 | zhangsan |   20 | w   |       1 |
|  4 | zhaoliu  |   21 | m   |       4 |
+----+----------+------+-----+---------+
3 rows in set (0.00 sec)

--10.查询姓名name中含有ang子串的所有信息
mysql> select * from stu where name like "%ang%";
mysql> select * from stu where name regexp  "ang";
+----+-----------+------+-----+---------+
| id | name      | age  | sex | classid |
+----+-----------+------+-----+---------+
|  1 | zhangsan  |   20 | w   |       1 |
|  3 | wangwu    |   22 | w   |       5 |
| 10 | xiaozhang |   19 | w   |       1 |
| 13 | wangwen   |   27 | w   |       2 |
| 14 | zhangle   |   29 | m   |       5 |
+----+-----------+------+-----+---------+
5 rows in set (0.01 sec)

6.4limit 关键字 查据

-- 例如: .... limit m; 查询数据只显示前m条

-- 例如: .... limit m,n; 排除前m条,然后再查询出前n条

-- 查询前5条信息
mysql> select * from stu limit 5;
+----+----------+------+-----+---------+
| id | name     | age  | sex | classid |
+----+----------+------+-----+---------+
|  1 | zhangsan |   20 | w   |       1 |
|  2 | lisi     |   25 | m   |       2 |
|  3 | wangwu   |   22 | w   |       5 |
|  4 | zhaoliu  |   21 | m   |       4 |
|  5 | uu01     |   27 | w   |       1 |
+----+----------+------+-----+---------+
5 rows in set (0.00 sec)

-- 排除前2条后再获取4条信息
mysql> select * from stu limit 2,4;
+----+---------+------+-----+---------+
| id | name    | age  | sex | classid |
+----+---------+------+-----+---------+
|  3 | wangwu  |   22 | w   |       5 |
|  4 | zhaoliu |   21 | m   |       4 |
|  5 | uu01    |   27 | w   |       1 |
|  6 | uu02    |   25 | m   |       2 |
+----+---------+------+-----+---------+
4 rows in set (0.00 sec)

-- 以4条数据分一页,取第一页。
mysql> select * from stu limit 0,4;
+----+----------+------+-----+---------+
| id | name     | age  | sex | classid |
+----+----------+------+-----+---------+
|  1 | zhangsan |   20 | w   |       1 |
|  2 | lisi     |   25 | m   |       2 |
|  3 | wangwu   |   22 | w   |       5 |
|  4 | zhaoliu  |   21 | m   |       4 |
+----+----------+------+-----+---------+
4 rows in set (0.00 sec)

-- 以4条数据分一页,取第二页。
mysql> select * from stu limit 4,4;
+----+------+------+-----+---------+
| id | name | age  | sex | classid |
+----+------+------+-----+---------+
|  5 | uu01 |   27 | w   |       1 |
|  6 | uu02 |   25 | m   |       2 |
|  7 | uu03 |   28 | w   |       2 |
|  8 | uu05 |   22 | m   |       4 |
+----+------+------+-----+---------+
4 rows in set (0.00 sec)

-- 以4条数据分一页,取第三页。
mysql> select * from stu limit 8,4;
+----+-----------+------+-----+---------+
| id | name      | age  | sex | classid |
+----+-----------+------+-----+---------+
|  9 | xiaoli    |   29 | w   |       2 |
| 10 | xiaozhang |   19 | w   |       1 |
| 11 | xiaoyan   |   22 | m   |       2 |
| 12 | xiaoxin   |   28 | w   |       4 |
+----+-----------+------+-----+---------+
4 rows in set (0.00 sec)


-- 以4条数据分一页,取第四页。
mysql> select * from stu limit 12,4;
+----+---------+------+-----+---------+
| id | name    | age  | sex | classid |
+----+---------+------+-----+---------+
| 13 | wangwen |   27 | w   |       2 |
| 14 | zhangle |   29 | m   |       5 |
+----+---------+------+-----+---------+
2 rows in set (0.00 sec)

7.数据导出

-- 将lamp138库导出
D:\>mysqldump -u root -p lamp138 >lamp138.sql
Enter password:
---- 将lamp138库中的stu表导出
D:\>mysqldump -u root -p lamp138 stu >lamp138_stu.sql
Enter password:

8.数据导入

-- 将lamp138库导入
D:\>mysql -u root -p lamp138mysql -u root -p lamp138 
  

9.MySQL忘记root密码

windows

 1.结束正在运行的数据库服务器进程 mysqld.exe
 2.在DOS命令行执行 mysqld --skip-grant-tables
 3.再打开一个DOS窗口, 可直接输入 mysql 以管理员的身份强行进入.
 4. use mysql
 5. update user set authentication_string=password('新密码') where user='root';
 6. 刷新权限 flush privileges;

10.退出MySQL

exit; 或者 quit;

 

作业:

1.设计一个用户表,表结构有id,nickname, pwd, tel, sex, birthday, address, status, regtime

id为自增主键且唯一性并且插入5条数据

你可能感兴趣的:(mysql)