5天,2W+字整理数据库实操指令,附练习题,再说数据库学不明白

朋友工作的原因,端午节也没闲着,陪这个祸害整理了一下数据库的sql指令,并且整理配套的习题进行练习使用,我正好也没啥事,疫情的原因啥也干不了,就陪他整理一波,顺便薅一波羊毛,嘿嘿嘿

不过,因为真的是文字太多了,所以只展示一部分,需要完整文档以及sql文件的,关注公众号:Java架构师联盟,添加后台小助手获取,备注简书

第一天:

第一节课:数据库基本概念学习

1、数据 书

其实就是表示信息的一种特殊符号的集合

例如:图片、txt、音频、视频等等

引入:互联网的发展交互的其实就是数据

2、数据库: 图书馆

把用来存储数据的东西称之为数据库。

3、数据库管理系统 应用程序 图书馆管理系统

将数据按照指定的方式存储到数据库中的系统称之为数据库管理系统

可以高效率的取出存储好的数据(重点)

数据库应用系统----给普通用户使用的,像淘宝网等

4、数据库系统

数据库管理员

数据库

数据库管理系统

数据库应用系统

用户

5、

oradata:数据库相关信息

product:数据库管理系统的相关信息

bin:数据库管理系统软件的启动目录

jdbc:数据库和java连接所需的jar包

network:数据库管理系统所需网络配置目录

log目录:oracle异常日志信息存储目录

第二节课:常见数据库及数据库存储结构

1、数据库存储数据结构

网状结构

层次结构

二维表结构:

二维表结构可以清晰的将数据与数据之间的关系表述清楚

注意:

单纯的存储数据很简单,但是存储好的数据又要将数据之间的关系描述清楚

就会比较困难,所以采用二维表的结构存储数据会比较合理

2、数据库管理系统

oracle:大型数据库管理系统

mysql:中小型

DB2:中小型

Acess:小型

Sql Server:大型数据库

.....

3、oralce的历史介绍 参照PPT

第三节课:oralce的安装及oracle目录结构介绍及卸载

1、oracle的安装:

参照百度搜索“oracle11g安装图解”

全局数据库名:默认是orcl,是用来唯一标示数据库的名字

SID:在程序中唯一标示数据的名字

2、oracle的服务:(需要开启的服务)

orcaleServiceorcl:orcale启动服务

OracleOraDb11g_home1TNSListener:oracle监听器服务

OracleDBConsoleorcl:控制台服务

3、oracle账户:

sys:超级管理员

system:管理员

scott:普通用户 默认密码:root

4、oracle修改密码:

在cmd命令行中使用命令:sqlplus / as sysdba

然后使用命令:

alter user 用户名 identified by 新密码;

在cmd命令行中使用命令:sqlplus /nolog

然后使用命令:conn as sysdba

然后输入一个已知的用户名和密码

然后使用命令:

alter user 用户名 identified by 新密码;

5、新建用户:

必须使用System账户

第四节课:oracle目录及卸载

1、oracle的目录介绍:

oradata:数据库存储文件的目录

db_home:

network >admin:配置网络服务和监听器服务

jdk:oracle自带jdk

deinstall:卸载命令

jdbc:与java交互的jar包

2、oracle的卸载:

使用oracle自带的程序卸载

删除app目录

删除注册表

删除环境变量

第四节课:oracle的监听器及服务器配置

问题1:

我的电脑装了oralce,同桌怎么查看数据?

客户端:

针对普通用户使用的软件,主要是用来发送用户的请求。

服务器:

接受用户的请求,并处理用户的请求。

问题2:张三和李四都装了oracle,王五装了客户端,王五要访问张三,怎么访问?

ip

tcp

数据库全局名

端口号

问题3:

从服务器的角度观察,假如1000个请求过来,怎么区分那些是请求数据库的

监听器

第三方工具:plsql(不是客户端)

配置本地网络服务:(客户端)

第一种使用暴力方式直接操作:

修改:C:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora

ORCL = >网络服务名

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 服务器ip)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl)

)

)

第二种方式:

使用图形界面:NCA

配置监听器:(服务器端)

常见问题:

配置监听器,计算机名必须是英文的

第一天的主要任务是安装数据库和配置数据库的网络服务,第二天正式进行sql语句的学习

===========================================================================================================================================

第二天:

第一节课:sql语言介绍

1、数据库表的介绍

emp表:员工表

dept表:部门表

salgrady:薪资水平表

Balance:

2、基本的查询语句:

知识点:

select * from 表名 查询表中所有的数据

select 字段名1,字段名2,..from 表名 查询指定字段的所有值,不同字段之间使用逗号隔开

使用算术表达式:select 字段名(运算符),字段名(运算符)...from 表名

案例:

select * from emp---查询所有员工信息

select ename,job,sal from emp--查询员工姓名,工作,薪资

查询所有员工一年的工资,以及每位员工年终3000后的所有薪资(不包括津贴)

select ename,job,sal*12,sal*12+3000 from emp 使用运算符

第二节课:

1、使用别名

as可以省略不写,如果有特殊字符获取空格使用双引号添加别名

select ename 姓名,job 工作,sal*12 年资,sal*12+3000 年薪 from emp 直接在字段后面添加别名

select ename "姓名",job 工作,sal*12 ’年资’,sal*12+3000 年薪 from emp 使用双引号添加别名,不能使用单引号

select ename as 姓名,job "工作",sal*12 年资,sal*12+3000 年薪 from emp 使用as关键字添加别名

select ename "姓 名",job 工作,sal*12 年资,sal*12+3000 年薪 from emp 如果别名中有空格或者其他特殊字符,使用双引号

2、使用链接符:

select ename,job,sal from emp;

select ename||job,sal from emp; 使用||符号进行字符链接

select ename||' 的工作是 '||job||' 并且月工资是 '||sal from emp; 字符链接,普通字符使用单引号

3、去除重复 distinct

select * from emp;

select job from emp--发现工作是重复的,而工作种类是需要去除重复的

问题:查看员工工作种类

select distinct job from emp 使用distinct关键字去除重复值

问题;怎么多字段去除重复

select distinct job,sal from emp; 多字段去除重复,去除的是重复的一整条信息

4、排序

知识点:

select 字段名,字段名...from 表名 order by 字段名

select *from 表名 order by 字段名

讲解:

--查询员工姓名,工作,薪资

select ename,job,sal from emp

--查询按照薪资排序的员工姓名,工作,薪资

select ename,job,sal from emp order by sal; 使用order by排序

select ename,job,sal from emp order by sal desc; 使用desc关键从大到小排序

select ename,job,sal from emp order by sal asc; 使用asc关键从小到大排序,默认是从小到大排序

select * from emp order by sal,ename 多字段作为排序条件的时候,优先按照第一个字段排序,然后依次按照其他字段排序。

select ename,job,sal 工资 from emp order by 工资 使用别名

select ename,job,sal from emp order by sal*12 使用算术表达式

第三节课:简单的where子句

使用where条件进行结果筛选

语法:select * from 表名 where 条件;注意:条件中字段值区分大小写,字段名不区分大小写,字段值使用单引号括起来

1、在where中使用算术表达式 = ,< , > ,>= ,<= ,<>

2、使用order by 对筛选结果进行排序,order by 出现在where后面

查看工资等于1250的员工信息

select * from emp where sal='1250'--筛选条件是个数字也可以使用单引号

查看工作等于CLERK的员工信息

select * from emp where job='CLERK'--在筛选条件中字段值如果是字符需要加上单引号

select * from emp where job='clerk'--在sql语句中字段的值是区分大小写的

select * from emp where JOB='CLERK'--在sql中字段是不区分大小写的

查看工资大于1250的员工姓名和工作

select ename,job ,sal from emp where sal>'1250' order by sal--使用order by 对筛选结果进行排序,order by 出现在where后面

查看工资大于等于2000的员工信息

select * from emp where sal>=2000;

查看工资小于等于2000的员工信息;

select * from emp where sal<=2000

查看工资不等于1500的员工信息

select * from emp where sal<>1500 order by sal

查看入职日期在81年后的员工信息

select * from emp where hiredate>'1981年12月31号'

select * from emp where hiredate>'1981/12/31'

select * from emp where hiredate>'31-12月-1981'--使用日期的默认格式查询符合要求的数据,日-月-年

第四节课:where子句使用关键字

使用where子句进行结果的筛选

知识点:where查询条件中使用关键字

1、and 用于多条件的与筛选:select * from 表名 where 条件 and 条件 and 条件....

2、or 用于多条件的或筛选: select * from 表名 where 条件 or 条件 or 条件....

3、in 用于多条件的或筛选: select * from 表名 where 字段名 in(值,值,值....)

4、like用于模糊查询: select * from 表名 where 字段名 like '%值%' 包含

5、is null 和is not null 用来判断字段是否为空 select * from 表名 where 字段名 is null

讲解: 在where子句中使用关键字(and, or ,like, is null,is not null,between and,)

--查询工资在2000-3000之间的员工信息

select * from emp where sal>=2000 and sal<=3000--使用and关键字进行"与"的多条件筛选;

select * from emp where sal between 2000 and 3000;--使用between and 关键字进行筛选;

--查询工作为SALESMAN,ANALYST,MANAGER的员工信息

select * from emp where job='SALESMAN' or job='ANALYST' or job='MANAGER'--使用or关键字进行"或"的多条件筛选

select * from emp where job in('SALESMAN','ANALYST','MANAGER');--使用in关键字进行"或"的多条件筛选

select * from emp where job='ANALYST'

--查询姓名中包含s的,以s开头的,以s结尾的,第二个字符为A的。

select * from emp where ename like '%S%';--使用like关键字,姓名中包含S的,%代表任意多个字符

select * from emp where ename like 'S%';--使用like关键字,以S开头的

select * from emp where ename like '%S';--以S结尾的

select * from emp where ename like '_A%'--使用"_"指定位置包含指定字符的信息,"_"代表任意一个字符

--------------查询名字中包含下划线的用户信息

select * from emp where ename like '%A_%'escape 'A';--使用escape关键字将普通字符设置成为转译字符。

--查询有津贴的员工信息

select * from emp where comm is not null;

select * from emp where comm is null;--查询没有津贴的员工信息

第五节课:函数学习

--查询工作为SALESMAN,MANAGER并且工资大于2500的员工信息

--1、使用小括号提升where筛选条件的执行优先级别

--2、and的优先级别高于or

select * from emp

select * from emp where job='SALESMAN' or job='MANAGER' and sal>2500

select * from emp where (job='SALESMAN' or job='MANAGER') and sal>2500

-----------------------------------------------------------------------------------------------------------

使用函数 单行函数 多行函数 转换函数 其他函数

--单行函数学习:不改变原始数据,只改变结果

---1、字符函数

select * from emp;

select INITCAP(ename) from emp;--initcap函数将首字母大写

select lower(ename)from emp;--lower 字母小写

select replace(ename,'S','M') from emp;--replace 替换

--2、数值函数--Math

----伪表 dual

select * from dual

select abs(-3) 绝对值,ceil(3.1415926)向上取整,floor(3.1415926)向下取整,power(2,3)幂,round(3.4)四舍五入 from dual

--3、日期函数

select months_between('13-12月-2016','13-10月-2016') from dual--months_between两个日期之间的月份数

第六节课:多行函数学习

多行函数 :

max: max(字段名) 返回此字段的最大值

min:min(字段名) 返回此字段的最小值

avg:avg(字段名) 返回平均值

sum:sum(字段名) 返回字段的和

count:count

--count(*),用来查询表中有多少条记录

--count(字段名),用来查询某个字段有值的个数

--count(distinct 字段名),可以先去除重复再计数。

注意:

--多行函数不能和普通字段直接出现在查询语句中,除非group by

--多行函数和单行函数不能直接出现在查询语句中,除非group by

查看员工的最高工资

select max(sal),ename from emp--多行函数不能和普通字段直接出现在查询语句中,除非group by

select max(sal),lower(ename) from emp--多行函数和单行函数不能直接出现在查询语句中,除非group by

select ename from emp

查看员工的最低工资

select min(sal) from emp

查看员工的平均工资

select avg(sal) from emp

查看所有的员工工资之和

select sum(sal) from emp

查询公司有多少员工

select * from emp

select count(*) from emp--使用count(*)来查看一张表中有多少条记录

查询有津贴的员工人数

select count(comm) from emp--使用count(字段名),查询该字段有值的记录数

select count(ename) from emp

查询公司有多少工作种类

select count(job) from emp

select count(distinct job) from emp

========================================================================================================================================

第三天:

第一节课:转换函数学习

转换函数:在转换的时候改变的是数据的类型,数据内容不会改变,可以指定格式。

1、to_number:将数字字符转换为数字类型的数值,to_number(数字字符)

2、to_char:将数字转换为字符类型,将日期转换为字符类型 to_char(数字/日期)

3、to_date:将字符类型的日期转换为日期类型: to_date(char)

--------------------------------------------------------------------------------------

number-->char 转换的时候使用的是默认格式,

select to_char(123) from dual--将数字转换为字符类型,使用to_char(number)

select sal, to_char(sal) from emp

number-->char 使用指定的格式

to_char(number,'格式'),格式:

$代表美元符,9代码数字占位。例如,L999,999,999表示三位一组的显示方式L代表人民币符号,0代表保留数字个数,不足使用0补充。

select to_char(sal),to_char(sal,'L999,999,999') from emp

select to_char(sal),to_char(sal,'L0000.00') from emp

char--->number to_number(数字字符)

select to_number('123') from dual

char--->date,转换的字符必须是日期格式的字符串,默认格式 dd-mm-yyyy

注意:因为字符串有很多,所以在字符转换为日期的时候,需要指定格式,因为日期是具备一定格式的字符组合。

字符转换为日期的时候,指定的格式为字符的日期顺序,无需指定间隔符。

yyyy:表示年 mm:表示月 dd表示日

select to_date('05-12月-2016') from dual;

select to_date('2016-05-12','yyyy-mm-dd') from dual--使用指定的格式将指定的日期字符串转换为日期

select to_date('12-05-2016','mm/dd/yyyy') from dual

date--->char

注意:因为日期本身就具备一定的格式在不是指定格式的情况下会默认使用dd-mm-yyyy格式显示数据

指定的格式会作为日期转换为字符串类型的显示格式存在。例如:

yyyy-mm-dd' ‘2016-12-05’

yyyy/mm/dd' '2016/12/05'

yyyy"年"mm"月"dd"日"' 2016年12月05日

select hiredate,to_char(hiredate) from emp--日期转换为字符的时候,不指定格式使用默认格式:dd-mm-yyyy

select hiredate,to_char(hiredate,'yyyy-mm-dd') from emp;--使用指定格式将日期转换为字符串类型

select hiredate,to_char(hiredate,'yyyy/mm/dd') from emp;--使用指定格式将日期转换为字符串类型

select hiredate,to_char(hiredate,'yyyy"年"mm"月"dd"日"') from emp;--使用指定格式将日期转换为字符串类型

查询入职日期在81年10月20日后的员工信息

第一种:自动转型

select * from emp where hiredate>'20-10月-1981'

第二种:将日期转换为字符串

select * from emp where to_char(hiredate,'yyyy-mm-dd')>'1981-10-20'

第三种:

select * from emp where hiredate>to_date('1981-10-20','yyyy/mm/dd')

第二节课:其他函数:

单行函数:lower

多行函数:min max sum avg count

转换函数:to_number to_char to_date

-----------------------------------------------------------------------------------------

其他函数:

1、nvl():nvl(字段名,执行)--相当于java中的if条件判断

2、nvl2():nvl2(字段名,值,值)--相当于java中的If(){}else{}判断

3、decode():decode(字段名,条件1,执行内容1,条件2,执行内容2,条件3,执行内容3,默认执行内容)

相当于java中if(){}else if(){}else if(){}...else{}

查询所有员工的月薪及姓名和工作

select * from emp

select ename,sal 基本工资,comm 绩效,sal+comm 月薪 from emp

select ename,sal 基本工资,comm 绩效,sal+nvl(comm,0)月薪 from emp

查询所有员工的月薪及姓名和工作

select ename,sal 基本工资,comm 绩效,nvl2(comm,sal+comm,sal)月薪 from emp

显示员工的职称

select ename,job,decode(job,'MANAGER','经理','SALESMAN','销售人员','普通员工') from emp

第三节课:使用group by分组

在多行函数中不能直接使用普通字段,除非group by

在多行函数中不能直接使用单行函数,除非group by

group by学习:

---1、使用group by进行数据分组 select 多行函数,分组字段 from 表名 group by 分组字段

---2、多字段进行分组的时候,按照字段顺序进行分组,第一条件分组完成后,继续使用其他条件依次分组。

---3、group by依然可以和order by 联合使用

---4、可以和单行函数联合进行分组,注意使用了单行函数那么在查询语句中必须也要使用

查询最高工资和员工数

select max(sal),count(*) from emp

查询不同部门的最高工资

select * from emp order by deptno

select deptno,max(sal) from emp group by deptno--使用group进行分组查询,分组的字段可以出现在查询中,其他字段依然不可以

查询不同工作岗位的员工数

select * from emp for update

select lower(job),count(*) from emp group by lower(job)--使用单行函数进行分组

查询不同部门的不同工作岗位的人数

select deptno,job ,count(*) from emp group by deptno,job--使用多字段组合进行分组

select deptno,job ,count(*) from emp group by deptno,job order by deptno

查询不同部门的不同工作岗位的并且人数大于1的信息t count(*) from emp where count(*)>3 group by deptno

selec

select deptno,job ,count(*) from emp where count(*)>1 group by deptno,job order by deptno

查询部门号大于10的不同部门的不同工作岗位的人数

select deptno,job ,count(*) from emp where deptno>10 group by deptno,job order by deptno

使用having进行分组后筛选

having学习:

--1、使用group by分组后在进行数据筛选的时候,where中不能出现多行函数,所以使用新的关键字having进行条件筛选

--2、where条件筛选的执行顺序:from-->where--->group -->select

--3、having条件筛选的执行顺序:from-->group by -->having-->select

--4、where的执行效率比having要高,能使用where的情况下尽量不要使用having

查询不同部门的不同工作岗位的并且人数大于1的信息

使用where语句进行筛选

where条件语句sql执行顺序:from-->where--->group -->select

select count(*) from emp where count(*)>1 group by deptno,job

使用having语句进行筛选

having条件语句的执行顺序:from-->group by -->having-->select

select deptno, count(*) from emp group by deptno having count(*)>5

select deptno,job ,count(*) from emp group by deptno,job having deptno>10 order by deptno

第四节课:插入数据学习及数据的备份

单表查询语句(select)

1、插入数据(insert)

1、语法规范 insert into 表名(字段1,字段2,字段3,....)values('值1','值2','值3'.....)

2、主键:用来唯一标识一条数据的字段通常设置主键,主键是唯一不可以重复的

3、如果插入的数据是全字段数据,字段可以省略不写。部分字段,必须加上字段说明和字段值,但是主键不能为空

4、事务的提交:如果一个事件是由多个动作组成,只要有一个动作没有执行成功则自动将数据回滚到原始状态,此们技术称之为事务

保证数据的安全和完整

事物的提交:

使用第三放插件的提交按钮

使用commit语句

5、增加删除修改的数据sql语句执行完毕后,不会立马进入数据的写入

需要手动的对数据进行提交,如果数据有问题还可以回滚

select * from dept for update

在北京新建了一个名为LOL学院的新部门,请插入

insert into dept(deptno,dname,loc)values('50','lol学院','北京');

主键是唯一不可以重复的

insert into dept(deptno,dname,loc)values('50','教学部','北京');

如果插入的数据是全字段数据,字段可以省略不写。部分字段,必须加上字段说明和字段值,但是主键不能为空

insert into dept values('80','教学部','北京');

insert into dept values('90','教学部','北京');

insert into dept values(100','教学部','北京');

insert into dept values('110','教学部','北京');

2、创建数据的备份

(1)create table 表名 as 查询语句,创建的是和查询结果一样的表,查询结果是什么就会备份一个相同的表

(2)insert into 表名 查询语句,注意:查询出来的结果在结构上必须和插入数据的表相同,字段个数必须相同

(3)注意:备份表只有字段和数据相同,并不会备份约束。

1、备份完整的数据和表

select * from dept;

create table tdept as select * from dept;--备份dept表和数据,只能备份数据和字段

select * from tdept

2、备份完整表

create table tdept1 as select * from dept where 1>2--备份表,不备份数据。

3、备份部分数据和表.create table 表名 as 查询语句,创建的是和查询结果一样的表,查询结果是什么就会备份一个相同的表

create table tdept2 as select dname,loc from dept

select *from tdept2

4、给备份表添加数据 insert into 表名 查询语句,注意:查询出来的结果在结构上必须和插入数据的表相同,字段个数必须相同

select * from tdept1

insert into tdept1 select dname,loc from dept where deptno>40

select *from tdept2

insert into tdept2 select dname,loc from dept where deptno>40

第五节课:数据的更新和删除:

更新数据:update

语法结构:update 表名 set 字段名1='字段值1',字段名2='字段值2',...where 条件

将部门70的名字改为教学部2

update dept set dname='教学部2' where deptno='70'

update dept set dname='教学部2',loc='上海' where deptno='70'

select * from dept

删除数据:delete

1)删除语句:delete 表名 where 条件

--删除部门标号为70的数据

delete dept where deptno='70'---删除指定数据

select * from dept

delete tdept---清空表数据

truncate table tdept---清空表数据建议使用truncate关键字,但是此关键字不能回滚数据

===================================================================================================================================

需要完整文档以及sql文件的,关注公众号:Java架构师联盟,后台回复mysql获取更多资料

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343