mysql 入門 ubutu centos windows

一些查詢實例:

ubuntu 下mysql導入出.sql文件

同一個表相同id不同列比較
//having在組內比較,將會挑選組內物理位置排在前面的score 與 1比較

select *  form student group by id having score>1;


查詢有 3 門以上課程是 90 分以上的學生的學號及(90 分以上的)課程數
SELECT Sno, COUNT(*)
FROM SC
WHERE Grade>=90
GROUP BY Sno
HAVING COUNT(*)>=3 // 

student表的別名s1 和 s2,查找student中cname='a1'比cname='b1'大的id,顯示兩個表。
select * from student  s1 join student s2 where s1.id=s2.id and s1.cname='a1';
改進:顯示一行
select s1.id ,s1.name from student  s1 join student s2 where s1.id=s2.id and s1.cname='a1';

查找符合條件的每組成員超過2 的組,注意count(*),計算的是組內的記錄數
select id,count(*)from student group by id having count(*)>2; 

按學生科目總成績排名

 select id,SUM(score)from student group by id order by SUM(score)desc;

獲取倒數排列前10名的LogID

select top 10  LogID from API_LOG  ORDER BY LogID DESC


左連接兩個表合併查詢一個值,返回記錄

select 
m.id,m.username,

d.userType,d.vehPlate m.last_login_time

from usr m  left join user_detail d 
on m.id=d.id where m.username='123456'

比較強大的實例鏈接

http://blog.csdn.net/muxiaoshan/article/details/7617533

經典:有三個字段可以接查詢條件,以速度由快到慢依次爲 on where having

on用於連接表,where用於約束查詢條件,having在查詢結果中篩選需要的信息

作爲left jion 不管右邊表是不是有對應的記錄,一定顯示左邊的記錄。

要求你將 連接表的條件 m.id=d.id放在on的後面,

如果放在where後面left和right將會失效


idName 中含有 “羅” 字的所有記錄

select * from table where table.idName LIKE '%羅%'


複製表:

select * into 目標表名 from 源表名

將表中的數據插入另一個表
insert into 目標表名(fld1, fld2) select fld1, 5 from 源表名

mysql與sqlserver的區別

取4-6條記錄

sqlserver:select top 3 * from users where userID not in(select top 3 userID from users)
mysql:select * from users limit 3,3

重複記錄

查:

select name from tablename group by name having count(1)>1 //如果相同name的值相同的有兩個大於1 ,則 name 打印出來 ,由於group by的顯示所以只能打印name

應用

//having 來篩選groupby的每個單元,查找選2門或者3課的學生名字(將study和student表聯合起來查)

select studentName 
from student t left join study y on t.studentId = y.studentId 
group by studentName 
HAVING count(1)>1 and count(1)<4 

//用 in 消除group by 必須包含select中所有選項的限制(當然語法上不能,呵呵)

select * from student where studentId  
in 
(select studentId  from  study group by studentId having count(1)=3 ) 




select * from  tablename  where name in (select name from tablename group by name having count(1)>1) //打印出包括name 的完整記錄,不過數據大的時候很慢


select  * from tablename a where (     (select count(*)tablename where Title = a.Title)    > 1  )   ORDER BY Title DESC // 取表名中,title 相同的記錄

select time,max(total) as total,name from timeand group by time //用time分組,time相同的時候取 total最大的記錄

select station_name,count(distinct station_name) from tb_spider_station   group by station_name;//顯示所有記錄,重複的只顯示一條。但是不呢個select*

select row_number()over(order by StationName) as id,*  from tb_station //sqlserver 在select中增加自增id,用於區分完全相同的記錄

row_number()over(order by OccTime)as id 做爲一個字段,成爲自增的ID

查出所有重複的記錄

SELECT * FROM tb_spider_station_copy a
WHERE ((SELECT COUNT(*)
FROM tb_spider_station_copy
WHERE station_name = a.station_name and station_stake = a.station_stake) > 1)
ORDER BY a.standard_road_id DESC


過濾

Select * From t Tablename Where ID In (Select Max(ID) From Tablename Group By Title)  // 相同title 取id最大的


刪:


改:


新增加自增列 id

alter table tb_spider_station drop column id
alter table tb_spider_station add id int identity(1,1)  //自增從 1  開始 每次自增 1



ubuntu14

安裝mysql

sudo apt-get install mysql-server mysql-client 

啓動關閉mysql服務:sudo service mysql start/stop/restart


登陸
mysql -uroot -p123456(沒有木馬不用加-p和它後面的)


登陸後變爲:
mysql>    //命令寫完後,就用“;”結尾,然後回車。直接回車會出現下面的標示
mysql->  //一條命令沒有寫完,可以繼續寫

導入和到出sql

ubuntu 下mysql導入出.sql文件
1.導出整個數據庫
  mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名
  mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
  2.導出一個表
  mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名
  mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
  3.導出一個數據庫結構
  mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:\wcnc_db.sql
  -d 沒有數據 –add-drop-table 在每個create語句之前增加一個drop table
  4.導入數據庫
  常用source 命令
  進入mysql數據庫控制檯,
  如mysql -u root -p
  mysql>use 數據庫
  然後使用source命令,後面參數爲腳本文件(如這裏用到的.sql)
  mysql>source /home/pt/test.sql
或直接導入命令爲: mysql -h localhost -u root -p temp
#Ubuntu

導入和到出sql(centos出現中文無法顯示)

mysql 導入windows下的sql文件,數據庫中文亂碼。

1
設置mysql中文支持

找到mysql配置文件
find / -name *.cnf
cp  /顯示的目錄/my-large.cnf  /etc/my.cnf
vim /etc/my.cnf

在[clent] 和 [server]下都加一句
default-character-set=utf8
保存文件,重啓mysql ,手動插入中文數據,查看中文數據顯示正常

或者

查看mysql當前的編碼格式
show variables like '%set%'
show variables like '%col%'


2
導入文件後依然中文亂碼
原因:sql文件的編碼形式是gbk ,而不管數據庫是utf8的還是GBK的,導入文件必須是utf8編碼的。
貌似因爲系統環境是 utf8中文編碼的。
解決方案: vim 打開sql文件,將文件編碼變成utf8的
:set fileencoding=utf8
保存,查看當前編碼
:set fileencoding   
注意: “:set fileencoding”會顯示當前未保存的文件編碼格式。最好查看後再保存
然後登錄mysql
source test.sql
中文正常


注:mysql用utf8顯示數據會邊框什麼的,會比較正常


mysql用戶增加和密碼


mysql鏈接遠程主機

mysql -h主機地址 -u用戶名 -p用戶密碼

mysql修改用戶密碼

方法一:

mysqladmin -u用戶名 -p舊密碼 password 新密碼

mysqladmin的密碼沒有設置的話爲空


方法二:先關掉mysql 。net stop mysql

>use mysql
>update user set Password=password('新密碼') where User='root';
>flush privileges;

增加刪除用戶:用戶名test1 ,密碼 abc

grant select,insert,update,delete on *.* to test1@”%” Identified by “abc”;     //對所有數據庫有權限,同時可以在網絡訪問,危險啊

grant select,insert,update,delete on mydb.* to test2@localhost identified by “abc”;    //只對數據庫mydb可用,且只能在localhosr本機可用

grant select,insert,update,delete on mydb.* to test2@localhost identified by “”;    //密碼設置爲空




sql語句分爲三類:
DDL 定義:create drop alter//針對抽象的字段,表,數據庫
DML 操作:insert delete update select//針對具體的數據
DCL 控制:grant revoke//創建用戶,限制用戶權限。




DDL 
show databases;//顯示所有數據庫
create/drop database test1 //數據庫刪除,其下的表也會完全刪除


use  test1 //選擇數據庫test1
//創建表:姓名,僱用日期,工資,


create table emp(enname varchar(10), hiredata date,sal dec
imal(10,2),deptno int(2));
show tables //顯示所有表
desc emp //查看錶定義:
show create table emp;//詳細查看錶定義:




drop database/table test //刪除數據庫/表




alter table emp modify ename varchar(20);//將表emp的ename屬性改爲 varchar(20)
alter table emp change ename ename2  varchar(10);//將表emp的ename屬性改爲 varchar(10),同時將字段(屬性)改名


alter table emp add age int(2)after [某屬性];//將表emp的增加屬性age,沒有after默認位最後
alter table emp drop age  ;//將表emp的屬性age刪除


alert table emp rename emp2//將表名改爲emp2 






DML 



insert into emp (ename,hiredate,sal,deptno) values('rt','2014-12-31','2000',1);
insert into emp values('123 567_91-3456789123','2014-22-58','9999.12345',1);//非法的日期將會默認爲全 0;
insert into emp (ename,sal)values('deptno',1);//只插入ename 和sal 的值,其餘位NULL

delete from emp where ename='rt'
delete  emp  //清空表中的數據

查:可以接where
select * from emp;
select ename sal from emp;
select distinct ename from emp;//去重顯示
select *  from emp order by hiredate desc,sal asc;//按hiredate降序顯示,hiredate相同的按工資升序排列。第一級的排序默認升序
select * from emp order  by sal limit 1,3;//按sal排列,從第二條記錄起,顯示前三個,limit在其他數據庫不一定能用
聚合
where和having的區別是:前者是聚合前過濾,後者是對結果過濾,所以儘可能用where
select deptno ,count(1) from emp group by deptno having count(1)>1;//顯示 deptno內總人數大於一的 deptno
select sum(sal),max(sal),min(sal) from emp;


表連接:內(找相同)、外(找不同)
select ename, deptname from emp ,dept where emp.deptno = dept.deptno;//找出每個人的deptname,默認只顯示而這完全匹配的數據
select ename, deptname from emp left join dept on emp.deptno = dept.deptno;//找出每個人的deptname,左連接,強制顯示emp中元素,即使沒有找到匹配


子查詢:
select * from emp where deptno in (select deptno from dept);
select emp.* from emp ,dept where emp.deptno=dept.deptno;//子查詢轉化爲,錶鏈接。
select * from emp ,dept where emp.deptno=dept.deptno;//子查詢轉化爲,錶鏈接,顯示兩個表所有內容



記錄聯合:union(去重) ,union all
將記錄了相同數據的不同表,數據彙總在一起顯示
select deptno from emp  union all select deptno from dept;//共打印12條記錄,emp9條,dept3條






update emp set hiredate='2012-12-12' where ename='rt';//2012-12-12是字符串所以要加'',數字不需要加''
update emp a ,dept b seta.sql=a.sql*b.deptno , b.deptname=a.ename where a.deptno=b.deptname;//同時更新表emp 和 表 dept

連接:

left join  :顯示左表所有數據和右表匹配的數據

right join :、、、

inner join :只返回左右邊匹配的數據 和 where的功能相同但是where是隱式的連接而inner jion 是顯示連接。結果相同,where接連接條件,inner join接連接條件

full join :匹配和不匹配的數據都會返回

一般要使得數據庫查詢語句性能好點遵循一下原則:

1在做表與表的連接查詢時,大表在前,小表在

2 不使用表別名,通過字段前綴區分不同表中的字段

3查詢條件中的限制條件要寫在表連接條件前

4 儘量使用索引的字段做爲查詢條件


inner join 連接三個表:

SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段號=表2.字段號) INNER JOIN 表3 ON 表1.字段號=表3.字段號

或者不加()也行,多個小連接列名相同的時候,mysql會一次給列名編號

select * from table0 t0

inner join table1 t1 on t1.id = t0.id

inner join table2 t2 on  t2.name = t0.name

inner join table3 t3 on t3.other = t0.other

where t1.id=123 nad t2.name = '狗' and t3.other = 'xxx'



eclipse 與 mysql的連接,用java讀寫數據庫

package cn;
import java.sql.*;
//import java.io.*;

public class my
{ 
		public static void main(String args[]) 
	{ 
			try 
			{
				Class.forName("com.mysql.jdbc.Driver"); //加載MYSQL JDBC驅動程序 
				System.out.println("Success loading Mysql Driver!"); 
			} catch (Exception e)
			{ 
				System.out.print("Error loading Mysql Driver!"); 
				e.printStackTrace();
			} 
			
		try
		{ 
			Connection connect = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test","root",""); 
			System.out.println("Success connect Mysql server!");
		//返回
			 Statement stmt = connect.createStatement();
			ResultSet rs = stmt.executeQuery("select * from emp");//emp爲表的名稱  
			
	
			while (rs.next()) 
			{ 
				System.out.println(rs.getString("ename"));//ename是表t_auth的一個字段
			}
		//插入
			
			String sql="insert into emp (ename,hiredate,sal,deptno)  VALUES   (?,?,?,?) ";//共四列,四個字段
			PreparedStatement Statement=connect.prepareStatement(sql); 
		 
			//插入數據:1ename,	2hiredate, 3sal,   4 deptno
			Statement.setString(1,"c");//匹配char
			Statement.setString(2,"2014-04-13");//匹配date類型
			Statement.setDouble(3,12345.678);//匹配 decimal
			Statement.setInt(4,7);

			
			
			System.out.println("222");

			Statement.executeUpdate(); //
			System.out.println("333");
			} catch (Exception e)
			{ 
				System.out.print("get data error!"); e.printStackTrace(); 
			} 
		} 
}




Windows:

安裝最新版的mysql5.7 完整版:

名字:mysql-installer-community-5.7.3.0-m13.2063434697.msi

大小:237 MB 

安裝過程:服務名設置爲 mysql,我的用戶名和密碼都設置爲 root

完全安裝後:直接可以在 cmd中  用net start\stop mysql 來啓動關閉

配置外網鏈接

1 防火牆:打開3306端口(win7 防火牆--高級--入站規則--新建-----------)

2在mysql配置中: networking -- bind-address  這個值默認是*,我設置爲0.0.0.0    //重啓mysql

3 //爲root設置權限可以外網使用,第一個root是用戶,第二個root是密碼

  mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; 

//使授權生效

   mysql>flush privileges; 

4 第三步結束後,立竿見影,馬上能 從任何主機 以root訪問數據庫的所有數據庫

客戶端遠程使用mysql,可以用navicat for mysql 很不錯的工具,支持各種數據庫,適合需要連接各種不同的數據庫的人

其他:

授權:用戶從ip 192.168.1.3   用戶名爲myuser  密碼 mypasswd 連接mysql的數據庫 dk

GRANT ALL PRIVILEGES ON dk.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; 
FLUSH   PRIVILEGES; 
允許連接所有數據庫就將 dk改爲 * ,允許任何ip就將 ip改爲  % 



網上的其他配置方法中,很多已經過時,如下已經在mysql5.7完整版 中 配置好了,使用了以後會提示沒有任何功能或者記錄受到影響。

以下操作都是不需要的,但是可以用來理解mysql的機制

比如:mysql 5.7 默認root 的 host 是%,即可以從任何IP登陸

  1. %  允許從任何ip登錄  
  2. X.X.X.X  允許從指定的ip訪問  

  1. mysql>use mysql;  
  2. mysql>update user set host = '%' where user ='root';  
  3. mysql>select host, user from user;  //可以看到host設置情況
  4. mysql>flush privileges;  


mysql:

如果要清空表中的所有記錄,可以使用下面的兩種方法:
自增字段恢復爲 1(下面兩句,效果一樣,但是返回不同)
delete from tablename(返回刪除的記錄數目
truncate table tablename(返回 0 )

自增字段不恢復1 
delete from tablename where1 或者 where true(返回刪除的記錄數目

相比沒有where的delete情況,它掃描了每條記錄,速度要慢很多


刪除表users 名爲nike的記錄的前 6 條:
delete FROM users WHERE name = 'nike' ORDER BY id DESC LIMIT 6;


發佈了29 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章