MySQL常用语句

DDL

操作数据库 和 表

操作数据库
创建:create database 数据库名称;
* 删除:drop database 数据库名称;
* 修改:ALTER DATABASE 数据库名 CHARACTER SET 要修改的字符集名称
* 查询:show databases; – 查询所有数据库的名称
show create database 数据库名称; – 查询创建数据库语句

语法:

创建
				create table 表名(
						列名1 类型1,
						列名2 类型2,
						...
						列名n 类型n
					
					);
			create table student(
						sname varchar(20),
						age int,
						gender varchar(6)
					);

删除:drop table 表名;
			* 修改:
				1.	修改之添加列:给stu表添加classname列:
					ALTER TABLE stu ADD (classname varchar(100));
				2.	修改之修改列类型:修改stu表的gender列类型为CHAR(2):
					ALTER TABLE stu MODIFY gender CHAR(2);
				3.	修改之修改列名:修改stu表的gender列名为sex:
					ALTER TABLE stu change gender sex CHAR(2);
				4.	修改之删除列:删除stu表的classname列:
					ALTER TABLE stu DROP classname;
				5.	修改之修改表名称:修改stu表名称为student:
					ALTER TABLE stu RENAME TO student;

			
			* 查询:show tables; -- 查询该数据库下所有表名称
					desc 表名; -- 查询表结构
				* 注意:操作表之前,应该先选择一个数据库使用:use 数据库名称;

DML

操作表中的数据

		* 增:
			* 语法:
				* insert into 表名(列名1,列名2,...)	values(1,2,....);
					* 注意:如果表的所有列都添加值,则列名可以省略
			
			insert into stu(sname,age) values("lisi",23);
			insert into stu(sname,age,sex) values("zhangsan",23,'1');
			insert into stu values("ww",23,'2');
		* 删:
			* 语法:
				* delete from 表名 [where 条件];
				* truncate table 表名;-- 删除所有记录
					* 先删除表,再创建表。
				
				delete from stu	where sname = 'lisi'
			
		* 改:
			* 语法:
				* update 表名	set 列名1 =1 , 列名2 =2... [where 条件]
				
				update stu set sex = "1" where sname = "lisi";
				
				update 
					customer 
				set 
					money = 500000
				where 
					id = xxx;

DQL

查询

 语法:
			SELECT 
				selection_list /*要查询的列名称*/
			FROM 
				table_list /*要查询的表名称*/
			WHERE 
				condition /*行条件*/
			GROUP BY 
				grouping_columns /*对结果分组*/
			HAVING 
				condition /*分组后的行条件*/
			ORDER BY 
				sorting_columns /*对结果分组*/
			LIMIT 
				offset_start, row_count /*结果限定*/

		
		* 条件查询:where 子句
			=!=<>(不等于)<<=>>=;
			BETWEEN…AND;  在什么范围之间
			IN(set);
			IS NULL;为空
			IS NOT NULL 不为空
			AND; 并且
			OR;   或者
			NOT;非
			
模糊查询:like
			* 通配符
				* _:匹配单个任意字符



			比如: 我要查询姓名是3个任意字符组成的
			select  * from student sname like='___';
			例如:我要查询第二个字符是m的
			select * from student where sanme like '_m%';
			



			* %:匹配多个任意字符
			例如:我要查询名字中包含m的 select * from student where sname like '%m%';
			例如我要查询名字是a开头的 select * from student where sname like 'a%';
			例如我要查询名字是b结尾的 select * from student wher like '%b';

字段控制:
			* 修改字段的别名:AS (可以省略)
				* 给字段起别名:
				例如:   select sname as 姓名, sage 年龄 from student;
				*给运算字段起别名:
				 例如: select sname as 姓名, (工资+奖金) as 总收入 from student;

				* 给表起别名:给每一张表起一个别名。简化书写
`				例如: select stu.sname, stu.sage from student as stu;
			* 字段运算:
				* null参与的运算,结果都为null  
				比如 工资 是100  奖金是null  我们让这两个字段运算 那结果就为null
				* 一般会将null替换为0ifnull(字段名称,如果是null的替换值)  ifnull 是mysql的方言
				
				所有如果奖金字段为null 一般我们把奖金替换为0
				例如: select sname,(工资+ifnull(奖金,0)) as 总收入from student;
						
			* 去除重复记录   比如我查询工资是3000的 出现了多条工资为3000 的记录 那我只想展示一条3000的记录  所以可以用 distinct 去除重复记录
				* DISTINCT     

				例如: select distinct 工资  from student;

		排序: order by  默认升序排列  ASC 默认值                DESC 降序排列
		 按工资从小到大排
		select * from student order by 工资 asc;
		按工资从大到小排
		select * from student order by 工资 desc 
		如果出现多条工资一样的 那我们可以指定第二排序条件 
		select * from student order by 工资 desc,奖金desc;



聚合函数:
		* 聚合函数是用来做纵向运算的函数:
		 	COUNT():统计指定列不为NULL的记录行数; 统计个数的 比如我统计有多少个学生
			select count(sid) from student;  或者传个星 号    select count(*) from student;         一般不要传有null 值的字段

		 	MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
 			例如 查询工资最大值    select max(工资) as 最高工资 from student;
			
		 	MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
			例如 查询 最少工资   select min(工资) as 最小工资 from student;
		 	SUM():计算指定列的数值和,如果指 定列类型不是数值类型,那么计算结果为0;
			 例如 计算总工资  select sun(工资) as 总支出 from student;

		 	AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
			例如:计算平均 工资 select avg(工资) as 平均工资 from student;

分组查询:group by     一般配合聚合函数使用 查出的数据才有意义
		* 查询的字段:
			1.分组字段本身
			2.聚合函数
		比如我按部分编号分组  比如有三个部门 然后我求每个部门的平均工资  那展示出来的数据应该有三条
		例如: select 部门编号,AVG(工资) from student group by 部门编号;

		1.例如查询 每个部门的部门编号 已经每个部门工资大于1500的人数
		select 部门编号, count(*) from student where 工资>1500 group by 部门编号;
		注意这里的 where 是对分组前的条件限定 也就是说不满足条件的 不参与分组

			
		* where和having
			* where:在分组之前对条件进行限定。不满足条件,就不会参与分组
			* having:在分组之后,对结果集的筛选

		2.例如 我要查询 各个部门平均工资 大于2000 的部门

		select 部门编号,avg(工资) from student group by 部门编号 having avg(工资)>2000;

		3. 例如我要查询 各个部门  员工工资大于1500 的平均工资  并且平均工资 大于2000的部门

		 上面这句话怎么理解呢? 首先查询各个部门 那肯定要按部门编号分组 分组前的条件限定是 员工工资大于1500的才参与分组
		计算出平均工资  然后对结果再进行筛选 筛选出 平均工资 大于2000的部门
		
 		select 部门编号,avg(工资) from student group by 部门编号 where avg(工资)>1500 having  avg(工资)>2000;

分页查询:limit
		* limit 0,5 开始的记录索引, 每一页显示的条数     索引从0开始
			开始的记录索引  = 	(页码-1)*每一页显示的条数

		例如 我显示第一页  每页5条记录
		select * from student limit 0,5 ;  这是第一页 5 条记录
		select * from student limit 5,5 ; 这是第二页 5条记录
		select * from student limit 10,5 这是第三页 5条记录
		
		* oracle:rownum 分页方言
		* sqlserver:top 分页方言
truncate 清空表 ★
	格式:
		truncate 表名; 干掉表,重新创建一张空表
	和delete from 区别:
		delete属于DML语句  truncate属于DDL语句
		delete逐条删除	truncate干掉表,重新创建一张空表
		
auto_increment 自增
	要求:
		1.被修饰的字段类型支持自增. 一般int
		2.被修饰的字段必须是一个key 一般是primary key
	
	create table ai01(
		id varchar(10) auto_increment
	);-- 错误 Incorrect column specifier for column 'id'
	
	create table ai01(
		id int auto_increment
	);-- 错误 Incorrect table definition; there can be only one auto column and it must be defined as a key

约束

为了保证数据的有效性和完整性

mysql中常用的约束:
			主键约束(primary key)  
			唯一约束(unique) 
			非空约束(not null) 
			外键约束(foreign key)
			sex ENUM('男','女')  -- 把一个字段的数据类型设置为枚举类型 也可以起到一种约束的效果
主键约束:被修饰过的字段唯一非空
		注意:一张表只能有一个主键,这个主键可以包含多个字段
		方式1:建表的同时添加约束 格式: 字段名称 字段类型 primary key
		方式2:建表的同时在约束区域添加约束 
			所有的字段声明完成之后,就是约束区域了
			格式: primary key(字段1,字段2)
			
			create table pk01(
				id int,
				username varchar(20),
				primary key (id)
			);
			
			insert into pk01 values(1,'tom');-- 成功
			insert into pk01 values(1,'tom');-- 失败 Duplicate entry '1' for key 'PRIMARY'
			insert into pk01 values(null,'tom');-- 失败  Column 'id' cannot be null
			
			create table pk01(
				id int primary key,
				username varchar(20),
				primary key (id)
			);-- 错误的 一张表只能有一个主键
			
		方式3:建表之后,通过修改表结构添加约束
			create table pk02(
				id int,
				username varchar(20)
			);
			
			alter table pk02 add primary key(字段名1,字段名2..);
			alter table pk02 add primary key(id,username);
			
			insert into pk02 values(1,'tom');-- 成功
			insert into pk02 values(1,'tomcat');-- 成功
			insert into pk02 values(1,'tomcat');-- 失败


删除主键约束:分两种情况
			情况1: 这个字段,只有主键约束,分两步来删除主键约束
			  第一步:       alter table 表名 drop primary key;  -- 这样只删除了唯一,他还有个非空约束,所以得再删除非空约束
			  第二步:       alter table [表名] modify [列名] varchar(20) null; --修改字段名还为原来的字段 加上null即可
			情况2: 这个字段,是一个int类型字段,既有主键约束,又有自增长约束,那么得先删除自增长约束,在删除主键约束
			   第一步:删除自增长约束,其实就是修改自增长字段名和数据类型还为原来的字段名和类型
				alter table 表名 change 字段名 字段名 数据类型; --删除自增长约束
                                                   第二步:删除主键约束
				alter table 表名 drop primary key;
			   第三步:删除非空约束
			    ALTER TABLE test3 MODIFY sid INT NULL;  -- 就是修改字段值可以为null

外键

在开发中,关系中的一方称之为主表或者一表,关系中的多方称之为多表或者从表,
为了表示一对多的关系,一般会在多表的一方添加一个字段,字段名称自定义(建议:主表的名称_id)
字段类型一般和主表的主键的类型保持一致,我们称这个字段为外键

一对多:
	用户和订单	
	-- 创建用户表
	create  table user(
		id int primary key auto_increment,
		username varchar(20)
	);
	
	-- 创建订单表
	create  table orders(
		id int primary key auto_increment,
		totalprice double,
		user_id int   
	);
	
	为了保证数据的有效性和完整性,添加约束(外键约束).
		在多表的一方添加外键约束
			格式:
				alter table 多表名称 add foreign key(外键名称) references 一表名称(主键);
			例如:
				alter table orders add foreign key(user_id) references user(id);
	添加了外键约束之后有如下特点:1.主表中不能删除从表中已引用的数据
		2.从表中不能添加主表中不存在的数据
	开发中处理一对多:★
		在多表中添加一个外键,名称一般为主表的名称_id,字段类型一般和主表的主键的类型保持一致,
		为了保证数据的有效性和完整性,在多表的外键上添加外键约束即可.
	那如果添加了外键后我想删除主表中的数据 怎么办 ?
		方式1: 级联删除
			ALTER TABLE orders ADD FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE; 
	        	          	然后你就可以删除主表中的数据了
			当然你可以级联删除和级联更新 都加上 FOREIGN KEY (sid) REFERENCES stu(sid) ON DELETE CASCADE ON UPDATE CASCADE)
		方式2:先把带有外键的多表的数据删除,再删除一表中的数据


多对多
	例子:商品和订单
		-- 创建商品表
	create table product(
		id int primary key auto_increment,
		name varchar(20),
		price double
	);

	-- 创建中间表
	create table orderitem(
		oid int,
		pid int
	);
		
	-- 添加外键约束 
	alter table orderitem add foreign key(oid) references orders(id);
	alter table orderitem add foreign key(pid) references product(id);
	
	开发中处理多对多:★
		引入一张中间表,存放两张表的主键,一般会将这两个字段设置为联合主键,这样就可以将多对多的关系拆分
		成两个一对多了
		为了保证数据的有效性和完整性
			需要在中间表上添加两个外键约束即可.
内连接:★
	格式1:显式的内连接
		select a.*,b.* from a [inner] join b on ab的连接条件
	格式2:隐式的内连接
		select a.*,b.* from a,b where ab的连接条件
外连接:★
	左外连接:★
		select a.*,b.* from a left [outer] join b on 连接条件;  outer 可以不写
		意思:
			先展示join左边的(a)表的所有数据,根据条件关联查询 join右边的表(b),符合条件则展示出来,不符合以null值展示.
	右外连接:
		select a.*,b.* from b right [outer] join a on 连接条件;  outer 可以不写
		意思:
			先展示jion右边的表(a)表的所有数据,根据条件关联查询join左边的表(b),符合条件则展示出来,不符合以null值展示.
子查询:★
	一个查询依赖另一个查询.
	
1.查询用户的订单,没有订单的用户不显示
		隐式内连接:
			select user.*,orders.* from user ,orders where user.id=orders.user_id;
		显示内连接
			select user.*,orders.* from user join orders on user.id=orders.user_id;
	2.查询所有用户的订单详情
		左外连接: user在左
			select user.*,orders.* from user left join orders on user.id=orders.user_id;
	3.查询所有订单的用户详情
		右外连接:orders 在右
			select orders.*,user.* from user right join orders on user.id=orders.user_id;
			
			先查出 订单大于三百的 订单  然后把可以作为一个临时表    select * from orders where price>300
			合二为一条  注意给临时表 起个别名 注意给表起别名 名字不要带引号
			 其实用的就是内链接 查两张表 注意把临时表用户括号括起来
			select user.*,tmp.* from user,(select * from orders where price>300) as tmp where user.id=tmp.user_id;
自连接查询---通过表的别名,给一张表起两个别名,将他视为两张表,来进行查询

 		 比如:我要查询emp表中 员工姓名 所对应的 老板姓名
	
 		 因为这些信息都在一张表 emp中 
  		比如 员工号7369 的 SMITH 他对应的老板编号是(MGR) 79027902 又是员工FORD(7902) 那FORD 对应的老板编号又是 7566
  		所以说 一个员工既是某几个员工的老板,他也有自己的老板
  		所以我要查询这个员工的所对应的老板 就可以使用自连接查询

		我们假设有两张表一张员工表,一张老板表,如果员工的老板号=老板的员工号 就表示这个员工是另外一个员工的老板
		 select e.ename as 员工姓名,b.ename as 老板姓名 from emp e,emp b where e.mgr=b.empno; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值