sql语句(MySQL)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cheng_cuo_tuo/article/details/85729797

基础
启动 mysql -hlocalhost -u用户名 -p密码
查看已创建数据库:show databases;
使用已创建的数据库:use database_name;
创建数据库:create database database_name;
删除已经创建的数据库: drop database database_name;

用得少,容易忘
修改表名:alter table table_oldName rename table_newName;
给表添加属性列:alter table table_name add column column_name constraint_info;
删除表中的一条属性列:alter table table_name drop column column_name;
修改表的属性列的数据类型:alter table table_name modify column_name new_type;
修改表的列名:
alter table table_name change column column_old_name column_new_name type;
修改表添加外键:
alter table table1_name add constraint fk_name foreign key (column1) references table2_name(column2);
查看所有的主键和外键:select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE;
删除表中的外键:alter table table_name drop foreign key foreignkey_name;

使用update进行修改的时候,不能使用and连接多个修改命令,会报错。

添加自增列:id int not null auto_increment;配合修改列属性使用就好了
但是在删除数据之后,再添加数据,它的自增长就会混乱,所以对于由自增列的表,在删除数据之后要加上ALTER TABLE table_name AUTO_INCREMENT = 1;
删除表中的数据: delete from table_name [where conditon]
删除表数据及表的结构:drop table_name

mysql的dos界面的默认结束符号是分号 ;
但是当在dos界面创建触发器等其他语句的时候也会使用到分号 ;
这样mysql根本就无法完整的完成指令,这时候就需要修改结束符,在网上找到的经验得,大多数使用两个美元符$$
修改命令如下:delimiter &&
(中间有一个空格)

查看已创建的触发器:show triggers;
删除已经创建的触发器:drop trigger trigget_name;
1.查看数据库编码格式
1 mysql> show variables like ‘character_set_database’;
2.查看数据表的编码格式
1 mysql> show create table <表名>;
3.创建数据库时指定数据库的字符集
mysql>create database <数据库名> character set utf8;
4.创建数据表时指定数据表的编码格式
create table tb_books (
name varchar(45) not null,
price double not null,
bookCount int not null,
author varchar(45) not null ) default charset = utf8;
5.修改数据库的编码格式
mysql>alter database <数据库名> character set utf8;
6.修改数据表格编码格式
mysql>alter table <表名> character set utf8;
7.修改字段编码格式
mysql>alter table <表名> change <字段名> <字段名> <类型> character set utf8;

mysql>alter table user change username username varchar(20) character set utf8 not null;

Mysql不支持用子查询更新一列,可以将需要更新的内容存入一张新的表中(数据一定要有和被修改表相同顺序),然后从这张新的表中获取数据,更新要被修改的表。
当从一张表中导出某一属性列的时候,数据会按照新的排序方式输出。为了保持原来数据在表中的数据,应该吧原表中的id一起导出。

值得注意的地方
case函数对空值NULL的处理
case column
when condition then result
when condition then result
when condition then result
else result
end
使用上面的语法,每个condition都是column的一种状态,但是没有办法判断出null,即使condition内容是Null 或IS NULL 都不行,想要用column_name is null,也没法处理空值,因为此时判断的内容就变了。
使用下面的语法,每一行都有一个判断语句,使用 column_name is null 可以捕获空值。
case
when expression then result
when expression then result
when expression then result
else result
end
当然还可以使用函数处理空值,COALESCE()和mysql独有的IFNULL()

需要区别unique和index,创建和删除的语法都是不同的,并且查询速度,unique要比index快。就创建和删除的语法上给人的感觉,unique是在当前操作的表中,index是在库的一张专门放置索引的表中。
例如:
->ALTER TABLE T_Person ADD CONSTRAINT unic_name UNIQUE(FName);
->CREATE INDEX idx_person_age ON T_Person(FAge);
查询已创建的索引
->SHOW INDEX FROM T_Person;两个索引都会出现
删除
->ALTER TABLE T_Person DROP INDEX unic_name;
->DROP INDEX idx_person_age ON T_Person;

check()约束
有个坑,mysql虽然有check()约束,但是它是无效的,也就是说mysql提供了这个约束的名字,而没有实现它的内容,运行的时候,直接忽略它。
原因是,为了提高兼容性。
解决方法:

  1. 对于范围较小的,并且易于列举的,可以使用枚举类型enum()或集合set()
    例如:->CREATE TABLE T_Person(FId INT PRIMARY KEY, FName VARCHAR(20), FAge INT,
    FGendar enum(‘男’, ‘女’));
  2. 对于范围较大的,比如 > 0的,可以使用触发器(trigger)替代
    例如:
    ->CREATE TRIGGER TestAge_BeforeInsert BEFORE INSERT ON T_Person
    FOR EACH ROW
    BEGIN
    IF NEW.FAge < 0 THEN SET NEW.FAge = 0;
    END IF;

所有不包含在聚集函数中的列,必须声明在group by 中,此时聚集函数的操作范围也变成了每个分组。
in 后面跟着的是元素,不是一张表。
DRY(Don’t repeat yourself)
多个连接(内连接,外链接)并存,书写的时候没有先后顺序,注意在每个连接之间没有逗号。
#检索没有制作过采购单的人制作的销售单
SELECT * FROM t_salebill
WHERE FBillMakerId NOT IN
( SELECT FBillMakerId FROM T_PurchaseBill
WHERE FBillMakerId IS NOT NULL
#此句至关重要,因为,IN 和 NOT IN 说到底还是使用 OR 进行操作的
#一旦有NULL出现,因为TRUE OR NULL = NULL; FALSE OR NULL = NULL
#这将直接导致查找结果为NULL 未知状态,什么都查不出来
);

在命令行界面执行SQL脚本,source sql脚本的绝对路径

猜你喜欢

转载自blog.csdn.net/cheng_cuo_tuo/article/details/85729797
今日推荐