是按照数据结构来组织, 存储 和 管理数据的 仓库
组成: 库 database 表 table 库中包含了 表 表中包含了 数据
2.1 关系型数据库
MySQL, SQLServer, Oracle ...
优点: 保持数据的一致性 擅长做复杂数据查询 支持事务 缺点: 读写性能比 非关系的差一点. 尤其是 海量数据的高效率读写 表结构固定, 不灵活
2.2 非关系型数据库
Redis, MongoDB, ...
优点: 读写速度快 格式灵活 开源 缺点: 表结构复杂, 导致复杂查询能力较弱 不支持事务
/* 多行注释 * / -- 单行 # 单行
注意: 单行注释符 与 注释内容 之间至少保留一个空格
使用方法:
方式一: 通过图型界面工具,如 Navicat 等
方式二: 通过在命令行敲命令来操作
连接, 打开库, 操作, 关闭退出
1) SQL 语句可以换行, 要以分号结尾
2) 命令不区分大小写. 关键字和函数建议用大写
3) 如果提示符为 '> 那么需要输入一个'回车
4) 命令打错了换行后不能修改, 可以用 \c 取消
数据库管理系统中, 可以有很多库
, 每个数据库中可以包括多张数据表
数据库常见命令
设置密码 set password = password('密码')
查看数据库
show databases; 复数
创建数据库
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`;
删除数据库
drop database `库名`;
使用数据库
use `库名`; 注意: 在使用 表之前, 必须先使用 库
查看数据表
show tables;
创建数据表
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 设置编码。
删除数据表
drop table `表名`;
查看表结构
desc `表名`;
查看建表语句
show create table `表名`;
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数据库中的表类型一般常用两种:MyISAM
和 InnoDB
删除数据表
删除表操作时要非常小心,因为执行删除命令后所有数据都会消 失
删除MySQL数据表的通用语法:
DROP TABLE table_name;
格式: 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快
格式: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';
格式: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)
数据的DQL操作:数据查询
格式:
select [字段列表] | * from 表名 [where 搜索条件] [group by 分组字段 [having 子条件]] [order by 排序 asc|desc] [limit 分页参数]
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)
你可以在 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
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)
-- 例如: .... 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)
-- 将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:
-- 将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条数据