常用sql语句
查看数据库列表:show databases;
选中要使用的数据库:use 数据库名;
查看数据库中表信息:show tables;
查看表结构:desc 表名; 或者 show columns from 表名;
查看系统配置参数 SHOW VARIABLES LIKE '***'
1.创建table
1 DROP TABLE IF EXISTS student; 2 CREATE TABLE student 3 ( 4 `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 5 `name` VARCHAR(48) NOT NULL, 6 `age` BIGINT NULL DEFAULT 1, 7 PRIMARY KEY(`id` ,`age`) 8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.修改table
添加字段 1 ALTER TABLE student ADD `tearcherId` INT UNSIGNED NOT NULL;
修改字段 1 ALTER TABLE student MODIFY `tearcherId` INT UNSIGNED NULL;
删除字段 1 ALTER TABLE student DROP `tearcherId` ;
添加外键约束 1 ALTER TABLE `student` ADD CONSTRAINT `class_fk` FOREIGN KEY (`class_id`) REFERENCES class_info(`id`);
3.删除表
清空表内容 1 TRUNCATE TABLE student;
删除表 1 DROP TABLE student ;
4.数据操作
插入数据 1 INSERT INTO student (`name`,`age`) VALUES( 'zhangsan',25);
更新数据
1 UPDATE student SET company='电信' WHERE id IN (1,3,5);
删除数据 1 DELETE FROM student WHERE id =10 AND age>100;
查询数据 :在学生表中,按包含学生数量来划分公司并倒序排列,最后返回包含学生数目第二多的公司名称机器包含的学生数量
1 SELECT COUNT(*) AS count, company FROM student GROUP BY company HAVING count>=2 ORDER BY count DESC LIMIT 1,1;
5.查询性能提升
通常查询语句中各关键字执行顺序为 select--from--where--group by--having--order by -- limit offert
a.小表优先能极大减少比对次数 效率更好。例子:a表1条记录 b表10000条记录 连接条件是a.id = b.id,
6.索引操作
6.1普通索引操作
普通索引创建: 1 CREATE INDEX company_index ON student(company(10));
注意,这里的长度10是索引长度。在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000。 对于CHAR和VARCHAR列,只用一列的一部分就可创建索引。创建索引时,使用col_name(length)语法,对前缀编制索引。前缀包括每列值的前length个字符。BLOB和TEXT列也可以编制索引,但是必须给出前缀长度。
普通索引添加: 1 ALTER table tableName ADD INDEX indexName(columnName)
普通索引删除: 1 DROP INDEX [indexName] ON mytable;
6.2唯一索引操作
唯一索引创建: 1 CREATE UNIQUE INDEX indexName ON mytable(username(length))
唯一索引添加:
1 ALTER table mytable ADD UNIQUE [indexName] (username(length))
6.3 主键索引和全文索引
操作与普通索引类似,区别就是关键字不同。INDEX, UNIQUE, PRIMARY KEy ,FULLTEXT
7.存储过程
创建:
1 CREATE PROCEDURE `get_studenet_by_age`(IN `age` int) 2 BEGIN 3 #Routine body goes here... 4 declare bottom_range INTEGER(12); 5 SET bottom_range=5; 6 SELECT stud.id,stud.`name` from student as stud WHERE stud.age>age-bottom_range; 7 END;
调用: 1 CALL get_studenet_by_age(22)
8.自定义函数
创建 :
1 CREATE DEFINER = `root`@`localhost` FUNCTION `NewProc`(`age` int) 2 RETURNS varchar(11) 3 begin 4 return 'SELECT stud.`name` from student as stud WHERE stud.age>age'; 5 end;
调用: 1 SELECT * FROM student WHERE `name`=get_name_by_age(20);
9.触发器:
包括INSERT DELETE UPDATE和定时触发器
创建语法如下:
create trigger 名称 after|before 事件 insert|update|delete on 表名 for each row
两个关键字: new, old 在触发器中,当触发事件发生时,
new : 代表新行, old: 代表旧行
insert 操作: 成功之后,其后会自动产生一行新的数据. 在触发器中通过new获取新行字段值
delete 操作, 其成功之后, 对旧行数据进行删除,在触发器中可以通过old获取旧行字段值
update操作: 其会对原有的旧行,更新为新行. 既有新行又有旧行
创建INSERT 触发器:
1 CREATE TRIGGER trigger_student_count_insert 2 AFTER INSERT 3 ON student FOR EACH ROW 4 UPDATE class_info SET student_count =student_count+1;
创建DELETE 触发器:
1 CREATE TRIGGER trigger_student_count_delete 2 AFTER DELETE 3 ON student FOR EACH ROW 4 UPDATE class_info SET student_count=student_count-1;
创建UPDATE触发器:
1 create trigger tg3 after update on tb_order for each row 2 begin 3 update tb_goods set inv = inv + old.num - new.num where id = old.pid; 4 end;
10.事件调度器
事件调度器有时也可称为临时触发器(temporal triggers),是基于特定时间周期触发来执行某些任务
创建
1 CREATE EVENT e_test 2 ON SCHEDULE EVERY 1 DAY 4 DO CALL get_studenet_by_age(25);
11.视图
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。修改view中的数据,同样会在table中生效
优点:视图能简化用户操作 2.视图使用户能以多种角度看待同一数据 3.视图能够对机密数据提供安全保护
缺点:不支持触发器
创建 : 1 CREATE VIEW V_VIEW1(ID, NAME, SEX, AGE,DEPARTMENT) AS SELECT ID, NAME, SEX, AGE,DEPARTMENT FROM learning.t_employee;
使用: 1 SELECT * FROM V_VIEW1