数据库操作
# 注意:[] 表示占位符,实际使用时没有# 创建数据库:数据库在RDBMS中必须是唯一的create database [database_name];# 删除数据库:删除时会删除存储在此数据库中的完整信息,包括表、函数、视图drop database [database_name];# 重命名数据库rename database [old_db_name] to [new_db_name];# 选择数据库use [database_name];
表操作
1、建表语句:
- table_name:表名
- column_name:列名
- data_type:列的数据类型
- column_constraint:列约束,如 NOT NULL(非空)、UNIQUE(不重复)等
```sql
创建表
create table [table_name] ( [column_name] [data_type] default value [column_constraint], … )
在创建数据表时判断是否存在,存在不创建,不存在则创建:
create table if not exist [table definition];
在建表时先删除存在的表
drop table if exists [tableName]; create table if not exists [table defintion];
2、修改表结构:```sql# 向表中添加列:after指定新增列的位置,如果不写则添加为最后列alter table [table_name]add [new_column] [data_type] [column_constraint] after [existing_column];# 修改现有列的某些属性:修改有数据的列时可能存在数据丢失的情况alter table [table_name]modify [column_definition]# 删除已存在的列:只能删除那些没有被任何其他数据库对象,如视图、触发器、存储过程等使用的列alter table [table_name]drop column [column_name], drop column [column_name1],...
3、删除表结构:
# 删除表结构:当要删除的表不存在时,会报错drop table [table_name,...];# 防止报错:drop table 语句永久删除表的数据和结构drop table [table_name] if exist;
4、删除表中的全部数据:
- delete 数据库系统会记录操作, 通过一些努力,可以回滚已删除的数据;使用
TRUNCATE TABLE语句时,除非在尚未提交的事务中使用它,否则无法回滚 - 要从外键约束引用的表中删除数据,不能使用
TRUNCATE TABLE语句。 在这种情况下,必须使用DELETE语句 - 如果表具有与之关联的触发器,则
TRUNCATE TABLE语句不会触发delete触发器 - 执行
TRUNCATE TABLE语句后,某些数据库系统会将自动增量列(或标识,序列等)的值重置为其起始值。DELETE语句不是这种情况 - 带有
WHERE子句的DELETE语句从表中删除部分数据,而TRUNCATE TABLE语句始终从表中删除所有数据
```sql低效方式:对于几百万行的达标,delete语句很慢
delete from [table_name];
高效方式:通过取消分配表分配的数据页来删除表中的所有行,不会记录日志,无法回滚
truncate table [table_name,table_name1,…];
5、表的重命名:```sql# 方式一:rename 关键字rename table [old_table_name]to [new_table_name];# 方式二:alteralter table [old_table_name]rename to [new_table_name];
6、表的复制:
# 将一个表的数据复制到另外一个表中:select ... into 与 insert ... into 不同select * into [new_table_name] from [old_table_name];
数据操作
1、插入数据:insert 语句
- 插入数据时,列名和值属于一一对应的关系
- 添加新行之前,数据库检查所有完整性约束,外键、主键等,如果违反了约束,会终止语句
insert into [table_name] (column1,...)values(column1_value,...),(column1_value,...),...;
2、从其他表复制数据:通过 select 子选择
insert into [table_name1] (column1,column2,...)selectcolumn1,column2,...from [table_name2]where [condition]
3、更新数据:update
- 在 update 子句中指出要更新的表
- 在 set 子句中指出要修改的列
- 在 where 子句中指出更新条件
update [table_name]setcolumn1=value1,column2=value2,...wherecondition;
4、update join:使用一个表和连接条件来更新另外一个表
# 创建两个表CREATE TABLE table1 (column1 INT,column2 INT,column3 VARCHAR (100));INSERT INTO table1 (column1, column2, column3)SELECT 1, 11, 'FIRST'UNION ALLSELECT 11,12, 'SECOND'UNION ALLSELECT 21, 13, 'THIRD'UNION ALLSELECT 31, 14, 'FOURTH';CREATE TABLE table2 (column1 INT,column2 INT,column3 VARCHAR (100));INSERT INTO table2 (column1, column2, column3)SELECT 1, 21, 'TWO-ONE'UNION ALLSELECT 11, 22, 'TWO-TWO'UNION ALLSELECT 21, 23, 'TWO-THREE'UNION ALLSELECT 31, 24, 'TWO-FOUR';# 查看表中数据mysql> SELECT * FROM table1;+---------+---------+---------+| column1 | column2 | column3 |+---------+---------+---------+| 1 | 11 | FIRST || 11 | 12 | SECOND || 21 | 13 | THIRD || 31 | 14 | FOURTH |+---------+---------+---------+mysql> SELECT * FROM table2;+---------+---------+-----------+| column1 | column2 | column3 |+---------+---------+-----------+| 1 | 21 | TWO-ONE || 11 | 22 | TWO-TWO || 21 | 23 | TWO-THREE || 31 | 24 | TWO-FOUR |+---------+---------+-----------+# 假定想要将table2中的column2列和column3列的 (11,21) 行的数据更新到 table1,可以使用 update joinupdate table1 t1left join table2 t2on t1.column1=t2.column2set t1.column2=t2.column2,t1.column3=t2.column3where t1.column1 in (21,31);# 执行结果mysql> select * from table1;+---------+---------+-----------+| column1 | column2 | column3 |+---------+---------+-----------+| 1 | 11 | FIRST || 11 | 12 | SECOND || 21 | 23 | TWO-THREE || 31 | 24 | TWO-FOUR |+---------+---------+-----------+
4、时间日期更新:
update table [table_name]set create_time='YYYY-MM-DD HH:MM:SS'where id = value
5、删除表中的数据:从表中删除一行或多行
- delete 后面没有 where 子句时,会删除表中的所有行记录
- delete 语句返回的值为已删除的行数
delete from [table_name]where [condition];
查询语句 select
select 语句用于查询表中的数据,可以用于选择行、选择列、分组数据、连接表以及执行简单计算等语法。
# 基本用法select column1,... from [table_name];# 查询表中的全部数据select * from [table_name];# 条件查询,添加 where 子句select * from [table_name]where [condition];# 对查询结果进行排序:order by column {ASC | DESC}# 排序子句位于where子句之后,ASC 表示升序(默认),DESC 表示降序# 支持多个排序列,即在第一排序条件列的基础上,对第一排序条件相等的元素按第二排序条件列进行排序select * from [table_name]where [condition]order by column1 ASC, column2 DESC;# 去除查询结果的重复项:distinct运算符# distinct后面跟着一列时,则数据库会使用该列来计算重复# distinct后面跟着多列时,会对这些列进行组合来进行计算重复# 注意事项:# 在SQL中,NULL是一个特别的值,用于标记缺少信息或信息不适应,# 该值无法与任何值进行比较(包括自身),对于NULL,distinct将所有的NULL值是视为相同,# 因此,distinct只会保留一个NULL值,切会删除其他的NULL值select distinct column1,... from [table_name]where [condition];# limit和offset用于返回行的一部分# row_count:确定将返回的行数# off_count:在开始返回之前跳过偏移行,可选,与limit连用时该语句先执行select * from [table_name]limit [row_count] offset [off_count];
select 语句的最全格式:
- all 和 distinct :去重选项,即是否对查询结果中完全相同的记录(所有字段数据都相同)进行去重
- all:不去重
- distinct:去重
- from :后接数据来源,支持从多个数据表中查询,结果为这些表的笛卡尔积
- where 子句:支持基于值、基于值的范围、基于条件复合的子句(where子句中无法使用表别名)
- 值:比较运算符(如 =,!=等)和相似(like)
- 值的范围:in、not in、between x and y
- 条件复合:or、and、not、&&、||、!
- group by 子句:分组语句,可以将查询结果依据字段来进行分组,支持多个字段,即在一次分组的基础上再次进行分组
- having 子句:对已经查询出来的结果进行筛选
- order by 行 {desc | asc}:对结果进行排序
- limit 与 offset:限制结果数量,支持两种写法
- limit [row_count] offset [off_count]
- limit [off_count],[limit_count]
select {ALL | distinct} * from [table_name]where [condition]group by [column]having [condition]order by [column]limit [row_count] offset [off_count]
SQL 中的时间日期格式:
- yyyy-mm-dd:日期
- hh:mm:ss:时间
SQL 具有三值逻辑,即 TRUE、FALSE、UNKNOWN(NULL)
- NULL 表示数据未知的值,用来表示缺少的数据
- NULL 与 任何值比较都不会导致 true 或者 false,NULL 甚至不等于自身,因此不能使用 xx=NULL 来判断某个值是否为 NULL
- 要判断表达式或列的值是否为 NULL,应该使用 is null 或者 is not null ```sql mysql> select null=null; +—————-+ | null=null | +—————-+ | NULL | +—————-+ 1 row in set (0.00 sec)
mysql> select 2=null; +————+ | 2=null | +————+ | NULL | +————+ 1 row in set (0.00 sec)
mysql> select false and null; +————————+ | false and null | +————————+ | 0 | +————————+ 1 row in set (0.00 sec)
mysql> select null is null; +———————+ | null is null | +———————+ | 1 | +———————+ 1 row in set (0.00 sec)
SQL 比较运算符:| 运算符 | 含义 | 运算符 | 含义 || --- | --- | --- | --- || = | 等于 | <> 或 != | 不等于 || < | 小于 | > | 大于 || <= | 小于或等于 | >= | 小于或等于 || and | 与运算 | or | 或运算 |- between low and high:值在 low 和 high 之间,即 [low , high]- not expression:用于反转布尔表达式的值- in (value1, value2, ...):值在后面表达式中- like pattern:模式匹配,支持通配符- %:百分号,匹配0个、1个或多个字符- _ :下划线,匹配单个字符- 当需要匹配 % 或 _ ,需要对其进行转义,默认转义字符反斜杠 \ ,需要自定义使用 escape 语句,示例:expression like pattern escape escape_characterSQL别名:用于在执行查询期间为表或列分配临时名称。 有两种类型的别名:表别名和列别名。<br />几乎所有关系数据库管理系统都支持列别名和表别名。AS 关键字,用于创建别名,可以省略 。<br /><a name="nPbG8"></a>#### 连接连接表的过程称为连接 Join,SQL 支持多种连接,如 内连接、左连接、右连接、全外连接等笛卡尔积:cross join,将 A 表的每一条记录与 B 表的每一条记录强行拼接在一起,就是笛卡尔积。假设 A 表有 m 条记录,B 表有 n 条记录,笛卡尔积就会产生 m*n 条记录```sqlselect * from [table_name1 as t1] cross join [table_name2 as t2];
内连接:inner join ,从数学的角度为求两个表的交集,从笛卡尔积的角度上看就是从笛卡尔积中跳出 on 子句条件成立的记录,常用的写法有如下几种:
# 写法一:通过on子句进行筛选,inner可以省略不写select * from [table_name1 as t1]inner join [table_name2 as t2]on t1.id=t2.id;# 写法二:通过where子句筛选(等值连接)select * from [table_name1 as t1]inner join [table_name2 as t2]where t1.id=t2.id;# 写法三:straight_joinselect * from [table_name1 as t1]straight_join [table_name2 as t2]on t1.id=t2.id;
左连接:left join,左连接的含义就是求两个表的交际后再加左表剩下的数据。从迪卡尔积的角度来说,就是先从笛卡尔积中挑出 on 子句条件成立的记录,然后加上左表剩余的记录
select * from [table_name1 as t1]left join [table_name2 as t2]on t1.id = t2.id;
右连接:right join,右连接的含义就是求两个表的交际后再加右表剩下的数据。从迪卡尔积的角度来说,就是先从笛卡尔积中挑出 on 子句条件成立的记录,然后加上右表剩余的记录
select * from [table_name1 as t1]right join [table_name2 as t2]on t1.id = t2.id;
外连接:outer join,外连接就是求两个集合的并集,从迪卡尔积的角度来说,就是先挑出 on 子句成立的记录,然后加上左表中剩余的记录,然后再加上右表中剩余的记录。MYSQL 不支持外连接,可以通过左连接和右连接的结果做 UNION 操作来实现
select * from [table_name1 as t1] left join [table_name2 as t2] on t1.id = t2.idunionselect * from [table_name1 as t1] right join [table_name2 as t2] on t1.id = t2.id
using 子句:MySQL 中连接 SQL 语句时,on 子句的语法为 t1.column1 = t2.column1,当模式设计对链表的列采用了相同的命名时,可以使用 using 来简化 on 语法,格式为 using(column1)
# on 子句写法select * from t1 join t2 on t1.id=t2.id;# using 写法select * from t1 join t2 using(id);
