1. 程式人生 > >MySQL(六)

MySQL(六)

for mstr 字符串函數 截取字符串 時間 HA 多少 文件中 發現

自關聯

  • 設計省信息的表結構provinces
    • id
    • ptitle
  • 設計市信息的表結構citys
    • id
    • ctitle
    • proid
  • citys表的proid表示城市所屬的省,對應著provinces表的id值
  • 問題:能不能將兩個表合成一張表呢?
  • 思考:觀察兩張表發現,citys表比provinces表多一個列proid,其它列的類型都是一樣的
  • 意義:存儲的都是地區信息,而且每種信息的數據量有限,沒必要增加一個新表,或者將來還要存儲區、鄉鎮信息,都增加新表的開銷太大
  • 答案:定義表areas,結構如下
    • id
    • atitle
    • pid
  • 因為省沒有所屬的省份,所以可以填寫為null
  • 城市所屬的省份pid,填寫省所對應的編號id
  • 這就是自關聯,表中的某一列,關聯了這個表中的另外一列,但是它們的業務邏輯含義是不一樣的,城市信息的pid引用的是省信息的id
  • 在這個表中,結構不變,可以添加區縣、鄉鎮街道、村社區等信息
  • 創建areas表的語句如下:
create table areas(
id int primary key,
atitle varchar(20),
pid int,
foreign key(pid) references areas(id)
);
  • 從sql文件中導入數據
source areas.sql;
  • 查詢一共有多少個省
  • 查詢省的名稱為“山西省”的所有城市
select city.* from
areas as city inner join areas as province on city.pid=province.id where province.atitle=山西省;
  • 查詢市的名稱為“廣州市”的所有區縣
    select dis.*,dis2.* from areas as dis
    inner join areas as city on city.id=dis.pid
    left join areas as dis2 on dis.id=dis2.pid
    where city.atitle=廣州市;

子查詢

  • 查詢支持嵌套使用
  • 查詢各學生的語文、數學、英語的成績
select sname,
(select sco.score from scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle=語文 and stuid=stu.id) as 語文,
(select sco.score from  scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle=數學 and stuid=stu.id) as 數學,
(select sco.score from  scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle=英語 and stuid=stu.id) as 英語
from students stu;

字符串函數

  • 查看字符的ascii碼值ascii(str),str是空串時返回0
select ascii(‘a‘);
  • 查看ascii碼值對應的字符char(數字)
select char(97);
  • 拼接字符串concat(str1,str2...)
select concat(12,34,‘ab‘);
  • 包含字符個數length(str)
select length(‘abc‘);
  • 截取字符串
    • left(str,len)返回字符串str的左端len個字符
    • right(str,len)返回字符串str的右端len個字符
    • substring(str,pos,len)返回字符串str的位置pos起len個字符
select substring(‘abc123‘,2,3);
  • 去除空格
    • ltrim(str)返回刪除了左空格的字符串str
    • rtrim(str)返回刪除了右空格的字符串str
    • trim([方向 remstr from str)返回從某側刪除remstr後的字符串str,方向詞包括both、leading、trailing,表示兩側、左、右
select trim(‘  bar   ‘);
select trim(leading ‘x‘ FROM ‘xxxbarxxx‘);
select trim(both ‘x‘ FROM ‘xxxbarxxx‘);
select trim(trailing ‘x‘ FROM ‘xxxbarxxx‘);
  • 返回由n個空格字符組成的一個字符串space(n)
select space(10);
  • 替換字符串replace(str,from_str,to_str)
select replace(‘abc123‘,‘123‘,‘def‘);
  • 大小寫轉換,函數如下
    • lower(str)
    • upper(str)
select lower(‘aBcD‘);

數學函數

  • 求絕對值abs(n)
select abs(-32);
  • 求m除以n的余數mod(m,n),同運算符%
select mod(10,3);
select 10%3;
  • 地板floor(n),表示不大於n的最大整數
select floor(2.3);
  • 天花板ceiling(n),表示不小於n的最大整數
select ceiling(2.3);
  • 求四舍五入值round(n,d),n表示原數,d表示小數位置,默認為0
select round(1.6);
  • 求x的y次冪pow(x,y)
select pow(2,3);
  • 獲取圓周率PI()
select PI();
  • 隨機數rand(),值為0-1.0的浮點數
select rand();
  • 還有其它很多三角函數,使用時可以查詢文檔

日期時間函數

  • 獲取子值,語法如下
    • year(date)返回date的年份(範圍在1000到9999)
    • month(date)返回date中的月份數值
    • day(date)返回date中的日期數值
    • hour(time)返回time的小時數(範圍是0到23)
    • minute(time)返回time的分鐘數(範圍是0到59)
    • second(time)返回time的秒數(範圍是0到59)
select year(‘2016-12-21‘);
  • 日期計算,使用+-運算符,數字後面的關鍵字為year、month、day、hour、minute、second
select ‘2016-12-21‘+interval 1 day;
  • 日期格式化date_format(date,format),format參數可用的值如下

    • 獲取年%Y,返回4位的整數

      * 獲取年%y,返回2位的整數

      * 獲取月%m,值為1-12的整數

    • 獲取日%d,返回整數

      * 獲取時%H,值為0-23的整數

      * 獲取時%h,值為1-12的整數

      * 獲取分%i,值為0-59的整數

      * 獲取秒%s,值為0-59的整數

select date_format(‘2016-12-21‘,‘%Y %m %d‘);
  • 當前日期current_date()
select current_date();
  • 當前時間current_time()
select current_time();
  • 當前日期時間now()
select now();

MySQL(六)